XSLTでノードのTextを別ノードのNameとして参照する方法

このQ&Aのポイント
  • XSLTで特定のノードのTextを別のノードのNameとして参照する方法について説明します。
  • 変換したいXML文書の最初のトップレベルノードの階層をたどって、特定のTextに一致するNameのノードを次のトップレベルノードの階層で参照することができます。
  • 具体的なXML文書とXSL文書の例を示し、実際に適用するための手順を解説します。
回答を見る
  • ベストアンサー

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
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

<xsl:value-of select="//datadocument/setteivalue/*[name()=$foo]/*[name()=$bar]/text()"/> で表示できると思いますが、XMLのsitemのテキストが例示どおり改行を含んでいるのなら <xsl:variable name="foo" select="normalize-space(text())"/> とする必要があると思います。

Snowman
質問者

お礼

なるほど、わかりました。 *[name()=$foo] のパターンがつかえるわけですね。 これでやってみます。normalize-space は必要でした。 ありがとうございました。

関連するQ&A

  • ■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
  • ■XSLT■複数のノードを違う属性でソートする方法は?(サンプルソース有り)

    いつも勉強させていただいております。 今回は質問をさせていただけないでしょうか。 下記のような、XMLファイルがあります。 <?xml version="1.0" encoding="Shift_JIS"?> <article> <Data> <Name Num="2">佐藤</Name> </Data> <Data> <Name Num="1">三田</Name> </Data> <UserMain> <UserMainData> <User> <NAMAE>伊藤</NAMAE> <No>6</No> </User> <User> <NAMAE>加藤</NAMAE> <No>3</No> </User> </UserMainData> </UserMain> </article> NumもしくはNoを使ってソートしたいと思っています。 つまり、下記のような出力を望んでいます。 1 三田 2 佐藤 3 加藤 6 伊藤 下記のような、感じで指定できれば一発でできると思うのですが 難しいようです。 <xsl:for-each select="Data/Name|UserMain/UserMainData/User/NAMAE"> <xsl:sort select="@Num|No" /> .... </xsl:for-each> つまり、複数のノードを違う属性でソートする方法です。 どなたか、良い知恵を教えていただけないでしょうか? 残念な事に、XMLの内容を変更することはできません。 それでは、よろしくお願いします。

    • ベストアンサー
    • 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
  • XSLT

    いつもお世話になっております。 次のXSLTの結果がどうしてそうなるのかわからないので教えてください。 解説には、「処理は必ずルートノードのテンプレートから始まります」と書いてあるんですが、できましたら、その辺もからめて、どういう処理の流れになるのか、カレントノードがどう移動していくのか、教えていただけると助かります。 (XML) <?xml version="1.0" encoding="Shift_JIS"?> <Conference Situation="Reserved" Equipment="Projector">  <Room>会議室</Room>  <User>山田太郎   <Date>2008/05/08</Date>   <Time>10:00-12:00</Time>  </User>  <Number>4名</Number> </Conference> (XSLT) <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:output method="text" />  <xsl:template match="/Conference">   <xsl:value-of select="Number" />  </xsl:template>  <xsl:template match="Conference/User">   <xsl:value-of select="Date" />  </xsl:template>  <xsl:template match="/">   <xsl:value-of select="Conference/Room" />  </xsl:template> </xsl:stylesheet> (結果) 会議室

    • ベストアンサー
    • XML
  • XSLT変換について

    以下のようにファイルを作成してみました。 ローカルではIEに表示できるのですが,アップすると表示されず「スタイルシートにドキュメント要素が含まれていません。スタイルシートが空であるか、正しく構成された XMLドキュメントでない可能性があります。」というコメントが出ます。ご存知の方いらっしゃいましたらどうか教えてください。 ↓作成したファイル 「top.xml」(省略) 「top.xsl」 <?xml version="1.0" encoding="Shift_JIS" ?> <xsl:stylesheet xmlns:xsl="(省略)" version="1.0"> <xsl:import href="./note.xsl" /> <xsl:output method="html" encoding="Shift_JIS" /> <xsl:template match="/">  <html xmlns="(省略)" xml:lang="ja" lang="ja">  <head>   <meta http-equiv="Content-Type"    content="text/html; charset=Shift_JIS" />   <title><xsl:value-of   select="/top/title" /></title>  </head>  <body>   <xsl:call-template name="header" />   <div align="center"><h1>HOME PAGE</h1></div>   <table> <tr><th>CONTENTS</th></tr> <xsl:for-each select="/top/contents"> <tr><th><a href="{url}"><xsl:value-of      select="label" /></a></th>      <td><small><xsl:value-of      select="text" /></small></td></tr> </xsl:for-each>   </table><br />   <xsl:call-template name="footer" />  </body>  </html> </xsl:template> </xsl:stylesheet> 「note.xsl」(top.xslにおけるxsl:importをコメントアウトしても結果は変わらなかったため,記載省略。)

    • 締切済み
    • XML
  • XSLTでtest.xmlファイルのccc要素の値を取得する場合は以下

    XSLTでtest.xmlファイルのccc要素の値を取得する場合は以下(1)、(2)のようにやればいいのですが、(2)の箇所のパス(testを)動的(可変)にすることはできるのでしょうか? (1)document関数によりxmlファイルを変数に格納  <xsl:variable name="aaa" select="document('test.xml')"/> (2)上記変数からパスを指定して値を取得  <xsl:variable name="bbb" select="$aaa/test/ccc"/> test.xml <test> <ccc>bbb</ccc> </test> 例)以下は間違ってると思いますがパスに変数を使用して値を取得することは可能でしょうか?   <xsl:variable name="ccc" select="'test'"/> // 変数cccにtestという文字列を格納   <xsl:variable name="bbb" select="$aaa/$ccc/ccc"/> //test/cccがパスのつもり

    • 締切済み
    • XML
  • XSL : 変数について

    XSL : 変数について 初めて質問致します。 ご教示宜しくお願い致します。 ****** XML文書 ****** <root> <A>1</A> <B> <B_1>2</B_1> <B_2>3</B_2> </B> </root> ****** 質問 ****** xsl で、上記xml文書の<B>タグ配下 <B_1>2</B_1> <B_2>3</B_2> を変数に代入するにはどのようにすれば いいでしょうか?(タグ名も含めて) 下記の2つを試してみましたが、 いずれも 「2 3」となります。 ・ <xsl:variable name="hoo" select="B"/> ・<xsl:variable name="hoo"> <xsl:copy-of select="B"> </xsl:variable> 質問に不明瞭な点がありましたら ご指摘下さい。 宜しくお願い致します。

    • 締切済み
    • XML
  • XSLTの動作

    いつもお世話になります。 以下のXSLTの処理の動き方を教えてください。 どうして3の結果xmlになるのかわかりません。おそらくposition()の取り方がわかっていないのかなって思っています。 自分としては <answer>  <色>白</色>  <色>yellow</色>  <色>赤</色>  <色>blue</色>  <色>黒</色> </answer> になるんじゃないのかなって思ってしまうのですが・・・。 (1)データ <?xml version="1.0" encoding="Shift_JIS"?> <color_pencil>  <price>1300</price>  <color><en>white</en><jp>白</jp>  <color><en>yellow</en><jp>黄色</jp>  <color><en>red</en><jp>赤</jp>  <color><en>blue</en><jp>青</jp>  <color><en>black</en><jp>黒</jp> </color_pencil> (2)XSLT <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/">  <answer>   <for-each select="color_pencil/color">    <xsl:choose>     <xsl:when test="position() mod 2=0">      <xsl:apply-templates select="." />     </xsl:when>     <xsl:otherwise>      <xsl:call-template name="color" />     </xsl:otherwise>    </xsl:choose>   </xsl:for-each>  </answer> </xsl:template>  <xsl:template match="color">   <色><xsl:value-of select="jp" /></色>  </xsl:template>  <xsl:template name="color">   <色><xsl:value-of select="en" /></色>  <xsl:template> </xsl:stylesheet> (3)結果xml <answer>  <色>white</色>  <色>黄色</色>  <色>red</色>  <色>青</色>  <色>black</色> </answer>

    • ベストアンサー
    • 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
  • XSLTでの複数のXML検索結果を統合するには?

    初歩的な質問でごめんなさい。 XSLTを使って複数のXMLを検索した結果を、表示したいのですが、結果を1つのテーブルに統合するにはどうすればいいのでしょう。 次のスクリプトを基に作りたいのですが。 function search (keyword) { node = thexsl.XMLDocument.selectSingleNode("//xsl:for-each"); if(keyword) node.setAttribute("select", "//data[contains(word, '" + keyword + "')]"); else node.setAttribute("select", "//data"); str = thexml.XMLDocument.transformNode(thexsl.XMLDocument); view1.innerHTML = str; } 次のファイルを利用して検索したいです、 <xml id="thexml1" src="db1.xml"></xml> <xml id="thexml2" src="db2.xml"></xml> <xml id="thexml3" src="db3.xml"></xml> <xml id="thexsl" src="db.xsl"></xml> xmlファイルの内容 <?xml version="1.0" encoding="utf-8" ?> <dataroot xml:lang="ja"> <data>・・・</data>  ・・・ </dataroot> xslファイルの内容 <?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <table> <tr>・・・</tr> <xsl:for-each select="//data"> <tr>・・・</tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> よろしくお願いします。

    • 締切済み
    • XML

専門家に質問してみよう