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的数据: 
-   *[number]从节点集中select一个节点
-   *[bool]从节点集过滤节点集
 在这种情况下,通过函数boolean()将该值计算为布尔boolean() ,并且存在一条规则: 
filter总是根据上下文进行评估。
 当你需要比较text()或. 与一个string"Data" ,它首先使用string()函数将它们转换为stringtypes,比得到一个布尔结果。 
 关于string()有两个重要的规则: 
- 
string()函数通过返回节点集中第一个节点的string值将节点集转换为string,这在某些情况下可能会产生意想不到的结果。text()是返回包含当前节点(上下文节点)的所有文本节点的节点集的相对path,如["Data"]。 当用string(["Data"])进行求值时,它将返回节点集合的第一个节点,所以只有在节点集合中只有一个文本节点时才能得到“Data”。
- 
如果您希望 string()函数连接所有子文本,则必须传递单个节点而不是节点集。例如,我们得到一个节点集 ['a', 'b'],你可以将父节点传递给string(parent)节点string(parent),这将返回'ab',并且导致string(.)在你的情况下会返回串联的string"Data"。
只有存在文本节点时,两种方式才会得到相同的结果。
这个:
 //Element[@attribute1="abc" and @attribute2="xyz" ]