应用具有不同模式的模板

时间:2017-02-20 13:51:15

标签: xml xslt xslt-2.0 mode

我想使用apply-templates处理节点,但使用不同的模式来匹配序列中所有节点的正确模板规则。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<story>
    <p class="h1">
        <content>heading</content>
        <br/>
    </p>
    <p>
        <content>some text</content>
        <br/>
        <content>more text...</content>
    </p>
</story>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:element name="div">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="p">
        <xsl:choose>
            <xsl:when test="@class='h1'">
                <xsl:element name="h1">
                    <!--apply-tempaltes mode:#default, for br mode:ignore-->
                    <xsl:apply-templates/>
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:element name="p">
                    <!--apply-tempaltes mode:#default-->
                    <xsl:apply-templates/>
                </xsl:element>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="content" mode="#default">
        <xsl:element name="span">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="br" mode="#default">
        <xsl:element name="br"/>
    </xsl:template>

    <xsl:template match="br" mode="ignore"/>

</xsl:stylesheet>

通缉输出:

<?xml version="1.0" encoding="UTF-8"?>
<story>
    <h1 class="h1"><span>heading</span>    
    </h1>
    <p><span>some text</span> 
        <br/>
        <span>more text...</span> 
    </p>
</story>

XSLT版本是2.0。我知道,还有其他方法可以实现此示例的所需输出,但我想使用mode-attributes。

1 个答案:

答案 0 :(得分:2)

AFAICT,你想做:

XSLT 2.0

<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:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()" mode="#all">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" mode="#current"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="p[@class='h1']">
    <h1 class="h1">
        <xsl:apply-templates mode="h1"/>
    </h1>
</xsl:template>

<xsl:template match="content" mode="#all">
    <span>
        <xsl:apply-templates mode="#current"/>
    </span>
</xsl:template>

<xsl:template match="br" mode="h1"/>

</xsl:stylesheet>