2009-02-26 5 views
6

apply-templatesを使用してwith-paramを使用することは不可能です。例として、私はw3schoolsで与えられた例をハッキングしました。XSLでapply-templatesを使用するためのパラメータを取得できないのはなぜですか?

XSL

<xsl:template match="/"> 
    <xsl:apply-templates> 
    <xsl:with-param name="test" select="'has this parameter been passed?'"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="cd"> 
    <xsl:param name="test"></xsl:param> 
    parameter: 
    <xsl:value-of select="$test"></xsl:value-of> 
</xsl:template> 

XML

<catalog> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</catalog> 

(うまくいけば)あなたがテストパラメータは、CDのテンプレートに渡されていないことがわかります。私はcall-templateを使用するときには動作させることができますが、apply-templatesは使用できません。どうしたの?私はXSL 1.0を使用しています。ハードコーディングされたパラメータを渡しているという事実を無視してください。これは単なる例です。

答えて

5

うーん...面白いが... XslTransformを使用して私のために失敗し、 XslCompiledTransform in .NET - しかしそれはそれのように見える仕事...好奇心...

この問題は、のルートと一致しています。試してください

<xsl:template match="/catalog"> <!-- CHANGE HERE --> 
    <xsl:apply-templates> 
    <xsl:with-param name="test" select="'has this parameter been passed?'"/> 
    </xsl:apply-templates> 
</xsl:template> 

これは私のために他の変更なしで動作します。違いは、ルートノードに一致していることです。 "テンプレートを適用"したとき、最初にカタログに(パラメータ付き)、、次にをcd(パラメータなし)にカスケード接続しました。あなたが望むものを手に入れるためには、カタログで始める必要があります。試合に<xsl:vaue-of select="name()"/>を追加して確認し、「/」と「/ catalog」と試してみてください。

+0

はい - それは動作しますが、なぜ元のサンプルが動作しないのですか? – Goran

+0

ああ。しかし、なぜパラメータがcdに渡されないのでしょうか?ここには – darasd

+0

カタログがありますので、元の例が有効です。そして、それはlibXSLTとOperaで行います。 – vartec

2

は適用するテンプレートを指定してください:http://xmlsoft.org/XSLT/ からlibxsltは1.1.24と私のための

<xsl:template match="/"> 
    <xsl:apply-templates select="catalog/cd"> 
    <xsl:with-param name="test" select="'has this parameter been passed?'"/> 
    </xsl:apply-templates> 
</xsl:template> 
+0

のdidnそれをキャッチする - このソリューションを試してみてください。テンプレートのパスを指定しないと何かがうまくいかないようです。 – Goran

+0

はい、あなたは正しいです。 Howver、私は選択の//が悪い形であると信じています。さらに、この二重スラッシュは、パラメータを渡すことに敬意を表します。私の実際のコードでは、私は既にselectにノードを渡していましたが、パラメータはノードに接頭辞//を付けた後に渡されました。どうして? – darasd

+0

[OK]を - 今、それは変な振る舞いです - この質問には4つの回答がありませんあなたの編集が表示され、次にランダムに失われる... – Goran

0

作品:

$ xsltproc xml1.xsl xml1.xml 
<?xml version="1.0"?> 


    parameter: 
    has this parameter been passed? 

    parameter: 
    has this parameter been passed? 
+0

興味深い。私はMSXML 4.0を使用しています。しかし、それはFirefoxで見るとうまく動作しません。 – darasd

+0

ええ、Fxで失敗し、Opera 10で動作します。 – vartec

0

私は、cd要素がルートの下に一致しないという問題があることを確認します。ルートの下に、あなたは常にXSLで行くことができるカタログ要素ではないCD要素を持っているので、= 'カタログ'

2

に一致するようにテンプレートを変更します。call-テンプレート..例えば:

... 
<xsl:call-template name="foo"> 
    <xsl:with-param name="bars" select="42"/> 
</xsl:call-template> 
... 

<xsl:template name="foo"> 
    <xsl:param name="bars"/> 
    <xsl:value-of select="$node"/> 
</xsl:template> 
関連する問題