0

我有以下 XML 文档,需要使用 XSLT 将其解析为 HTML。

<root>
    <c>
    <c1>
     <id>1</id>
     <text>US</text>
    </c1>
    <c1>
     <id>2</id>
     <text>UK</text>
    </c1>
    </c>
</root>

下面给出了用于将其转换为 HTML 的 XSLT。

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" />
    <xsl:template match="root">
        <html>        
                <xsl:for-each select="c/c1">     
                                **<xsl:variable name="vTemplate" select="text"/>                                  
                                <xsl:apply-templates select="$vTemplate[@name='text'"/>**
                </xsl:for-each>
        </html>
    </xsl:template>
    <xsl:template match="xsl:template[@name='text']" name="text">
        <select>
            <xsl:attribute name="id">
                <xsl:value-of select="id"/>
            </xsl:attribute>
        </select>
    </xsl:template>

</xsl:stylesheet>

我需要调用一个模板取决于文本字段。因此对于值US,将执行一个模板,对于UK,将执行另一个模板。如何在调用模板时使用变量作为模板名称来实现这一点?我刚试了一下,但它给出了错误。有人可以帮我弄清楚我在哪里做错了吗?

4

1 回答 1

2

我认为不可能选择要动态调用的模板名称。可以做的是xsl:choose利用(可能与mode属性结合),像这样

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.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="/root">
        <html>
            <xsl:for-each select="c/c1">
                <xsl:choose>
                    <xsl:when test="text = 'US'">
                        <xsl:apply-templates select="text" mode="US"/>
                    </xsl:when>
                    <xsl:when test="text = 'UK'">
                        <xsl:apply-templates select="text" mode="UK"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:comment>Something's wrong</xsl:comment>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>
        </html>
    </xsl:template>

    <xsl:template match="text" mode="US">
        <xsl:comment>US mode</xsl:comment>
        <select>
            <xsl:attribute name="id">
                <xsl:value-of select="preceding-sibling::id"/>
            </xsl:attribute>
        </select>
    </xsl:template>

    <xsl:template match="text" mode="UK">
        <xsl:comment>UK mode</xsl:comment>
        <select>
            <xsl:attribute name="id">
                <xsl:value-of select="preceding-sibling::id"/>
            </xsl:attribute>
        </select>
    </xsl:template>

</xsl:stylesheet>

或者您可以使用match适当的谓词并避免for-each这样

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.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="/root">
        <html>
            <xsl:apply-templates select="//c1" />
        </html>
    </xsl:template>

    <xsl:template match="c1[text = 'US']">
        <xsl:comment>US mode</xsl:comment>
        <select id="{id}" />
    </xsl:template>

    <xsl:template match="c1[text = 'UK']">
        <xsl:comment>UK mode</xsl:comment>
        <select id="{id}" />
    </xsl:template>

</xsl:stylesheet>

id属性select也可以由“属性值模板”(大括号中的 xpath)填充,如前面的示例所示。

于 2013-09-03T06:58:49.663 回答