XPath:如何根据它们的值select元素?

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

<RootNode> <FirstChild> <Element attribute1="abc" attribute2="xyz">Data</Element> <FirstChild> </RootNode> 

我可以validation<Element>标签的存在与:

  //元素[@ attribute1 =“abc”和@ attribute2 =“xyz”] 

现在我也想检查string"Data"的标签值。 为了达到这个目的,我被告知要使用:

  //元素[@ attribute1 =“abc”和@ attribute2 =“xyz”和Data] 

当我使用后面的expression式时,出现以下错误:

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

请向我提供您的build议,不pipe我使用的XPathexpression式是否有效。 如果不是什么将是有效的XPathexpression式?

以下条件:

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

检查元素内是否存在元素数据,而不是元素值数据。

相反,你可以使用

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

我之所以加这个答案是因为我想解释一下这个关系.text()

第一件事是当使用[] ,只有两种types的数据:

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

在这种情况下,通过函数boolean()将该值计算为布尔boolean() ,并且存在一条规则:

filter总是根据上下文进行评估。

当你需要比较text(). 与一个string"Data" ,它首先使用string()函数将它们转换为stringtypes,比得到一个布尔结果。

关于string()有两个重要的规则:

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

    text()是返回包含当前节点(上下文节点)的所有文本节点的节点集的相对path,如["Data"] 。 当用string(["Data"])进行求值时,它将返回节点集合的第一个节点,所以只有在节点集合中只有一个文本节点时才能得到“Data”。

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

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

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

这个:

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