如何检查XML节点是包含文本还是仅包含空节点?
示例:假设我们有以下XML:
<text>
<p> </p>
<p> </p>
</text>
Run Code Online (Sandbox Code Playgroud)
(注意p标签之间的空格)
在不同的XML中,我们有以下XML:
<text>
<p>Hello World!</p>
</text>
Run Code Online (Sandbox Code Playgroud)
我想测试传递第二个例子,但不是第一个,因为第二个例子包含文本,但第一个包含空节点.
有没有办法轻松实现这一目标?
(我使用的是XSLT 2.0.)
用途:
p[normalize-space()]
Run Code Online (Sandbox Code Playgroud)
这将选择p上下文(当前)节点的任何子节点,其字符串值不是空字符串或仅空白字符串.
我想normalize-space你做了什么,例如这将"通过":
<xsl:if test="normalize-space(/text/p) != ''">
...
</xsl:if>
Run Code Online (Sandbox Code Playgroud)
normalize-space 将修剪字符串中的所有前导和尾随空格,这将在第二个示例中留下文本,但删除第一个示例中的所有字符,允许您与空字符串进行比较''.
请注意,它还会将多个空格字符按顺序压缩为单个字符,因此例如hello<space><space><space>there会变为hello<space>there.
http://www.w3.org/TR/xpath/#function-normalize-space(XPath 1)
如果你把
<xsl:strip-space elements="*"/>
Run Code Online (Sandbox Code Playgroud)
在样式表的顶部,解析器将忽略输入文档中完全由空格组成的文本节点。除此之外,这意味着p带有空格的示例元素将被视为完全空的元素。例如,模板匹配text[p/text()]将匹配text第二个示例中的元素,但不匹配子元素p全部为空(或仅包含空格)的元素。