重构顶级转换

时间:2014-06-03 17:23:50

标签: xml xslt xslt-1.0

我有一个样式表,其中包含许多与某些元素匹配的模板,包括身份模板:

<xsl:stylesheet>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="someElement/*>
    ...
    </xsl:template>
    <!-- a bunch of other matching templates -->
</xsl:stylesheet>

出现了一项新要求,即如果输入文档中的某个元素具有特定值,则应简单地跳过大部分转换。

当然我不能简单地这样做:

<xsl:stylesheet>
    <xsl:choose>
        <xsl:when test="/someElement/somethingElse &lt; 0">
            <xsl:template match="@*|node()">
                <xsl:copy>
                    <xsl:apply-templates select="@*|node()" />
                </xsl:copy>
            </xsl:template>

            <xsl:template match="someElement/*>
            ...
            </xsl:template>
            <!-- a bunch of other matching templates -->
        </xsl:when>
        <xsl:otherwise>
            <!-- do very simple transform -->
        </xsl:otherwise>
    <xsl:choose>
</xsl:stylesheet>

因为不允许template作为when的孩子。看起来处理这个问题的唯一方法可能就是用实际名称和参数重写所有模板,但是有很多,我想知道是否有更简单的方法。

1 个答案:

答案 0 :(得分:3)

<xsl:stylesheet>
    <xsl:template match="@*|node()" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*[/someElement/somethingElse &lt; 0]">
        <xsl:apply-templates select="." name="identity" />
    </xsl:template>

    <xsl:template match="/*">
        <!-- do very simple transform -->
    </xsl:template>

    <!-- a bunch of other matching templates, no change necessary -->
</xsl:stylesheet>

第二个模板具有更具体的匹配表达式,因此在满足条件时它将优先于第三个模板。

当然你可以反转匹配表达式并执行&#34;简单转换&#34;当(不)满足条件时,保持match="/*"&#34;默认&#34;。