查找具有特定文本的所有元素

想象一下以下 XML:

<root>
    <element>hello</element>
    <another>
        hello
    </another>
    <example>Hello, <nested> I am an example </nested>.</example>
</root>

以下 XPath 表达式:

//*[text() = 'hello']

将返回 <element>hello</element> 元素,但不返回 <another> 元素。这是因为 <another> 元素包含 hello 文本周围的空格。

要检索 <element><another>,可以使用:

//*[normalize-space(text()) = 'hello']

要么

//*[normalize-space() = 'hello']

这将在进行比较之前修剪周围的空白。在这里我们可以看到 text() 节点说明符在使用 normalize-space 时是可选的。

要查找包含特定文本的元素,可以使用 contains 函数。以下表达式将返回 <example> 元素:

//example[contains(text(), 'Hello')]

如果要查找跨越多个子节点/文本节点的文本,则可以使用 . 而不是 text(). 指的是元素及其子元素的整个文本内容。

//example[. = 'Hello,  I am an example .']

要查看多个文本节点,你可以使用:

//example//text()

将返回:

  • “你好, ”
  • 我就是一个例子
  • “”

为了更清楚地看到元素的整个文本内容,可以使用 string 函数:

string(//example[1])

要不就

string(//example)

你好,我是一个例子。

后者的工作原理是,如果将节点集传递给像 string 这样的函数,XPath 1.0 只会查看该节点集中的第一个节点(按文档顺序),并忽略其余节点。

所以:

string(/root/*)

会回来:

你好