

xmlからxmlへの変換時に出るエラーについての質問です。
元データとなるxmlが下のような構造をしています。
ルート要素の要素ノードが2つあるものです。
<A1>
<B1>aaa</B1>
<B2>
<C1>bbb</C1>
</B2>
</A1>
<A2>ccc</A2>
これをxsltで違う形のxmlに変換するのですが、変換中にエラーが出てしまいます。
(使用しているのはApache xalanです)
現在は元データに、<root>ノードを最上位に加えることにより、変換しているのですが、他の方法で対処できないでしょうか?
よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
ルートノードが一つに限られるのは,整形式のXMLでは絶対の基本です。
なので,ルートノードを付け加えないと,xsltでの変換はできません。
ただ,質問のようなXMLはfragment(フラグメント,断片)と言い,XMLを解析して操作するソフトをXMLパーサと言いますが,DOMを扱えるパーサであれば,フラグメントを読み込んで,ルートノードを付け加えるなどの処理をして,xsltで変換するなどが可能かもしれません。
なおxalanは,小生は使ったことがありませんので,このような処理が可能かどうかは分かりません。
あるいは,XMLは,単なるテキストファイルなので,プログラム的にルートノードを付加することも難しくはないので,フラグメントの読み込みなどよりも,テキストとして読み込んで処理するほうが簡単かもしれません。
コメントありがとうございます。
DOMですか、そちらも勉強してみます。
確かにルートノードをつけてしまえば変換できるので、付け加える方法を考えてみたいと思います。
No.2
- 回答日時:
XML初心者で逆質問のようになってしまいますが、そもそもXML文書は複数のルートノードが許されるのでしょうか?
XSLTでは正しいXML文書とみなされないためにエラーが起きているということはないでしょうか?
以前にどこかで、同じ質問(「ドキュメントの末尾に…」のエラーが発生する)をされている方がいて、回答に「ルートノードがないせいです」と付いているのを見た覚えがあります。
コメントありがとうございます。
私も初心者ですから断定は出来ませんが、XMLでは許されない記述ルールだと思います。
ドキュメントの末尾に…のエラーは<A2>が存在することにより出ているので、原因はそこにあると認識しています。
ただ元データの形式はこちらで変更することができないものでして、何とかXSLTで変換出来ないかと思いまして、こちらで質問した次第です。
やはりXSLTだと原則に反しているので無理なのでしょうか。
No.1
- 回答日時:
現在の不具合が出ている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>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- Excel(エクセル) 至急です><Excelの関数を教えてください。 2 2022/03/22 17:56
- Excel(エクセル) EXCEL 行内のデータを2行に分けて、表を作り直したいのです。教えてください。 5 2023/06/25 14:00
- Excel(エクセル) Excelで数式をそのままコピーしたい どうすればいいですか? 4 2022/09/16 02:16
- その他(IT・Webサービス) 見たことのない形式で日付が表示されているのでそれを解析してほしい 3 2023/01/23 16:53
- Excel(エクセル) Excelの空文字判定について 7 2023/01/06 13:25
- Excel(エクセル) エクセル シート内のボックスを縦並びから横並びに 7 2023/04/05 04:28
- Excel(エクセル) Countifよりも早く重複数をカウントする方法ありますか? 18 2022/07/04 13:39
- Visual Basic(VBA) Excel VBA 最終行を取得しVlookup関数をコピーする方法をコーディングで教えてください。 3 2023/05/11 13:14
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
ルート要素ノードが2個ある場合?
-
インターネットって、どうやっ...
-
昔Winnyってありましたけど、あ...
-
ツリービューのノードをダブル...
-
あるノードリストに、特定の名...
-
VB2005 TreeViewの任意ノード選択
-
ノード数とは?
-
同じタグ名の項目取得
-
SNMP リンクダウンとノードダ...
-
ノードとは
-
xmlファイルが上手にHTMLに変換...
-
このエラー、何とかなりません...
-
特殊記号が勝手にエスケープさ...
-
VBSでxmlの値を書き換えたい
-
Visual Basic .NET の識別子は...
-
スタイルシートを使用したXM...
-
XMLをXSLを使いHTMLに変換した...
-
XSLTで固定長データファイルを...
-
XMLで要素が記述された順番に意...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
SNMP リンクダウンとノードダ...
-
ルート要素ノードが2個ある場合?
-
複数のマックPCによる数値計算...
-
同じタグ名の項目取得
-
C#でTreeViewのCheckBoxのサイ...
-
昔Winnyってありましたけど、あ...
-
TreeView の初期表示について
-
あるノードリストに、特定の名...
-
TreeViewに重複する値をセット
-
(VB.NET)TreeViewのノード文...
-
ツリービューの使い方が・・・
-
ノードとは
-
C# TreeView 効率良いノード追...
-
【C#】XPathを使用してのノード...
-
4色定理はなぜグラフ理論で証...
-
ツリービューのノードをダブル...
-
TreeViewで複数ノードの選択は...
-
vbsのDOMDocumentで要素のText...
-
各ノードの行数取得
おすすめ情報