アプリ版:「スタンプのみでお礼する」機能のリリースについて

xmlからxmlへの変換時に出るエラーについての質問です。

元データとなるxmlが下のような構造をしています。
ルート要素の要素ノードが2つあるものです。

<A1>
  <B1>aaa</B1>
  <B2>
    <C1>bbb</C1>
  </B2>
</A1>
<A2>ccc</A2>

これをxsltで違う形のxmlに変換するのですが、変換中にエラーが出てしまいます。
(使用しているのはApache xalanです)
現在は元データに、<root>ノードを最上位に加えることにより、変換しているのですが、他の方法で対処できないでしょうか?
よろしくお願いいたします。

A 回答 (3件)

ルートノードが一つに限られるのは,整形式のXMLでは絶対の基本です。


なので,ルートノードを付け加えないと,xsltでの変換はできません。

ただ,質問のようなXMLはfragment(フラグメント,断片)と言い,XMLを解析して操作するソフトをXMLパーサと言いますが,DOMを扱えるパーサであれば,フラグメントを読み込んで,ルートノードを付け加えるなどの処理をして,xsltで変換するなどが可能かもしれません。
なおxalanは,小生は使ったことがありませんので,このような処理が可能かどうかは分かりません。

あるいは,XMLは,単なるテキストファイルなので,プログラム的にルートノードを付加することも難しくはないので,フラグメントの読み込みなどよりも,テキストとして読み込んで処理するほうが簡単かもしれません。
    • good
    • 0
この回答へのお礼

コメントありがとうございます。

DOMですか、そちらも勉強してみます。

確かにルートノードをつけてしまえば変換できるので、付け加える方法を考えてみたいと思います。

お礼日時:2008/12/11 00:13

XML初心者で逆質問のようになってしまいますが、そもそもXML文書は複数のルートノードが許されるのでしょうか?



XSLTでは正しいXML文書とみなされないためにエラーが起きているということはないでしょうか?

以前にどこかで、同じ質問(「ドキュメントの末尾に…」のエラーが発生する)をされている方がいて、回答に「ルートノードがないせいです」と付いているのを見た覚えがあります。
    • good
    • 0
この回答へのお礼

コメントありがとうございます。

私も初心者ですから断定は出来ませんが、XMLでは許されない記述ルールだと思います。
ドキュメントの末尾に…のエラーは<A2>が存在することにより出ているので、原因はそこにあると認識しています。
ただ元データの形式はこちらで変更することができないものでして、何とかXSLTで変換出来ないかと思いまして、こちらで質問した次第です。
やはりXSLTだと原則に反しているので無理なのでしょうか。

お礼日時:2008/12/09 09:29

現在の不具合が出ているxsltなどを提示したほうが回答が付きやすいかと思います


どのように変換したくて、どんなエラーに見舞われているとかを具体化しましょう
    • good
    • 0
この回答へのお礼

コメントありがとうございます。
使用している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): ドキュメントの末尾に不正な文字 &#x3c; があります。

元のxmlを下記のようにすると問題なく通ります。
<root>
<A1>
   <B1>aaa</B1>
   <B2>
     <C1>bbb</C1>
   </B2>
</A1>
<A2>ccc</A2>
</root>

お礼日時:2008/12/09 04:36

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