• ベストアンサー

xsl:variableでの抽出条件の変更

こんにちは、Khazadと申します。  xsl:variableで、xsl:apply-templates の抽出条件を変更したくて 下記のようなXSLを作成したのですが、うまくいきません。  原因がわかる方。または別の方法があればご教授お願いできないでしょうか?  パーサーはMSXML3.0です。 (試したこと) 1 テンプレート内に<xsl:value-of select='$frid'/>を挿入すると、   ちゃんと1が表示されます。 2 [@rid='{$frid}']の部分を[@rid='$frid']に変更しても抽出は   行われません。 3 [@rid='{$frid}']の部分を[@rid='1']にすると抽出されます。  以下XSLのソースです -------------------------------------------------------- <xsl:variable name = 'frid' select='1' ></xsl:variable> <xsl:template match="/"> <xsl:apply-templates select="ROOT//*[@rid='{$frid}']"/> </xsl:template> <xsl:template match="*[@rid='{$frid}']"> <xsl:apply-templates select="*"/> </xsl:template> --------------------------------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
  • kaihou100
  • ベストアンサー率83% (10/12)
回答No.3

 方手落ちでした。すいません。 <xsl:template match="*" name="foo">  あは </xsl> は、 <xsl:apply-templates select="*" name="foo" />  でいけたと記憶してます。  検証をしておりませんので、間違っている可能性が ありますが、取り急ぎ。  うまくいかなかったら、りぷらいをお願いします。

Khazad
質問者

お礼

ありがとうございます。 それを見本にテストしたのですが、 "Attribute 'name' is invalid on 'xsl:apply-templates'" だそうです。(上記はエラーメッセージです。)  ただ、kaihou100さんの回答をヒントにW3C勧告のページをもう一度よく 見てみると、xsl:apply-templatesには、modeという属性があり、 それを用いると、意図した処理(テンプレートの切り替え)が可能に なりました。  このあたりは単純にパーサーの実装の違いということでしょうね…。  

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • kaihou100
  • ベストアンサー率83% (10/12)
回答No.4

 アドバイスというより雑談ですが(^^;;  それは単に間違えただけです。すいません…

Khazad
質問者

お礼

>それは単に間違えただけです。すいません… いえいえ。すごく助かりました。ありがとうございます。

すると、全ての回答が全文表示されます。
  • kaihou100
  • ベストアンサー率83% (10/12)
回答No.2

<xsl:template match="..." name="...">  ... </xsl:template>  のように、nameアトリビュートで逃げるのは、アウトですか?  MS-XMLは分からないのですが、Xalanならこれでうまくいくはずです。

Khazad
質問者

補足

回答ありがとうございます。 これがうまくいくのならかなりBESTに近いです。  ただ、この場合、呼び出し方はどうなるのでしょうか?  apply-templatesなのか、call-templateなのか、 nameはどう指定するのか。  W3C 勧告 の翻訳ページを見てもそのあたりが探しきれなかったので…。  よろしければ教えていただけないでしょうか? #実は、今回はテンプレートを1つにまとめてXSL:chooseで #場合わけを行う方法で対処しました。

すると、全ての回答が全文表示されます。
回答No.1

<xsl:template match="/"> <xsl:apply-templates select="ROOT//*[@rid=$frid]"/> </xsl:template> <xsl:template match="*"> ~ </xsl:template> でしょうか。

Khazad
質問者

お礼

ありがとうございます。 とりあえずこれでうまくいきました。 xsl:templateのmatchの内部には変数での指定ができない みたいですね…。 長くなるので省略していたのですが、実はそのtemplate内で apply-templateを使用しているので、"*"ではループしてしまうの です…。  とりあえずcall-template等でうまく行かないかがんばってみます。

すると、全ての回答が全文表示されます。