ちょっと先の未来クイズ第4問

xsl:param要素をxsl:templateのmatch属性で使用するにはどうしたらよいでしょうか?
あるいは、そんなことはできないという情報でも結構です。ご教示ください。

A 回答 (2件)

なるほど。

補足していただいた説明で、質問の意味は分かりました。

XSLTの仕様上は、xsl:stylesheetの子要素としてxsl:param要素を置いた場合、そこから後ろのxsl:templateでは参照できるはずです。

そこで、以下のような短いXSLTスタイルシートを用意して、
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="n" select="test"/>
<xsl:template match="abc[@attr=$n]">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="@* | text()"></xsl:template>
</xsl:stylesheet>

以下のXMLファイルに適用してみたところ、
<data>
<abc attr="test1">item1</abc>
<abc attr="test">item2</abc>
<abc attr="test2">item3</abc>
</data>

Xalanでは正しく item2 と出力されました。
しかしXTでは、何も出力されず、XTのオプションで n=test のようにパラメータを設定すると、正しく出力されました。
私の解釈では、Xalanの動作の方が正しいような気がします。

したがって、もしXTを使っているならば、この実装上の違いが原因かと思われます。
この場合、XTの作者に直してもらうか、Xalanなど別のXSLTプロセッサを使うしか、解決方法はないかもしれません。
    • good
    • 0
この回答へのお礼

ありがとうございました。
パラメータの値を外部から渡すことを意図していたので、目的はかなえることができました。
質問前に実行すべきでしたが、問題の範囲を狭くした上でのテストというつもりで、躓いてしまっていたので、たいへん助かりました。

お礼日時:2003/02/11 22:19

「xsl:param要素を」という意味がよく分からないのですが、parameterの値を参照するには$記号を以下のように使います。



nというparameterにtestが入っているならば、
match="abc[@attr=$n]"

ちなみに、parameterには有効範囲があるので、以下のようにxsl:stylesheetの子要素としてxsl:paramを置く必要があります。

<xsl:stylesheet ... >
 <xsl:param name="n" select="test"/>
 <xsl:template ... > ... </xsl:template>
  ...
</xsl:stylesheet>

質問の意味を勘違いしてたらすみません。(その場合は、もう少し丁寧に説明していただかないと、皆さん答えにくいと思います)
    • good
    • 0
この回答へのお礼

ありがとうございます。
説明が不十分であった点、お詫びいたします。
申し訳ありませんでした。
どこか、これは解決できない問題ではないかと考えていた部分があり、あのような質問になってしまいました。

あらためて質問させてください。
質問の要点としては、下記のように書いた場合、param"n"の値をそれぞれのtemplateが認識するかどうか、あるいはどのようにすれば認識するかという点でした。
<xsl:stylesheet ... >
 <xsl:param name="n" select="test"/>
 <xsl:template ... > ... </xsl:template>
  ...
</xsl:stylesheet>

例えば、属性にたいしてではありませんが、
下記のようなtemplateを用いた場合、希望通りの結果を得ることができるが、上記のようにparamの宣言をtemplate外で行った場合、宣言は認識されているようでエラーにはならないが、値が認識されず結果を得ることができません。
<xsl:template match="item">
<xsl:param name="n" select="test"/>
<xsl:value-of select="$n"/>
</xsl:template>

同様に、下記のようにtemplate外で宣言されたparamを使用した場合、確かにエラーにはならないのですが、やはり結果を得ることができません。この場合、template内でparamを定義することは、親子関係の上からもできないため、これは解決不可能な問題なのかもしれないと考えました。
<xsl:template match="abc[@attr=$n]"/>

とはいえ、template外の定義がなければ、不明なparamの使用によるエラーになるのですから、値をtemplateに認識させることもできるはずですよね。あるいは別のtemplateが値を隠すというようなことでもあるのでしょうか?

どうかご教示おねがいします。

お礼日時:2003/02/11 15:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報