0

XSLT から HTML に解析する必要がある次の XML ドキュメントがあります。

<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に対しては 1 つのテンプレートが実行され、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属性は、前のサンプルに示されているように、「属性値テンプレート」(中括弧内の xpath)selectによって入力することもできます。

于 2013-09-03T06:58:49.663 に答える