如何检查XML节点是包含文本还是仅包含空节点?
示例:假设我们有以下XML:
<text>
<p> </p>
<p> </p>
</text>
(注意p标签之间的空格)
在不同的XML中,我们有以下XML:
<text>
<p>Hello World!</p>
</text>
我希望测试在第二个示例中传递,但不在第一个示例中,因为第二个示例包含文本,但第一个示例包含空节点。
有没有办法轻松实现这个目标?
(我使用XSLT 2.0。)
答案 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
个子元素都为空(或仅包含空格)的模板。