我是使用XPath的新手,这可能是一个基本的问题。请耐心等待,帮助我解决这个问题。我有一个这样的XML文件:
<RootNode>
<FirstChild>
<Element attribute1="abc" attribute2="xyz">Data</Element>
<FirstChild>
</RootNode>
我可以验证<Element>标签的存在:
//Element[@attribute1="abc" and @attribute2="xyz"]
现在我还想检查字符串“Data”标签的值。为了达到这个目的,我被告知使用:
//Element[@attribute1="abc" and @attribute2="xyz" and Data]
当我使用后面的表达式时,我得到以下错误:
断言失败消息:No Nodes Matched //Element[@attribute1="abc" and @attribute2="xyz" and Data]
请告诉我我使用的XPath表达式是否有效如果不是,有效的XPath表达式是什么?
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]
我加上这个答案的原因是我想解释的关系。和text()。
首先,在使用[]时,只有两种类型的数据:
[number]从节点集中选择一个节点
[bool]从节点集中过滤一个节点集
在这种情况下,函数boolean()将值计算为布尔值,并且有一个规则:
筛选器总是根据上下文进行计算。
当您需要比较text()或。对于字符串“Data”,它首先使用string()函数将其转换为字符串类型,然后它得到一个布尔结果。
关于string()有两个重要的规则:
The string() function converts a node-set to a string by returning the string value of the first node in the node-set, which in some instances may yield unexpected results.
text() is relative path that return a node-set contains all the text node of the current node (context node), like ["Data"].
When it is evaluated by string(["Data"]), it will return the first node of the node-set, so you just get "Data" when there only is one text node in the node-set.
If you want the string() function to concatenate the entire child text, you must pass a single node instead of a node-set.
例如,我们得到一个节点集['a', 'b'],你可以将它们的父节点传递给string(parent),这将返回'ab',而string(.)在你的情况下将返回一个连接的字符串"Data"。
这两种方法都将导致相同的结果,但仅当存在文本节点时。