• 締切済み

要素のとりだしかた

Jaxpのxmlパーサを使い、xmlからxmlに変換するプログラムを作っています。分からないことがあるのでぜひ教えてください。 例えば、 <book bookid="001"> <hon name="abc" /> <hon name="def" /> </book> <book bookid="002"> <hon name="ghi" /> </book> などというxmlからhonのnameがabcというものを探し、 あれば、"abc"とそのbookidの"001"を取り出す方法はどうすればいいでしょうか? abcは取り出せたのですが、それに対応するbookidが取り出せなくて困っています。 わかりづらくてすみません・・・。

  • limo
  • お礼率0% (0/3)
  • XML
  • 回答数3
  • ありがとう数13

みんなの回答

  • kazf
  • ベストアンサー率100% (1/1)
回答No.3

<result>  <book>   <name>abc</name>   <id>001</id>  </book>  <book>   <name>def</name>   <id>001</id>  </book>  <book>   <name>ghi</name>   <id>002</id>  </book> </result> 上記のような結果を得るためのXSLTは、次のようになります。 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  <xsl:template match="/">   <result>    <xsl:for-each select="root/book/hon/@name">     <book>      <id><xsl:value-of select="../../@bookid" /></id>      <name><xsl:value-of select="." /></name>     </book>    </xsl:for-each>   </result>  </xsl:template> </xsl:stylesheet> このXSLTを実行するにはJavaのTransformerを使用する必要があります。 詳しくは、下の参考ページをご覧下さい。 XSLTを使用しないで、Javaだけでやる方法もありますが、要素を生成したりする処理がめんどくさいので、XSLT変換が一番スッキリいく方法です。

参考URL:
http://www.hellohiro.com/xslt.htm
  • tachiwa
  • ベストアンサー率34% (25/73)
回答No.2

ご質問の趣旨に合っていないかもしれませんが、xsltでhtml出力してみたので参考になればうれしいです。 入力XML <?xml version="1.0" encoding="Shift_JIS"?> <books> <book bookid="001"> <hon name="abc" /> <hon name="def" /> </book> <book bookid="002"> <hon name="ghi" /> </book> </books> 変換XSL <?xml version="1.0" encoding="Shift_JIS" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="Shift_JIS"/> <xsl:template match="/"> <html><body><table> <xsl:apply-templates/> </table></body></html> </xsl:template> <xsl:template match="book"> <xsl:for-each select="hon"> <xsl:if test="@name='abc'"> <tr><td> <xsl:value-of select="@name"/> </td><td> <xsl:value-of select="../@bookid"/> </td></tr> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>

  • kazf
  • ベストアンサー率100% (1/1)
回答No.1

質問の意図が分りづらいので、補足してください。 入力のXMLは分りましたが、変換後に出力したいXMLを示してください。 質問の内容から推測すると、変換後の出力XMLは、以下のような感じでしょうか。 <result>  <book>   <name>abc</name>   <id>001</id>  </book>  <book>   <name>def</name>   <id>001</id>  </book>  <book>   <name>ghi</name>   <id>002</id>  </book> </result>

limo
質問者

補足

わかりづらくてすみませんでした。 kazfさんが推測したとおりにしたいです。

関連するQ&A

  • XMLパーサの種類について混乱してます

    XSLTをいじる必要に駆られて、現在Java1.4+JAXP1.1を利用しています。 いままで、javax.xml.transformをimportしてメソッドを実行するだけで、「変換系に何を使っているのか」については全く気にしていなかったのですが、その実体は何なのでしょうか? (XTとかXalanとか、単体の変換系がありますよね・・・?) また、DOMパーサ、SAXパーサもJAXPで使えますが、各々のパーサや変換系を集めてパッケージにしたものがJAXPなんでしょうか。 さらに、勉強中にXMLパーサという単語が出てきて混乱しています。XMLパーサは、DOM・SAX・XSLT等とは違うのでしょうか? (XMLパーサと名乗っているXercesは何に使うのでしょうか・・・) DTDとの関連も含めて解説して頂けたら嬉しいです。

    • ベストアンサー
    • Java
  • 何故か子の要素に xmlns=

    ある「AABBCC」のタグが記述されているXML文書が有ります。 その文書に対し下記のXSLで変換をすると <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" version="1.0" encoding="UTF-16" indent="yes" /> <xsl:template match="/"> <ABC xmlns="http://www.abcd.co.jp/Schema_1_1"> <xsl:apply-templates select="AABBCC" /> </ABC> </xsl:template> <xsl:template match="AABBCC"> <DEF> <xsl:attribute name="ID">1</xsl:attribute> </DEF> </xsl:template> </xsl:stylesheet> 下記のような出力を期待しているのですが、 <?xml version="1.0" ?> <ABC xmlns="http://www.abcd.co.jp/Schema_1_1"> <DEF ID="1" /> </ABC> 何故か以下のようにDEFの属性に「xmlns=""」が追加されてしまいます。 <?xml version="1.0" ?> <ABC xmlns="http://www.abcd.co.jp/Schema_1_1"> <DEF ID="1" xmlns="" /> </ABC> まだ、XML,XSL共に勉強を始めたばかりでよく分かってないのでどうしてこのようなことが起こるのか、また対処法を教えてください。 アホな質問かもしれませんが、よろしくお願いします。

    • 締切済み
    • XML
  • UNIXでfindとls

    UNIXでファイルを検索するのにfindコマンドを使用してますが 情報として、パス名だけが表示されます。 >find . -name ghi -print ./ghi ./abc/def/ghi ./abc/def/ghi/ghi これを、ファイルのいろんな情報を見ることはできないでしょうか? パイプを使おうと思ったのですが、いまいちわかってなくて できませんでした。

  • GET形式で&を渡す

    初めまして。kuro917と申します。 cgiで、GET形式で&を渡したいのですが、うまくできません。 たとえば、 <form method="POST" action="test.cgi"> <input type="hidden" name="abc" value="def&ghi&jkl"> <input type="submit" value="送信"> だと、正常に値が渡されますが、 test.cgi?abc=def&ghi&jkl だと、うまく渡されません。 これは、区切り記号が&だからだと思いますが、どうしたらよいでしょうか>< ちなみに、値の&を%26に置き換えては見ましたが、結果は変わりませんでした。 どうしても、GET形式で&を渡したいのですが・・・。 できればcgiプログラムを変えない方法でお願いします。m(_ _)m

    • ベストアンサー
    • CGI
  • 正規表現でのパイプ(or)を減らしたいのですが

    いつもお世話になっています。 正規表現のパイプ(|)は非常に遅くなるらしいので、[]内に並べるようにプログラムを修正しようと思っています。それで、 /a|b|c/ ---> [abc] のような方法は、よく紹介されているのですが、a,b,cが単独文字ではなく、単語になっているような場合、 /abc|def|ghi/ ---> [(abc)(def)(ghi)] だと多分ダメですよね(今実行環境が無く確認できません)。 それで、各々の単語を $a = 'abc'; $d = 'def'; $g = 'ghi'; のようにあらかじめ定義しておいて、 /$a|$d|$g/ ---> [$a$d$g] というように書き換えると、うまくいくのでしょうか? やり方が間違っていましたら、ご指摘いただきたく、よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlのキャプチャ

    プログラム #!/usr/bin/perl my $str = "abc,def,ghi"; ($a,$b,$c) = $str =~ /(.*),(.*),(.*)/; print $a,"\n"; print $b,"\n"; print $c,"\n"; 実行結果 abc def ghi このようなプログラムで ($a,$b,$c) = $str =~ /(.*),(.*),(.*)/;は それぞれ$a,$b,$cにabc,def,ghiが入ります. キャプチャしたすべてを変数に入れるならこの方法ですが, defだけが欲しいのに変数を3つ用意する必要がないと思います. 間違った表記ですが, ($b) = $str =~ /(.*),(.*),(.*)/$2/; 2つ目にキャプチャした$2が変数$bに入るような表記は出来ないのでしょうか?

  • perlのプログラミングで悩んでいます

    open(IN,"<data/list.cgi"); @list = <IN>; close(IN); このようなプログラムで、 'abc','def','ghi' とだけ書かれた「list.cgi」をdataディレクトリに用意しています。 そして、print "$list[0]";で読み込むと、 'abc','def','ghi' と全て表示されてしまいます。 原因がわからないので、質問しました。 お願いします。

  • PHP 配列について

    PHPで簡単なプログラムを作っています。 上手い方法があれば教えてください。 例えば $arr = array(); $arr(0) = "ABC"; $arr(1) = "DEF"; $arr(2) = "GHI"; $arr(3) = "JKL"; $arr(4) = "MNO"; この様な配列があり、これを以下の様に「特定のデータを削除し空いているキーを詰めたい」場合どうしたら良いのでしょうか? この場合は"DEF"を削除。 $arr(0) = "ABC"; $arr(1) = "GHI"; $arr(2) = "JKL"; $arr(3) = "MNO"; アドバイスお願いします。

    • ベストアンサー
    • PHP
  • perlでのcsv形式のテキストファイルの変換

    perlを使用してcsv形式のテキストファイルを下記のように変換したいと思っています。 【変換前】 10, abc , def , ghi ,jkl    ----1行目 10, abc , def , aaa, bbb   ----2行目 10, abc , def , ccc , ddd  ----3行目 11, abc , def , eee , fff   ----4行目 11, abc , def , aaa , ggg ----5行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 【変換後】 10, abc , def , ghi ,jkl    ----1行目 11, abc , def , eee , fff   ----4行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 変換内容はcsv形式のテキストファイルで、”,”で区切った先頭3列が 前の行の先頭3列と同じならその行は出力しない、といった 変換をしたいと思っております。 (例えば2行目ですと先頭3列は10, abc ,defになっており、  1行目の先頭3列と同じ文字列になっているためこの行は出力しない) 当方、Perl初心者で上記のようなことがPerlでできるかも よくわかっておりません。 そこで、上記のような変換はPerlで可能なのか、そしてもし可能であるのなら どのようにPerlで記述すればできるのか教えていただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • VBA:配列の中で文字列が何番目にあるか知りたい

    たとえば Hairetu = Array("ABC","DEF","GHI") としておいて配列から"DEF"が何番目にあるのかを検索する方法はないのでしょうか? よろしくお願いします。

専門家に質問してみよう