我的问题与另一张海报关于两阶段处理的 StackOverflow 问题有关。我不想在不完全理解 mode="#all" 以及它如何影响我的 XSLT 的其余部分的情况下使用它。我认为下面的代码完成了同样的事情,而不会冒着干扰其他模板的风险,但希望得到确认。有点像我处理 $completepolicy 两次而无需这样做。
空标签定义:<field/> <field></field>
. 标签可以具有属性,但永远不会有具有属性的空标签。也永远不会有<field> </field>
空白可以代表许多其他事物的节点。
鉴于此 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<!-- many other apply-templates here -->
<xsl:variable name="completepolicy" as="element()">
<holder>
<TABLE1 type="global">
<col1>Red</col1>
<col2/>
</TABLE1>
<TABLE2>
<field1>Blue</field1>
<field2/>
</TABLE2>
</holder>
</xsl:variable>
<xsl:apply-templates mode="emptytags" select="$completepolicy/*"/>
</xsl:template>
<xsl:template match="*[not(node())]" mode="emptytags"/>
<xsl:template match="node() | @*" mode="emptytags">
<xsl:copy>
<xsl:apply-templates select="node() | @*" mode="#current"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
$completepolicy 的输出结果:
<TABLE1 type="global">
<col1>Red</col1>
</TABLE1>
<TABLE2>
<field1>Blue</field1>
</TABLE2>