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

Hel*_*lge 4 xml xslt xslt-2.0

如何检查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.)

Dim*_*hev 8

用途:

p[normalize-space()]
Run Code Online (Sandbox Code Playgroud)

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


act*_*imp 7

我想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)


Ian*_*rts 1

如果你把

<xsl:strip-space elements="*"/>
Run Code Online (Sandbox Code Playgroud)

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