XSL/XPath表达式,用于检查节点是否包含至少一个非空子节点

svz*_*svz 28 xml xslt xpath

我需要检查XML节点是否至少有一个非空子节点.应用于此XML表达式应该返回true

<xml>
    <node>
       <node1/>
       <node2/>
       <node3>value</node3>
    </node>
</xml>
Run Code Online (Sandbox Code Playgroud)

我试图使用这个表达式:<xsl:if test="not(/xml/node/child::* = '')">但似乎检查所有孩子是否都不是空的.

true如果至少有一个元素不为空,我该怎么写一个返回的表达式?有没有办法在不创建另一个模板来迭代节点chldren的情况下执行此操作?

UPD:我正在考虑计算非空节点,
test="count(not(/xml/node/child::* = '')) &gt; '0'"
但不知何故只是无法正常工作.这个表达不是一个良好的表达.

Dim*_*hev 33

更准确,更简单,更高效(无需使用该count()功能):

  /*/node/*[text()]
Run Code Online (Sandbox Code Playgroud)

如果要排除任何仅包含仅空白文本子元素的元素,请使用:

  /*/node/*[normalize-space()]
Run Code Online (Sandbox Code Playgroud)


Ian*_*rts 11

你只需要<xsl:if test="/xml/node/* != ''" />.

在XPath中=!=比较中,如果集合中的任何节点通过比较,则一侧是节点集,另一侧是字符串成功.从而

not(x = '')
Run Code Online (Sandbox Code Playgroud)

表示" x当前节点的任何子元素都不具有空字符串值",这与根本不同

x != ''
Run Code Online (Sandbox Code Playgroud)

这意味着" x当前节点的至少一个子元素具有非空的字符串值".特别是,如果要检查所有 x子项是否为空,则需要使用"双阴性"测试

not(x != '')
Run Code Online (Sandbox Code Playgroud)