プロが教えるわが家の防犯対策術!

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の書き方を習得していないので、とてつもなくアホな質問かもしれませんが、よろしくお願いいたします。

A 回答 (2件)

正しいやり方かどうかわかりませんが、参考まで...


<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>
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/07/15 15:04

おそらく理由もちゃんと知った方が良いと思うので、他の方の回答の補足のような形になってしまいますが。



/は、あなたが言う所の「トップレベルのエレメント」にではなく、その上に仮想的に存在する「ルートノード」にマッチします。
したがって、取得したい要素は、このルートノードの子ノードということになります。

この理屈を理解いただければ、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
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/07/15 15:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!