1

インターネットで 2 時間かけてヘルプを探しましたが、答えが見つかりませんでした...

私はあなたができることを願っています:)

したがって、私のxsltファイルは次のとおりです(簡略化):

<?xml version="1.0" encoding="utf-8" ?>
   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:param name="basename"/>
    <xsl:param name="purpose"/>
    <xsl:param name="xml_input_path"/>
    <xsl:param name="self"/>

    <xsl:template match="testspec">
        <xsl:call-template name="call_commands"/>
    </xsl:template>

    <xsl:template name="call_commands">
        <xsl:variable name="root" select="document($xml_input_path)/testspec"/>
        <xsl:for-each select="$root//command">
            <xsl:sort select="."/>
            <xsl:variable name="current" select="."/>
            <xsl:apply-templates select="document($self)/xsl:stylesheet/xsl:template[@name = $current/@label]"/>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="TOTO_short">
        <xsl:text>Fonction TOTO :</xsl:text>
        <xsl:variable name="dda" select="'b'"/>
        <xsl:copy-of select="$dda"/>
    </xsl:template>

    <xsl:template name="TATA_interrupt">
                Fonction TATA :
        <xsl:variable name="v1_name" select="'NaN'"/>
        <xsl:value-of select="$v1_name" />
    </xsl:template>
</xsl:stylesheet>

ここに私の入力 Xml があります:

<testspec>
   <command label="TOTO_short"/>
   <command label="TATA_interrupt"/>
   <command label="TOTO_short"/>
   <command label="TATA_interrupt"/>
</testspec>

私の問題は次のとおりです。テンプレートTOTO_shortとTATA_shortで、2つの変数を定義してそれらの値を表示したいと思います...

しかし、うまくいきません!

それがどこから来たのかを理解するのを手伝ってもらえますか?

事前にどうもありがとう:)

アルノー

4

1 に答える 1

2

問題は、このややクレイジーな見た目のラインにあります

<xsl:apply-templates select="document($self)/xsl:stylesheet/xsl:template[@name = $current/@label]"/>

label現在の属性と同じ名前の名前付きテンプレートを呼び出そうとしているようです。ただし、名前付きテンプレートを呼び出すには、 xsl:call-templateを使用する必要があります。現在のxsl:apply-templatesで何かを見つけるには、次のようなテンプレートが必要です。

<xsl:template match="xsl:template[@name='TOTO_short']">
    <xsl:call-template name="TOTO_short" />
</xsl:template>

これは本当に物事を進める方法ではありません!名前付きテンプレートが機能しているように見えるのは、XSLT の組み込みテンプレートがここで使用されているためです。上記のように一致するテンプレートが見つからない場合、単純に要素のテキストを出力します。

このような複雑なアプローチの必要性は本当にわかりません。現在のxsl:for-eachの代わりに、次のように簡単に実行できます。

<xsl:apply-templates select="$root//command" />

そして、次のように、一致するテンプレートがあります。

<xsl:template match="command[@label='TOTO_short']">
    <xsl:text>Fonction TOTO :</xsl:text>
    <xsl:variable name="dda" select="'b'"/>
    <xsl:copy-of select="$dda"/>
</xsl:template>

このXSLTを試してください

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:param name="basename"/>
    <xsl:param name="purpose"/>
    <xsl:param name="xml_input_path" select="'C:\Users\Tim Case\Documents\Test.xml'" />
    <xsl:param name="self"/>

    <xsl:template match="testspec">
        <xsl:call-template name="call_commands"/>
    </xsl:template>

    <xsl:template name="call_commands">
        <xsl:variable name="root" select="document($xml_input_path)/testspec"/>
        <xsl:apply-templates select="$root//command" />
    </xsl:template>

    <xsl:template match="command[@label='TOTO_short']">
        <xsl:text>Fonction TOTO :</xsl:text>
        <xsl:variable name="dda" select="'b'"/>
        <xsl:copy-of select="$dda"/>
    </xsl:template>

    <xsl:template match="command[@label='TATA_interrupt']">
                Fonction TATA :
        <xsl:variable name="v1_name" select="'NaN'"/>
        <xsl:value-of select="$v1_name" />
    </xsl:template>
</xsl:stylesheet>

実際、ここで XML へのパスをパラメーターとして渡す理由がわかりません。実際、XSLT を次のように単純化できます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:param name="basename"/>
    <xsl:param name="purpose"/>

    <xsl:template match="testspec">
        <xsl:apply-templates select="command" />
    </xsl:template>

    <xsl:template match="command[@label='TOTO_short']">
        <xsl:text>Fonction TOTO :</xsl:text>
        <xsl:variable name="dda" select="'b'"/>
        <xsl:copy-of select="$dda"/>
    </xsl:template>

    <xsl:template match="command[@label='TATA_interrupt']">
                Fonction TATA :
        <xsl:variable name="v1_name" select="'NaN'"/>
        <xsl:value-of select="$v1_name" />
    </xsl:template>
</xsl:stylesheet>
于 2013-04-10T17:32:39.783 に答える