【问题标题】:Using not() in XPath在 XPath 中使用 not()
【发布时间】:2010-08-05 19:33:40
【问题描述】:

我想知道如何正确使用 XPath 中的“not”。我似乎无法让它与属性一起使用。

假设我有这个表达式://*[@name = 'Bob'] 它是有效的,并且将返回名称属性等于“Bob”的所有节点。

现在,如果我希望所有节点的名称属性不等于“Bob”,我需要使用 XPath,例如://*[@name not(='Bob')],但这是无效的。

我尝试了多种组合,其中 not() 以不同的顺序放置,但我似乎无法让它发挥作用。有人可以告诉我如何正确使用 not() 吗?

另外,当使用元素而不是属性时,顺序会改变吗?如://name[text() = 'Bob']

谢谢! :)

【问题讨论】:

    标签: xpath


    【解决方案1】:

    根据:http://msdn.microsoft.com/en-us/library/ms256086.aspx,你试过了吗

    //*[@name != 'Bob']
    

    【讨论】:

    • @mathieu:我最好引用来自w3.org/TR/xpath/#booleans 的规范(不是MS文档)“如果要比较的一个对象是节点集,另一个是字符串,那么当且仅当节点集中有一个节点使得该节点的字符串值与另一个字符串的比较结果为真时,比较才会为真"
    • @mathieu:此方法适用于数值,但不适用于字符串值。 //*[@numerical != 1] 有效。 //*[@string != "someString"] 没有。只返回根元素!
    • @Alejandro:我做了,但它只适用于数值,而不是我上面提到的字符串值。使用字符串值,我得到的唯一结果是根节点。
    • @iHeartGreek:这行得通。其他顺序比较运算符(如 >)仅适用于数字(在 XPath 2.0 中,您可以使用与排序规则一起使用的 op:gt)。
    • @Alejandro:我不知道那会是什么问题......它在我的实现中不起作用。问题的可能根源是什么?
    【解决方案2】:

    试试

     //*[@name != 'Bob']
    

      //*[not(@name = 'Bob')]
    

    应该两者都可以。

    【讨论】:

    • 此方法适用于数值,但不适用于字符串值。 //*[@numerical != 1] 有效。 //*[@string != "someString"] 没有。只返回根元素!
    • 我很确定这适用于字符串。确定你没有犯错误,例如,错误的大小写?比较区分大小写。
    • 是的,我尝试了各种搜索。我只返回根节点。 :S
    • 请发布一个完整的示例,一个小的 XML 文件和您真正尝试的 XPATH,然后我们将进一步了解。
    • 我认为我的 XSL 代码存在问题,但只有在我使用 != 后才变得明显。我做了一些进一步的测试,发现搜索没有经过整个层次结构。我发布了一个新问题,因为我仍然无法解决它。 stackoverflow.com/questions/3451325/…
    【解决方案3】:
    //*[@name and @name != 'Bob']
    

    【讨论】:

    • 这不是给出所有元素是否有@name 吗?我需要它是一个带有@name 的元素,然后让它不等于'Bob'
    • 我认为 //*[@name != 'Bob'] 会起作用..正如其他人所建议的那样。但是此方法适用于数值,但不适用于字符串值。 //*[@numerical != 1] 有效。 //*[@string != "someString"] 没有。只返回根元素!
    • 抱歉,据我了解,您的解决方案确实有效。我认为我的 XSL 代码存在问题,但只有在我使用 != 后才变得明显。我做了一些进一步的测试,发现搜索没有经过整个层次结构。我发布了一个新问题,因为我仍然无法解决它。 stackoverflow.com/questions/3451325/…
    猜你喜欢
    • 2010-12-05
    • 2012-06-16
    • 2013-10-05
    • 2016-10-11
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    相关资源
    最近更新 更多