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对于该节点的评估结果为true,则该节点包含在新的节点集中;否则,不包括在内。
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
元件。
//*[contains(text(),'ABC')]
仅返回该<Street>
元素。它不返回<Street>
或的任何祖先<Comment>
。