- ベストアンサー
ルート要素ノードが2個ある場合?
- xmlからxmlへの変換時に出るエラーについての質問です。
- 元データとなるxmlがルート要素の要素ノードが2つあるものです。
- 現在は元データに、<root>ノードを最上位に加えることにより、変換しているのですが、他の方法で対処できないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ルートノードが一つに限られるのは,整形式のXMLでは絶対の基本です。 なので,ルートノードを付け加えないと,xsltでの変換はできません。 ただ,質問のようなXMLはfragment(フラグメント,断片)と言い,XMLを解析して操作するソフトをXMLパーサと言いますが,DOMを扱えるパーサであれば,フラグメントを読み込んで,ルートノードを付け加えるなどの処理をして,xsltで変換するなどが可能かもしれません。 なおxalanは,小生は使ったことがありませんので,このような処理が可能かどうかは分かりません。 あるいは,XMLは,単なるテキストファイルなので,プログラム的にルートノードを付加することも難しくはないので,フラグメントの読み込みなどよりも,テキストとして読み込んで処理するほうが簡単かもしれません。
その他の回答 (2)
- kuma8055
- ベストアンサー率28% (27/94)
XML初心者で逆質問のようになってしまいますが、そもそもXML文書は複数のルートノードが許されるのでしょうか? XSLTでは正しいXML文書とみなされないためにエラーが起きているということはないでしょうか? 以前にどこかで、同じ質問(「ドキュメントの末尾に…」のエラーが発生する)をされている方がいて、回答に「ルートノードがないせいです」と付いているのを見た覚えがあります。
お礼
コメントありがとうございます。 私も初心者ですから断定は出来ませんが、XMLでは許されない記述ルールだと思います。 ドキュメントの末尾に…のエラーは<A2>が存在することにより出ているので、原因はそこにあると認識しています。 ただ元データの形式はこちらで変更することができないものでして、何とかXSLTで変換出来ないかと思いまして、こちらで質問した次第です。 やはりXSLTだと原則に反しているので無理なのでしょうか。
- redfox63
- ベストアンサー率71% (1325/1856)
現在の不具合が出ているxsltなどを提示したほうが回答が付きやすいかと思います どのように変換したくて、どんなエラーに見舞われているとかを具体化しましょう
お礼
コメントありがとうございます。 使用しているxslは下記のような物です。 子要素を持たない要素を出力するものです。 <?xml version="1.0" encoding="EUC-JP"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output encoding="EUC-JP" method="xml" indent="yes" /> <xsl:template match="*"> <xsl:choose> <xsl:when test="count(*) = 0"> <xsl:copy-of select="." /> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="*" /> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> その際に下記エラーが発生し、変換することが出来ません。 file:///D:/***.xml; 行番号8; 列番号-1; XSLT エラー (javax.xml. transform.TransformerException): ドキュメントの末尾に不正な文字 < があります。 元のxmlを下記のようにすると問題なく通ります。 <root> <A1> <B1>aaa</B1> <B2> <C1>bbb</C1> </B2> </A1> <A2>ccc</A2> </root>
お礼
コメントありがとうございます。 DOMですか、そちらも勉強してみます。 確かにルートノードをつけてしまえば変換できるので、付け加える方法を考えてみたいと思います。