1

Java を使用して XML ドキュメントをテキストに変換しています。

Transformer transformer = tFactory.newTransformer(stylesource);
transformer.transform(source, result);

これは、XML ドキュメントにコロンがある場合を除いて機能するようです。この例を試しました: XML ファイル:

<?xml version="1.0" encoding="UTF-8"?>
<test:TEST >
  <one.two:three id="my id" name="my name" description="my description" >
  </one.two:three>
  <one.two:three id="some id" name="some name" description="some description" />
</test:TEST>

XSL ファイル:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xmi="http://www.omg.org/XMI" 
xmlns:one.two="http://www.one.two/one.two:three" >
<xsl:output method="text" indent="yes" omit-xml-declaration="yes"/>
<xsl:variable name="myVariable">one.two:three</xsl:variable>
<xsl:template match="/">
 <xsl:apply-templates/>
</xsl:template>
<xsl:template match="*[substring(name(),1,9)='test:TEST']" >
 <xsl:for-each select="./$myVariable">
inFirstLoop
 </xsl:for-each>
 <xsl:for-each select="./one.two:three">
inSecondLoop
 </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

私が得ている変換の結果は、1 行です。

inFirstLoop

私は4行の出力を期待しています

inFirstLoop
inFirstLoop
inSecondLoop
inSecondLoop

これを修正するにはどうすればよいですか? どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

2

ここには複数の問題があります。解析エラーやその他のエラーで失敗するのではなく、変換がなんとか実行できたことに驚いています。

大きな問題の1つは、入力XMLが名前空間プレフィックス(コロンの目的)を宣言せずに使用することです。のような宣言

 xmlns:one.two="http://www.one.two/one.two:three"

XSLだけでなく、ソースXMLにも含まれている必要があります。そうしないと、ソースXMLが整形式ではありません(名前空間ルールに従って)。

2番目の問題はXPath式です

./$myVariable

エラーをスローする必要があります。あなたが欲しかったのは

*[name() = $myVariable]

私が行う3番目の変更は、XSLTのエラーではありませんが、物事を行うには不十分な方法です...一致させたい場合<test:TEST>は、名前空間ツールを使用して名前空間を参照する必要があります。したがって、代わりに

<xsl:template match="*[substring(name(),1,9)='test:TEST']" >

使用する

<xsl:template match="test:TEST">

はるかにきれい。次に、入力XMLドキュメントですでに行っているように、スタイルシートの最も外側の要素に名前空間宣言を入れる必要があります。

xmlns:test="...test..."

車を運転するようなXML名前空間は、試行錯誤よりも少しのトレーニングから学ぶほうがよいトピックです。このような簡単な記事を読むと、将来の多くの混乱や苦痛を避けるのに役立ちます。

于 2012-08-20T14:32:27.660 に答える