在清理一些冗长的XML时尝试一些古怪的东西,即以递归方式删除所有空节点.
为此,如果节点具有(a)无子节点,(b)仅空白内容,(c)仅"空"子节点,则认为节点为"空".也就是说,我认为以下是"空",因为所有叶子都是空的/仅空白节点:
<foo>
<bar>
<baz/>
</bar>
<quux> </quux>
</foo>
Run Code Online (Sandbox Code Playgroud)
我尝试<xsl:if test="child::node()">在我的模板中使用,但这似乎不起作用.完全有可能答案是"自己走树,傻",但看起来XSL应该能够做到这一点?
我期待
<foo>
<bar>
<baz/>
</bar>
<quux> </quux>
<quuux>Actual content</quuux>
</foo>
Run Code Online (Sandbox Code Playgroud)
回来吧
<foo>
<quuux>Actual content</quuux>
</foo>
Run Code Online (Sandbox Code Playgroud)
我想到了这个过滤器.
之所以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() = '']"/>
Run Code Online (Sandbox Code Playgroud)