如何检查XML节点是否包含文本

时间:2012-08-30 07:50:05

标签: xml xslt xslt-2.0

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

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

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

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

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

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

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

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

(我使用XSLT 2.0。)

3 个答案:

答案 0 :(得分:8)

使用

p[normalize-space()]

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

答案 1 :(得分:7)

我认为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)

答案 2 :(得分:1)

如果你把

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

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