0

我的问题与另一张海报关于两阶段处理的 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>
4

1 回答 1

0

为什么你认为$completepolicy变量被处理了两次?这在提供的代码中看不到。

我确认提供的代码对我来说看起来不错。

我建议永远不要使用mode="#all". 这太强大和危险了——这几乎是不需要的。

于 2012-11-30T13:27:13.117 回答