删除变量中的空标记

时间:2012-11-29 20:36:17

标签: xslt xslt-2.0

我的问题与Two Phase Processing上另一张海报的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>

1 个答案:

答案 0 :(得分:0)

为什么您认为$completepolicy变量正在处理两次?这在提供的代码中无法看到。

我确认提供的代码对我来说很好。

我建议永远不要使用mode="#all"。这太强大而且危险 - 这几乎不需要。