Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何引用XPath的点运算符的原始值?_Xml_Xpath - Fatal编程技术网

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())
的行为与我提供的答案不同。