私の質問は、 Two Phase Processingに関する別のポスターの StackOverflow の質問に関連しています。mode="#all" を完全に理解し、それが XSLT の残りの部分にどのように影響するかを完全に理解することなく、mode="#all" を使用したくありませんでした。以下のコードは、他のテンプレートに干渉する危険を冒すことなく同じことを達成すると考えていますが、確認が必要です。必要なく $completepolicy を 2 回処理しているようです。
空のタグ定義: <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>