XPath:如何根据值来选择元素?

vco*_*osk 211 xpath

我是使用XPath的新手,这可能是一个基本问题.请耐心帮助我解决问题.我有一个像这样的XML文件:

<RootNode>
  <FirstChild>
    <Element attribute1="abc" attribute2="xyz">Data</Element>
  <FirstChild>
</RootNode>
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式验证<Element>标签的存在:

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

现在我还想检查字符串的标签值"Data".为实现这一目标,我被告知要使用:

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

当我使用后面的表达式时,我收到以下错误:

断言失败消息:没有匹配的节点 //Element[@attribute1="abc" and @attribute2="xyz" and Data]

请向我提供您的建议,我使用的XPath表达式是否有效.如果没有,那么有效的XPath表达式是什么?

Ras*_*dit 317

条件如下:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]
Run Code Online (Sandbox Code Playgroud)

检查Element中元素Data的存在,而不是元素值Data.

相反,你可以使用

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]
Run Code Online (Sandbox Code Playgroud)


宏杰李*_*宏杰李 21

//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]
Run Code Online (Sandbox Code Playgroud)

为什么我添加此答案的原因是,我想解释的关系.text().

首先是使用时[],只有两种类型的数据:

  1. *[number] 从节点集中选择一个节点
  2. *[bool] 从节点集过滤节点集

在这种情况下,值按函数计算为boolean boolean(),并且有一条规则:

始终根据上下文评估过滤器.

当你需要比较text().使用字符串时"Data",它首先使用string()函数将它们转换为字符串类型,而不是获取布尔结果.

关于以下两条重要规则string():

  1. string()函数通过返回节点集中第一个节点的字符串值将节点集转换为字符串,这在某些情况下可能会产生意外结果.

    text()返回节点集的相对路径包含当前节点(上下文节点)的所有文本节点,如?"Data"?.当它被评估时string(["Data"]),它将返回node-set的第一个节点,因此只有当节点集中只有一个文本节点时才能获得"Data".

  2. 如果希望string()函数连接所有子文本,则必须传递单个节点而不是节点集.

    例如,我们得到一个节点集['a', 'b'],你可以传递父节点到string(parent),这将返回'ab',并且string(.)在你的情况下会返回一个连接的字符串"Data".

只有存在文本节点时,两种方式才会得到相同的结果.