- ベストアンサー
ルート要素ノードが2個ある場合?
naderaの回答
ルートノードが一つに限られるのは,整形式のXMLでは絶対の基本です。 なので,ルートノードを付け加えないと,xsltでの変換はできません。 ただ,質問のようなXMLはfragment(フラグメント,断片)と言い,XMLを解析して操作するソフトをXMLパーサと言いますが,DOMを扱えるパーサであれば,フラグメントを読み込んで,ルートノードを付け加えるなどの処理をして,xsltで変換するなどが可能かもしれません。 なおxalanは,小生は使ったことがありませんので,このような処理が可能かどうかは分かりません。 あるいは,XMLは,単なるテキストファイルなので,プログラム的にルートノードを付加することも難しくはないので,フラグメントの読み込みなどよりも,テキストとして読み込んで処理するほうが簡単かもしれません。
関連するQ&A
- 不特定ノードに出現する同じタグ要素の中身を置換して保存したい
ある特定のタグ要素(例:hoge)がXML内のどこに現われるかわからないとき、それらの要素の中身を置換して、元のXMLと同じ構造を保ったまま保存したいと考えています。 XPathを使って//hogeと指定すればnodeListが抽出できますが、それらのrootNodeからの絶対パスを知る方法があればよいのですが。。。 当方DOMとXSLTを多少かじった程度で、SAXについては全くわかりませんが、どんな方法でもよいので実現できる方法があったらどなたかご教授くださいませ。 <?xml version="1.0" encoding="Shift_JIS"?> <root> <hoge>変換前文字列1</hoge> <aaa> <hoge>変換前文字列2</hoge> </aaa> <bbb> <ccc> <hoge>変換前文字列3</hoge> </ccc> <hoge>変換前文字列4</hoge> <hoge>変換前文字列5</hoge> </bbb> </root> 上記のようなXMLを下記のように変更したい。 <?xml version="1.0" encoding="Shift_JIS"?> <root> <hoge>変換後文字列1</hoge> <aaa> <hoge>変換後文字列2</hoge> </aaa> <bbb> <ccc> <hoge>変換後文字列3</hoge> </ccc> <hoge>変換後文字列4</hoge> <hoge>変換後文字列5</hoge> </bbb> </root>
- ベストアンサー
- XML
- スマートなxsltの記述方法
xml→xmlを行うxsltの記述方法で質問があります。 元のxmlの例を下に示します。 <?xml version="1.0" encoding="Shift_JIS" ?> <root> <A1> <B1> <DATA1>aaa</DATA1> <DATA2>bbb</DATA2> </B1> </A1> <A2> <DATA3>ccc</DATA3> <DATA4>ddd</DATA4> <B2> <DATA5>eee</DATA5> <C1> <DATA6>fff</DATA6> </C1> <DATA7>ggg</DATA7> </B2> </A2> <DATA8>hhh</DATA8> </root> (実際はDATA1,DATA2のような規則的な要素名ではありません) 変換後のxmlとしては <root> <DATA1>aaa</DATA1> <DATA2>bbb</DATA2> ・ ・ ・ <DATA8>hhh</DATA8> </root> のように、値を持っている要素だけを、ルートノードの下に記述したものが欲しいのです。 作った物としては、 <xsl:template match="DATA1" > <xsl:copy> <xsl:value-of select="." /> </xsl:copy> </xsl:template> このようなtemplateをDATA1-8まで記述するものです。 何か簡潔な記述方法はないでしょうか? よろしくお願いいたします。
- ベストアンサー
- XML
- ruby+xml 特定の属性値をもつ要素の求め方
宜しくお願いします。 ↓のようなxmlファイルがあり、 #########hoge.xml############# <root> <a name="a1"> <b>bbb1</b> <b>bbb2</b> <b>bbb3</b> <c>ccc1</c> </a> <a> <b>bbb4</b> <b>bbb5</b> </a> <a name="a3" price="100"></a> </root> ###################### ↓と同じ処理をしたいのですが、 doc = REXML::Document.new(open("hoge.xml")) doc.elements.each("root/a[@name='a1']/b") do |element| ... end a1が変数名の場合、 どのように記述したらよいのでしょうか。 doc = REXML::Document.new(open("hoge.xml")) attr = a1 doc.elements.each("root/a[@name='????????']/b") do |element| ... end 基本的な内容で申し訳ありませんが、 宜しくお願いします。
- ベストアンサー
- Ruby
- 値の空ノードの削除
「1」のXMLを「2」に変換したいのですが、xsltの記載方法をお教えください。 「1」 <?xml version="1.0" encoding="utf-8"?> <root> <aaa_cd id="XXX"> <aaa_name>XXX</car_gd_cd> <bbb_cd /> <bbb_cd>Y1</bbb_cd> <bbb_cd /> <bbb_cd>Y2</bbb_cd> <bbb_cd /> </aaa_cd> </root> ↓ 「2」 <?xml version="1.0" encoding="utf-8"?> <root> <aaa_cd id="XXX"> <aaa_name>XXX</car_gd_cd> <bbb_cd>Y1</bbb_cd> <bbb_cd>Y2</bbb_cd> </aaa_cd> </root>
- ベストアンサー
- XML
- csv作成エラー
CSVファイルを作ろうとcsvフォルダを作り、xmlファイル・xslファイルを入れました。 C:\csv\aaa.xml C:\csv\bbb.xsl コマンドプロンプトで C:\csv>java org..apache.xalan.xslt.Process -in aaa.xml -xsl bbb.xsl -out ddd.csv と入力したら、 file:/C:/csv/bbb.xsl;行番号1;列番号-1;XSLTエラー(javax..xml.transform.TransformerConfigurationException):javax..xml.transform.TransformerException: org.xml.sax.SAXParseException: ドキュメントのルート要素がありません。 と表示されてうまくいきません。 xslファイルの1行目には、<?xml version="1.0" encoding="utf-8"?>と記載されています。 教えていただけたらうれしいです。
- ベストアンサー
- XML
- DTDを記述する意味
DTDを使ってXMLの形式を厳密に定義する方法があると聞いて試してみたのですが、記述した形式を破っても何も起きません。たとえば以下のように <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ELEMENT root (a, b, c+)> ]> <root> <b>BBB</b> <a>AAA</a> </root> と書いた場合、「A,B,Cという要素をこの順番で配置せよ」という命令と「Cという要素を1つ以上配置せよ」という2つの命令を無視していますが、何かしらのエラーを返すといった動作は全くありません。HTML(XHTML)みたいな感じです(テキトーにコーディングしてもエラーを返さない点)。XMLのDTDはそれを守らないとエラーを返すような動作はしないのでしょうか?それではDTDの存在意義が分からなくなってしまいますが・・・
- 締切済み
- XML
- XMLのXPathについて
下記のようなXMLがあるとして、XPathでdataノードを取得する場合、 /root/node/dataと/root/dataの二通りがあると思いますが、これを一つにまとめて書くことは可能でしょうか? また、dataノードに辿りつくのに、途中のパスがすべて把握できない場合(/root/AAA/data、/root/BBB/CCC/data。。。) XPathでdataノードを取得することができますでしょうか? GetElementsByTagName("data")にした方が良いでしょうか? <?xml version="1.0" encoding="UTF-8"?> <root> <node> <data>データ1です</data> </node> <node> <data>データ2です</data> </node> <data>データ3です</data> </root>
- 締切済み
- XML
- xalanを使用してのエラー
xalanを使用したいのですが、 下記のようなエラーが出てしまいます。 C:\xalan-j_2_7_1\samples\SimpleTransform>java org.apache.xalan.xslt.Process -in test.xml -xslt test.xsl -out test.html (実行文) Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xalan/xslt /Process (エラー) パスが通っていないということは わかるのですが、具体的に何をどうしたら良いのかわかりません。 すでに通しているパスは、 ・システム環境変数 ■CLASSPASS C:\j2sdk1.4.2_16\lib\tools.jar; C:\xalan-j_2_7_1\xml-apis.jar; C:\xalan-j_2_7_1\xercesImpl.jar; C:\xalan-j_2_7_1\xalan.jar ■Path C:\j2sdk1.4.2_16\bin です。 まだ他に通さないといけないものがあるのでしょうか。 ご協力お願いします。 バージョン xalan-j_2_7_1 j2sdk1.4.2_16
- 締切済み
- オープンソース
- xpath でn番目のテキストノード取得
xpathで//text()とするとすべてのテキストノードが取得できますが、 この中からn番目のテキストノードを取得することは可能でしょうか? (プログラムでループではなく、xpathで。) <?xml version='1.0'?> <root><foo>aaa</foo><bar>bbb</bar><buz>bbb</buz></root> //text()[1]でaaaがとれるかと思ったんですが。。。 よろしくお願いします。
- ベストアンサー
- XML
- 要素名を表示させたい
<data> <aaa xxx="0"> <yyy zzz="1"/> <yyy zzz="2"/> </aaa> <bbb xxx="0"> <yyy zzz="1"/> <yyy zzz="2"/> </bbb> <ccc xxx="0"> <yyy zzz="1"/> <yyy zzz="2"/> </ccc> </data> 上のようなXMLから、XSLのvalue-ofなどを使って、 要素名aaa、bbb、cccを表示させるにはどう記述すればいいのでしょうか?
- ベストアンサー
- XML
お礼
コメントありがとうございます。 DOMですか、そちらも勉強してみます。 確かにルートノードをつけてしまえば変換できるので、付け加える方法を考えてみたいと思います。