5

如何检查 XML 节点是否包含文本或仅包含空节点?

示例:假设我们有以下 XML:

<text>
   <p> </p>
   <p> </p>
</text>

(注意 p 标签之间的空格)

在不同的 XML 中,我们有以下 XML:

<text>
   <p>Hello World!</p>
</text>

我希望测试在第二个示例中通过,但在第一个示例中不通过,因为第二个示例包含文本,但第一个示例包含空节点。

有没有办法轻松实现这一目标?

(我使用 XSLT 2.0。)

4

3 回答 3

8

我认为normalize-space你想要什么,例如这将“通过”:

<xsl:if test="normalize-space(/text/p) != ''">
    ...
</xsl:if>

normalize-space 将从字符串中修剪所有前导和尾随空格,这将在您的第二个示例中留下文本,但删除第一个示例中的所有字符,以便您与空字符串进行比较''

请注意,它还将多个空白字符按顺序压缩为单个字符,例如hello<space><space><space>there将变为hello<space>there.

http://www.w3.org/TR/xpath/#function-normalize-space (XPath 1)

于 2012-08-30T08:02:49.607 回答
8

使用

p[normalize-space()]

这将选择p上下文(当前)节点的任何子节点,其字符串值不是空字符串或纯空格字符串。

于 2012-08-30T13:04:00.373 回答
1

如果你把

<xsl:strip-space elements="*"/>

在样式表的顶部,解析器将忽略输入文档中完全由空格组成的文本节点。除其他外,这意味着您的p带有空格的示例元素将被视为与完全空的元素相同。例如,模板匹配text[p/text()]将匹配text第二个示例中的元素,但不匹配其p子元素全部为空(或仅包含空格)的元素。

于 2012-08-30T08:20:43.023 回答