• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:XSL(異なるノードからエレメントを取得))

XSLで異なるノードからエレメントを取得する方法

このQ&Aのポイント
  • XSLを用いて異なるノードからエレメントを取得する方法を教えてください。
  • 具体的には、MenulistのMenuのItemが1の場合、SetlistのSet Noが1のエレメントを取得したいです。
  • このような要件を満たすXSLの書き方を教えてください。

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

  • ベストアンサー
  • dscripty
  • ベストアンサー率51% (166/325)
回答No.1

質問の中の XML が整形式 XML 文書(※1)になってないから、適当に、修正しておいたよ(↓xmldoc.xml)。 (※1 整形式 XML 文書) http://ja.wikipedia.org/wiki/Extensible_Markup_Language#XML.E3.81.AE.E6.A7.8B.E6.96.87.E3.81.A8.E6.95.B4.E5.BD.A2.E5.BC.8FXML.E6.96.87.E6.9B.B8 [xmldoc.xml] <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="xslt.xsl"?> <RootNode>   <Menulist>     <Menu No="1" Item="3" Time="100"/>     <Menu No="2" Item="1" Time="60"/>     <Menu No="3" Item="1" Time="120"/>     <Menu No="4" Item="2" Time="10"/>   </Menulist>   <Setlist>     <Set No="1"><Name>Push Up</Name></Set>     <Set No="2"><Name>Run</Name></Set>     <Set No="3"><Name>Swim</Name></Set>     <Set No="4"><Name>Squat</Name></Set>   </Setlist> </RootNode> たぶん html 文書を出力したいんだとおもうけど、html タグかくとごちゃごちゃして、ポイントがわかりづらくなるからテキスト出力にするね。HTML 出力したいときは、必要なところに html タグ追加して完成させてね。 [xslt.xsl] <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">   <!-- 出力が html のときは↓も↑に含める   xmlns="http://www.w3.org/1999/xhtml" --> <xsl:output   method="text"   encoding="utf-8"   media-type="text/plane"/> <!-- 出力が html のときは↓を使う。   doctype-public="-//W3C//DTD XHTML 1.1//EN"   doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"   media-type="application/xhtml+xml" --> <xsl:template match="/">   <xsl:apply-templates select="RootNode/Menulist/Menu" /> </xsl:template> <xsl:template match="Menu">   <xsl:variable name="no"><xsl:value-of select="@No" /></xsl:variable>   <xsl:value-of select="$no" />   <!-- ↓出力が html のとき xsl:text 要素はらない -->   <xsl:text> </xsl:text>   <xsl:value-of select="/RootNode/Setlist/Set[@No=$no]/Name" />   <!-- ↓出力が html のとき xsl:text 要素はらない -->     <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet> xslt だけど、とりあえず下のタグだけ覚えておけば、簡単なのはかけるようになるから、気が向いたらしらべてみて! - stylesheet - output - template - apply-templates - value-of - variable - element - attribute - copy ちょっと複雑なことする場合は、これが必要になるかも。 - for-each - sort - call-template - with-param - param - copy-of - if - choose - when - otherwise 正典 http://www.w3.org/TR/xslt 関数型の美しさに魅了されると手続型のちまちまがだるだるでいやいやだから覚悟しておいて!

maxheadmashroom
質問者

お礼

ありがとうございます!! 元のXML(…質問するにしてはいい加減な書き方でした…反省…)までちゃんと添削いただき、且つ、具体的に教えていただきありがとうございました! それから、学習アドバイスもありがとうございます。参考にさせていただきます。 早速、TEXT出力で実験してみたところ、 1 Push Up 2 Run 3 Swim 4 Squat と出力されてしまいました。そこで、いただいたコードを指でなぞりながら考えること数分、 <xsl:variable name="no"><xsl:value-of select="@No" /></xsl:variable> を <xsl:variable name="no"><xsl:value-of select="@Item" /></xsl:variable> と書き換えることで、 3 Swim 1 Push Up 1 Push Up 2 Run と、期待していた出力を得ることが出来ました!! なんだかもやもやっとしていたのが「ぱっ」と明るくなった感じです。(^^) 今後とも宜しくお願いいたします。

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

関連するQ&A