Xml 如何引用XPath的点运算符的原始值?
这是我的文件:Xml 如何引用XPath的点运算符的原始值?,xml,xpath,Xml,Xpath,这是我的文件: <library> <reserved> <book>Don Quixot</book> </reserved> <all> <book>Don Quixot</book> <book>War and Peace</book> </all> </library> 这不起作用,因为第二对方括号内的c
<library>
<reserved>
<book>Don Quixot</book>
</reserved>
<all>
<book>Don Quixot</book>
<book>War and Peace</book>
</all>
</library>
这不起作用,因为第二对方括号内的current()
已经在保留的元素的范围内。我应该用什么来代替current()
我正在尝试选择所有现在未预订的书籍:
/library/all/book[not(/library/reserved/book[.=current()])]
回答:
/library/all/book[not(text() = /library/reserved/book/text())]
我之前的回答并非在所有情况下都有效(见@MichaelKay的评论)
我的删除答案不起作用的原因是谓词试图在使用reserved/book/text()
选择的节点集中找到至少一个文本不等于当前文本()的节点。这与查找一本没有相同文本的保留书不同
我的新答案中的谓词将尝试查找具有相同文本的保留书籍,如果未能找到,则(not()
将否定false
结果并返回未保留的书籍)
有关进一步解释,请参见另一个问题的答案
从:
如果要比较的一个对象是节点集,而另一个对象是字符串,则当且仅当节点集中存在一个节点时,比较才会为真,从而对节点和另一个字符串的字符串值执行比较的结果为真
如果发现至少一个节点具有不同的文本,!=
操作符将尝试返回true
。如果至少一个节点具有相同的文本,=
操作符将尝试返回true
。如果节点集为空,两者都将返回false
。因此,解决方案是返回truee> 如果没有保留的书籍(空节点集),或者如果没有保留的书籍具有相同的文本,因此不是(text()=/library/reserved/book/text())
如果保证每个列表中没有两个
元素具有相同的文本内容,则这将起作用:
/library/all/book[text() != ../../reserved/book/text()]
我正在尝试选择所有现在未预订的书籍:
/library/all/book[not(/library/reserved/book[.=current()])]
回答:
/library/all/book[not(text() = /library/reserved/book/text())]
我之前的回答并非在所有情况下都有效(见@MichaelKay的评论)
我的删除答案不起作用的原因是谓词试图在使用reserved/book/text()
选择的节点集中找到至少一个文本不等于当前文本()的节点。这与查找一本不存在相同文本的保留书的书不同
我的新答案中的谓词将尝试查找具有相同文本的保留书籍,如果未能找到,则(not()
将否定false
结果并返回未保留的书籍)
有关进一步解释,请参见另一个问题的答案
从:
如果要比较的一个对象是节点集,而另一个对象是字符串,则当且仅当节点集中存在一个节点时,比较才会为真,从而对节点和另一个字符串的字符串值执行比较的结果为真
如果发现至少一个节点具有不同的文本,!=
操作符将尝试返回true
。如果至少一个节点具有相同的文本,=
操作符将尝试返回true
。如果节点集为空,两者都将返回false
。因此,解决方案是返回truee> 如果没有保留的书籍(空节点集),或者如果没有保留的书籍具有相同的文本,因此不是(text()=/library/reserved/book/text())
如果保证每个列表中没有两个
元素具有相同的文本内容,则这将起作用:
/library/all/book[text() != ../../reserved/book/text()]
这可能只是一个输入错误,但您的XML有不同的开始和结束标记。这可能只是一个输入错误,但您的XML有不同的开始和结束标记。如果有一本书的标题不同而保留,则会找到一本书。如果您在没有保留书的文件或tw上测试它,您可以看到这给出了错误的答案o保留的书籍。您想要/library/all/book[not(text()=../../../../reserved/book/text())]@MichaelKay您是对的。我正在检查,找不到关于为什么不(text()=../../../reserved/book/text())的解释
的行为与我提供的答案不同。错误。如果保留了一本具有不同标题的书,则会查找该书。如果在没有保留书或两本保留书的文件上进行测试,则会发现该答案错误。您想要/library/all/book[not(text()=../../reserved/book/text())]@MichaelKay你是对的。我正在检查,找不到解释为什么没有(text()=../../reserved/book/text())
的行为与我提供的答案不同。