29

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

<xml>
    <node>
       <node1/>
       <node2/>
       <node3>value</node3>
    </node>
</xml>

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

true如果至少一个元素不为空,我如何编写一个返回的表达式?有没有办法在不创建另一个模板来迭代节点 chldren 的情况下做到这一点?

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

4

4 回答 4

34

更准确、更简单、更高效(无需使用count()函数)

  /*/node/*[text()]

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

  /*/node/*[normalize-space()]
于 2012-12-04T13:22:37.153 回答
12

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

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

not(x = '')

意思是“x当前节点的任何子元素都不会有空字符串值”,这与

x != ''

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

not(x != '')
于 2012-12-04T13:21:35.657 回答
4

这是应该完成这项工作的一个 XPath:

count(/*/node/*[text()]) &gt; 0

在示例 XSLT 中使用时:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
     <xsl:value-of select="count(/*/node/*[text()]) &gt; 0" />
  </xsl:template>

</xsl:stylesheet>

...这反过来又应用于提供的示例 XML:

<xml>
  <node>
    <node1/>
    <node2/>
    <node3>value</node3>
  </node>
</xml>

...产生了预期的结果:

true

如果我们对一个简单修改的​​ XML 应用相同的 XSLT:

<xml>
  <node>
    <node1/>
    <node2/>
    <node3/>
  </node>
</xml>

...再次,产生了预期的结果:

false

解释:

使用的 XPath 搜索<node>具有非空文本值(由 指定)的元素的所有子元素(它们又是根元素的子元素text());如果此类子项的计数<node>大于 0,则 XPath 解析为true.

于 2012-12-04T13:11:08.647 回答
0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <xsl:value-of select="/*/node/*[string-length(text()) &gt;0]!=''"/>
    </xsl:template>
</xsl:stylesheet>

说明 这将找到字符串长度大于零的第一个节点,然后将此类节点内容与空字符串进行比较(比较将返回非空字符串节点的存在);此代码还可用于在任何节点中查找特定标准,例如识别是否存在包含特定字符串或以某个字符或任何其他条件开头的节点;请将此用作节点引用的内部条件,以使代码发挥其魔力。

于 2013-09-13T03:24:56.170 回答