我是使用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]

检查元素中是否存在元素Data,而不是元素值Data。

你可以用

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]

其他回答

条件如下:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

检查元素中是否存在元素Data,而不是元素值Data。

你可以用

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]
//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"。

这两种方法都将导致相同的结果,但仅当存在文本节点时。