在清理一些冗长的XML时尝试一些古怪的东西,即以递归方式删除所有空节点.
为此,如果节点具有(a)无子节点,(b)仅空白内容,(c)仅"空"子节点,则认为节点为"空".也就是说,我认为以下是"空",因为所有叶子都是空的/仅空白节点:
<foo>
  <bar>
    <baz/>
  </bar>
  <quux>  </quux>
</foo>
我尝试<xsl:if test="child::node()">在我的模板中使用,但这似乎不起作用.完全有可能答案是"自己走树,傻",但看起来XSL应该能够做到这一点?
我期待
<foo>
  <bar>
    <baz/>
  </bar>
  <quux>  </quux>
  <quuux>Actual content</quuux>
</foo>
回来吧
<foo>
  <quuux>Actual content</quuux>
</foo>
我想到了这个过滤器.
之所以child::node()不适合你,是因为你确实有子节点 - 它们是空白文本节点.相反,尝试类似的东西normalize-space() != ''.你可能不想要if那里 - 或者把它放进去match:
<xsl:template match="node() | @*">
  <xsl:copy>
    <xsl:apply-templates select="node() | @*"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="*[normalize-space() = '']"/>