不同节点的XPath OR运算符


144

如何使用XPath:

//bookstore/book/title or //bookstore/city/zipcode/title

只是//title行不通,因为我也有//bookstore/magazine/title

ps我看到了很多例子,但主要是属性或单节点结构。


5
OR包括双方。您正在寻找的是XOR运算符。您正在将单词OR的英语用法与逻辑运算符混为一谈。
Zoran Pavlovic 2012年

10
在这种情况下,它没有什么区别,你是否使用XOR,因为它是不可能的匹配两侧。
Dan Hulme 2013年

Answers:


219

所有titlezipcodebook节点为父节点的节点:

版本1:

//title[parent::zipcode|parent::book]

版本2:

//bookstore/book/title|//bookstore/city/zipcode/title

5
“ |” 在XPath中并不是真正的“或运算符”。它允许您构建由整个XML树的子树组成的节点集。“ // book | // cd”表示在所有子节点和根节点的后代中找到所有名为“ book”的子节点,然后还找到所有名为“ cd”的子节点。如果在根节点的后代中仅存在书籍节点,则您的节点集将仅包含书籍节点。如果在根节点的后代中只有cd节点,则您的节点集将仅包含cd节点。如果在根节点的后代中同时包含book和cd节点,则您的节点集将同时包含book和cd节点。
斯蒂芬

1
是的,我知道“ |”是什么 运算符是。我最初的问题是关于OR运算符。因此,如果有书籍和CD,它将仅找到书籍;如果没有书籍,但只有CD,则它将找到CD。
user569008 2011年

19
@ user569008:|联合集运算符

1
因此,我的问题没有答案/节点的XPath中没有OR运算符吗?
user569008 2011年

3
每种编程语言中的逻辑运算符(OR,XOR和AND)都是相同的,但是自然语言对它们的解释略有不同。讨论相关问题时最好消除歧义。此外,使用XPath最好不要认为你的结果作为a或b,而是它可以通过位于a或b。逻辑or表示可以通过定位它a or b or both逻辑xor(“异或”)表示可以使用进行定位either a or b, but not both。逻辑and表示可以通过定位它both a and b
neXus

52

如果只想使用联合运算符选择两个节点之一,则可以使用以下解决方案: (//bookstore/book/title | //bookstore/city/zipcode/title)[1]


真正的()[1]意味着只能选择两者之一?!?!
oldboy '18

@Anthony是的,如果两个节点都存在,它将选择两个之一,或者它将选择存在的唯一一个。
azurkin

好吧,我误解了你的说法。它的操作方式与其他“或”运算符相同,因此,如果第一个条件返回true,则第二个条件被绕过,是吗?
oldboy '18

@Anthony不。这里没有条件。有节点。和“ |” -是节点联合运算符。它从指定的路径创建节点集,并且不保证节点顺序。如果具有指定路径的节点不存在,则节点集中将丢失该节点。然后,“ [1]”构造从节点集中获取第一个节点。
azurkin '18年

我的观点是,它的功能类似于运算符or或其他语言的|运算符,因此,如果两个节点都存在,它将始终返回第一个节点?
oldboy '18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.