スタイルシートのfor-each selectに変数を使用する方法

このQ&Aのポイント
  • スタイルシートのfor-each select属性で変数を使用したい場合、xsl:paramを宣言して変数を定義します。
  • 変数を使用するためには、select属性の値をconcat関数で結合する方法があります。
  • 要素名の代わりに変数を使用するためには、xsl:template内で変数を置換する必要があります。
回答を見る
  • ベストアンサー

スタイルシートのfor-each select=に変数を使用したい

お世話になります。 <xsl:param name="A" select="1000"> ・ ・ ・ <xsl:template name="B"> ・ ・ ・ <xsl:for-each select=".//1000"> -(1) </xsl:template> <xsl:template match="1000"> -(2) </xsl:template> (1) (1)の箇所の「1000」を上で宣言したAを使用したく、 <xsl:for-each select="concat('.//',$A")>  など色々試したのですが、うまくいきませんでした。 (2) (2)の箇所を「A」の変数に色々な形で置き換えてもうまくいきませんでした。 上記2点、を変数を使用して指定したいのですが、どのようにすれば実現できますでしょうか? 大変お手数とは思いますがよろしくお願いします。

  • XML
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • nadera
  • ベストアンサー率83% (5/6)
回答No.1

<xsl:for-each select=".//1000"> -(1) これでは,変数にする以前の問題として,まともに動かないのでは? 要素名の一文字目は数字にはできません。xpathも大丈夫でしょうか? まず,変数にする前にきちんと動くようにしたとして,次に変数にするには,環境によって難易度が異なります。 xalanのようにdyn:evaluate()が使えるものは,要素名を変数に文字列として入れて,これをevaluate関数でノードセットに戻します。 概念的には,  <xsl:variable name="hensu" select="'s1000'"/> として,要素名を''で囲んで,文字列としてhensuに格納します。 これを使うときは,  <xsl:for-each select="dyn:evaluate($hensu)"> などとしますが,evaluateの引数は,パーサによって異なります。 なお,msxmlは,そのまんまではevaluateを使えません。 次に,<xsl:template match="1000"> -(2)ですが,これを変数化するのは不可能だと思います。 match内のxpath表現をランタイムで変更できる仕様はないと思います(多分)。 variableもparamも,xsltの変数は,通常のプログラム言語の変数と異なり,とても制限が多く,使いづらいものなのです。

関連するQ&A

  • for-eachが上手くいきません

    xslを使ってごくごく基本的なことをしようとしているのですが、何故か上手くいかず煮詰まっています。 ここが違う!というツッコミを是非よろしくお願いします。 ごく単純なことですが、xmlで複数の<site></site>内にあるデータそれぞれ表示させるためxslファイル内でfor-eachを使っています。for-each抜きだと一つ目の<site></site>がちゃんと表示されるのですが、for-eachを付け加えた途端何も表示されなくなってしまいます。 参考書を見て何度確認、やり直しをしても上手くいかず困っています。 使っているコードは以下の通りです。 XMLファイル: <?xml version="1.0" encoding="Shift-JIS" ?> <?xml-stylesheet type="text/xsl" href="links.xsl" ?> <links> <site> <name>サイト1</name> <banner>some.jpg</banner> </site> <site> <name>サイト2</name> <banner>other.jpg</banner> </site> </links> XSLファイル: <?xml version="1.0" encoding="Shift-JIS" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head><title><title></head> <body> <table border="1"> <xsl:for-each select="links/site"> <tr> <td> <img> <xsl:attribute name="src"> <xsl:value-of select="links/site/banner" /> </xsl:attribute> </img> <b><xsl:value-of select="links/site/name" /></b> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> 何かアドバイスがありましたらお聞かせ下さい。

    • ベストアンサー
    • XML
  • xsl:for-each関数の回転数を変数でカウントしたい

    いろいろと調べて、XSLTではxsl:variableとparamを使って変数を使えるようなのですが、これらは変更は出来ないようですね(paramはちょっと違うようですが)。 xsl:for-each関数の回転数を変数でカウントするといった使い方をしたいのですが、変数の値が変えれない為に実現できません。 代わりの方法か変数の値を変えられる方法を知っている方はいらっしゃいますか?

    • 締切済み
    • XML
  • スタイルシートを使って、要素タグがついたまま文を取り出したい

    お世話になります。 下記出力.xmlの内容で 「出力.xml <文> I <u>have <空欄>a</空欄> pen</u> <文>」 という内容があります。 そこで、スタイルシートの処理を通して、 「I <u>have <空欄>a</空欄> pen</u>」とタグが付いたまま取り出したいのですが、 下記のようなスタイルシートにすると 「I <u>have a pen </u>」 と外の<u>のタグしか表示されません。 「変換.xsl <xsl:apply-templates select="文"> <xsl:template match="u"> <xsl:element name="u"> <xsl:value-of select="." /> </xsl:element> <xsl;template> <xsl:template match="空欄"> <xsl:element name="空欄"> <xsl:value-of select="." /> </xsl:element> <xsl;template>                  」 どのようにすれば 「I <u>have <空欄>a</空欄> pen</u>」とタグがついたままで 取り出せるのでしょうか? 大変お手数ですが、何卒よろしくお願いします。

    • ベストアンサー
    • XML
  • ■XSLT■固定文字を使ったループ処理について(サンプルのイメージソースあり)

    いつも勉強させていただいております。 今回は質問をさせていただけないでしょうか。 それでは、よろしくお願いします。 下記のような感じで、アルファベット一文字づつ処理をしたいと思っています。 このような、処理はできますでしょうか? XMLにa-zの文字を入れておいて、各ノードのループで処理をすれば可能かと思いますが、 XMLが変えられないので、それ以外の方法を考えています。 下記はイメージですから、動作はしません。 <xsl:for-each select="'abcdefghijklmnopqrstuvwxyz'"> <!-- 下記により一文字づつ処理をする --> <xsl:call-template name="PutAlphabetHref" > <xsl:with-param name="sAlpha" select="substring(........)" /> </xsl:call-template> </xsl:for-each>

    • 締切済み
    • XML
  • 違う階層のテンプレートの変数を参照する方法を教えてください。

    以下のようにテンプレートAAAにある$naをテンプレートBBBから参照し、変数$nbをつくりたいと思っております。 いろいろと試して四苦八苦しております。 XSL初心者です、どなたかご教示願います。 ----------------------------------------------- <xsl:template match="AAA">  <xsl:variable name="na"><xsl:value-of select='@value' /></xsl:variable> </xsl:template> <xsl:template match="BBB"> <xsl:variable name="nb"><xsl:value-of select="$na" /></xsl:variable> </xsl:template>

    • ベストアンサー
    • XML
  • xslのdocument関数で読込んだ2つのxmlをxsl:sortしたい

    次のXSLで動作させています。 <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xml:space="default" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <xsl:output method="text" /> <xsl:template match="/"> <xsl:for-each select="document('取り込むXMLファイル')//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> <xsl:for-each select="//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> </xsl:template> </xsl:stylesheet> ここまでは出来たのですが、xsl:sortでまとめてsortするにはどうすればいいのでしょうか?

    • ベストアンサー
    • XML
  • タグの内容をxsl:variableのname属性に使いたい

    立て続けに2つめの質問してしまい恐縮ですがよろしくお願い 致します。 やりたい事をストレートに記述しますと <work> <name>hoge</name> <x>0.5</x> </work> というwork要素があった場合に <xsl:template match="work"> <xsl:variable name="<xsl:value-of select="x"/>"> <xsl:value-of select="name"> </xsl:variable> </xsl:template> ということがしたいのですが、これではxsl:variableのnameの 箇所で当然エラーが出てしまい出来ません。 上記のように任意のタグの内容をxsl:variableのnameに使用 することは出来ないのでしょうか? よろしくお願い致します。

    • 締切済み
    • XML
  • XSLTで、あるノードの Text を別なノードの Name として参照

     変換したいXML文書の最初のトップレベルノードの階層をたどって text を拾っていくと、その text に一致する name のノードが次のトップレベルノードの階層で、出現するようになっています。  そこで、まず、最初のノードの階層をたどっていって、その順序で、2番目のノードから値を引いてきて表示させたいのです。 ■変換したい XML 文書 DataDocument.xml <datadocument> <setteischema> <sitem>solution <scategory>solution1</scategory> </sitem> <sitem>itsales <scategory>itsales1</scategory> </sitem> </setteischema> <setteivalue> <solution> <solution1>ソリューション1</solution1> </solution> <itsales> <itsales1>ITセールス1</itsales1> </itsales> </setteivalue> </datadocument> それに対して、適用したい XSL は次のようなものです。 ■変換命令を記述したXSL文書 StyleDocument.xsl <xsl:template match="setteischema" > <xsl:for-each select="*"> <xsl:variable name="foo" select="text()"/> <xsl:for-each select="*"> <xsl:variable name="bar" select="text()"/> <xsl:value-of select="★1" /> </xsl:for-each> </xsl:for-each> </xsl:template> 実際は★1の部分で setteivalue/$foo/$var といったパスで得られるノードのテキストを表示させたいのです。 どうしたらできますか? よろしくお願いします。

    • ベストアンサー
    • XML
  • xsl:variable の使用方法

    こんにちは xml,xsl を今日はじめて使う初心者です。 変数を使おうとして下記のようなメッセージが出てしまいます。 >ここではキーワード xsl:variable を使用できません。 どうすればよろしいでしょう? area.xls: <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> (中略) </html> </xsl:template> <xsl:template match="変換結果"> <table align="left" border="1" width="1500" cellspacing="0" cellpadding="0"> <tr> (中略) </tr> <tr> (中略) <xsl:comment>合計 </xsl:comment> <th>数量</th> (中略) </tr> <xsl:variable name="coLor" select="white" /> <xsl:for-each select="row" order-by="+column0"> <tr bgcolor="$coLor"> <td width="200" align="right"> <xsl:value-of select="column0" /> </td> (中略) </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> ************************************************************* area.xml <?xml version="1.0" encoding="Shift_Jis"?> <?xml-stylesheet type="text/xsl" href="area.xsl" ?> <変換結果> <row row-Num='1'><column0>,4536163880211</column0> (中略) </row> </変換結果>

    • ベストアンサー
    • XML
  • XMLの実体参照とXSLT

    次のようなXMLファイルをXSLTで処理したいのですが、&baseの部分がうまく表示できません。 どのようにしたら表示できるでしょうか? ■a.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="a.xsl"?> <!DOCTYPE test [ <!ELEMENT name (#PCDATA)> <!ENTITY base SYSTEM "base.xml"> ]> <test> <name>abc</name> &base; </test> ■base.xml <?xml version="1.0" encoding="UTF-8"?> <base>base</base> ■a.xsl <?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" encoding="UTF-8" /> <xsl:template match="/"> <xsl:apply-templates select="test" /> <xsl:apply-templates select="base" /> </xsl:template> <xsl:template match="test"> name:<xsl:value-of select="name" /> </xsl:template> <xsl:template match="base"> base:<xsl:value-of select="base" /> </xsl:template> </xsl:stylesheet> □結果 name:abc ※base.xmlの内容を表示できない

    • ベストアンサー
    • XML

専門家に質問してみよう