XML 文档:
<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
</Addr>
</Home>
XPath 表达式:
//*[contains(text(), 'ABC')]
//*
匹配根节点的任何后代元素。也就是说,除根节点之外的任何元素。
[...]
是一个谓词,它过滤节点集。它返回的节点...
是true
:
谓词过滤节点集 [...] 以生成新的节点集。对于要过滤的节点集中的每个节点, PredicateExpr 被评估 [...];如果 PredicateExpr 对该节点的计算结果为真,则该节点包含在新节点集中;否则,不包括在内。
contains('haystack', 'needle')
true
如果haystack
包含 则返回needle
:
功能:布尔包含(字符串,字符串)
如果第一个参数字符串包含第二个参数字符串,则 contains 函数返回 true,否则返回 false。
但是contains()
将字符串作为其第一个参数。它通过了节点。为了处理作为第一个参数传递的每个节点或节点集被函数转换为字符串string()
:
参数被转换为字符串类型,就像调用字符串函数一样。
string()
第一个节点的string-value
函数返回:
通过返回节点集中在文档顺序中排在第一位的节点的字符串值,将节点集转换为字符串。如果节点集为空,则返回一个空字符串。
string-value
元素节点的:
元素节点的字符串值是该元素节点的所有文本节点后代的字符串值按文档顺序串联而成。
string-value
文本节点的:
文本节点的字符串值是字符数据。
因此,基本上string-value
是节点中包含的所有文本(所有后代文本节点的串联)。
text()
是匹配任何文本节点的节点测试:
节点测试 text() 对于任何文本节点都是 true。例如,child::text() 将选择上下文节点的文本节点子节点。
话虽如此,//*[contains(text(), 'ABC')]
匹配任何元素(除了根节点),其第一个文本节点包含ABC
. 由于text()
返回一个节点集,其中包含上下文节点的所有子文本节点(相对于计算表达式的节点)。但contains()
只取第一个。所以对于上面的文档,路径匹配Street
元素。
以下表达式//*[text()[contains(., 'ABC')]]
匹配具有至少一个子文本节点且包含ABC
. .
表示上下文节点。在这种情况下,它是除根节点之外的任何元素的子文本节点。所以对于上面的文档,路径匹配Street
, 和Comment
元素。
现在,匹配包含(在后代文本节点的串联中//*[contains(., 'ABC')]
)的任何元素(除了根节点)。ABC
对于上面的文档,它匹配Home
、Addr
、Street
和Comment
元素。因此,//*[contains(., 'BLAH ABC')]
匹配Home
、Addr
和Comment
元素。