• ベストアンサー

XML:連番要素の全ての子要素にxPath式でアクセスするには

xml文書1 <?xml version="1.0"> <customer0> <name>aaaa</name> <tel>1234</tel> </customer0> <customer1> <name>bbbb</name> <tel>2345</tel> </customer1> xml文書2 <?xml version="1.0"> <customer> <name>aaaa</name> <tel>1234</tel> </customer> <customer> <name>bbbb</name> <tel>2345</tel> </customer> xml文書1のcustomerの子要素(name,tel)を全て取得したいです。 ルートノードから辿って行くのではなく、ダイレクトにアクセスしたいです。 xPath式で子要素を全て取り出すことはできますでしょうか? xml文書2であれば「//customer」で可能だと思うんですが。 宜しくお願い致します。

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

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

ルートノードがない地点でXML文書として認められない。 何かの書き間違いであると信じて要望を予測してみる。少なくとも何かのヒントにはなるはず ==============Q4374721-1.xml================ <?xml version="1.0" encoding="UTF-8"?> <customers> <customer0> <name>aaaa</name> <tel>1234</tel> </customer0> <customer1> <name>bbbb</name> <tel>2345</tel> </customer1> </customers> ==============Q4374721-1.xsl================ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" /> <!-- お好みで --> <!-- templateは後から書いたものが優先されるので, ルート要素のcustomers要素は下のテンプレートに引っかかる 数字をチェックしているわけではなく単にcustomerで始まる要素をマッチさせているだけなので customersABCのような要素でもヒットする。 まぁその辺はXPathのsubstring関数とか,number関数に通してNaNかチェックしたり andで条件つなげればどうにでもなるでしょ? --> <xsl:template match="//*[starts-with(local-name(),'customer') and namespace-uri()='']"> <item> <xsl:value-of select="name" /> </item> </xsl:template> <xsl:template match="/*"> <list> <xsl:apply-templates /> </list> </xsl:template> </xsl:stylesheet> ==============Q4374721-2.xml(結果)================ <?xml version="1.0" encoding="UTF-16"?> <list> <item>aaaa</item> <item>bbbb</item> </list>

ton_jiru
質問者

お礼

ありがとうございます。 関数が使えるんですね。参考になりました。

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

その他の回答 (1)

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

できる事はできるけど文書1のxmlは美しくないねぇ・・・ 結局xPathで使われるのはmatchする文字列を生成できれば良いので名前+数値と判っているならそういう文字列合成をしてアクセスすれば良い。 できたかどうか判らないけど customer* とか。

ton_jiru
質問者

お礼

ありがとうございます。

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

関連するQ&A