• ベストアンサー

XSLTにてタグ名を取得する方法

XML勉強中です。実は、XML文書に決められたタグがあって、その中身を探してXSL変換、というのは覚えたのですが、ふと迷ってしまいました。 たとえば、トップレベルにあるタグの名前が不明な場合、エレメントの一覧を取得するにはどうしたら良いのでしょうか? 自分でXMLを記述しておいてそれはないだろと言われそうなのですが、HTMLのための資源としてではなく、データとしての利用を考えたときにふと悩んでしまいました。 <person>  <name> <ID> etc... </person> <company>  <name> <adress> <tel>etc... </company> このとき、personとcompanyを取得したいのですが・・・。 template match="/" にて value-of select="name(.)" とか一通り試したのですが、出てくれませんでした。 まだはっきりとXSLTの書き方を習得していないので、とてつもなくアホな質問かもしれませんが、よろしくお願いいたします。

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

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

正しいやり方かどうかわかりませんが、参考まで... <xsl:template match="/"> <!-- root --> <xsl:for-each select="./*"> <xsl:value-of select="name()"/><br/> </xsl:for-each> <!-- top --> <xsl:for-each select="./*/*"> <xsl:text> </xsl:text><xsl:value-of select="name()"/><br/> </xsl:for-each> <!-- second --> <xsl:for-each select="./*/*/*"> <xsl:text>  </xsl:text><xsl:value-of select="name()"/><br/> </xsl:for-each> </xsl:template>

pythian
質問者

お礼

ありがとうございます。言われてひらめきました。XPathの理解不足が原因ですね・・・もう少し勉強してみます。

その他の回答 (1)

  • jo-ji
  • ベストアンサー率72% (26/36)
回答No.2

おそらく理由もちゃんと知った方が良いと思うので、他の方の回答の補足のような形になってしまいますが。 /は、あなたが言う所の「トップレベルのエレメント」にではなく、その上に仮想的に存在する「ルートノード」にマッチします。 したがって、取得したい要素は、このルートノードの子ノードということになります。 この理屈を理解いただければ、FlossenEngelさんの回答にあるように一度ルートノードにマッチしたxsl:templateの中でその子ノードを取得しても良いですし、以下のようにxsl:templateのmatchを変更してもOKです。 <xsl:template match="/*"> <xsl:value-of select="name()"/> </xsl:template> ちなみに、XSLTでぶつかる問題はXPathを理解しておけば解決することが多いと思いますので、今後ぶつかる問題に対処できるように、XPathについて勉強しておくことをお奨めします。

参考URL:
http://www.w3.org/TR/1999/REC-xpath-19991116
pythian
質問者

お礼

あっ、なるほど!一番上にあるもの、ではなくてこれ自体が子ノードなのですね。 どうもノードの指定の方法でつまづいてしまったので、XPathの記法から勉強してみたいと思います。ありがとうございます。

関連するQ&A