2

私はjavax.xml.transform.Transformerクラスを使用して、次のようなXSLT変換を実行しています。

TransformerFactory factory = TransformerFactory.newInstance();
StreamSource source = new StreamSource(TRANSFORMER_PATH);
Transformer transformer = factory.newTransformer(source);
StringWriter extractionWriter = new StringWriter();
String xml = FileUtils.readFileToString(new File(sampleXmlPath));
transformer.transform(new StreamSource(new StringReader(xml)),
        new StreamResult(extractionWriter));
System.err.println(extractionWriter.toString());

ただし、私が何をしても、トランスフォーマーがソースドキュメントにあったタブを同等の文字エンティティ(	)に変換することを避けられないようです。私は両方を試しました:

transformer.setParameter("encoding", "UTF-8");

と:

transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

しかし、どちらも役に立ちません。誰か提案はありますか?なぜなら:

&#9;&#9;&#9;&#9;&#9;<MyElement>

本当にばかげているように見えます(それが機能するとしても)。

4

4 に答える 4

2

したがって、これに対する答えはかなり不十分であることが判明しました。Xalanを更新してください。古いバージョンの何が問題だったのかわかりませんが、http: //xml.apache.org/xalan-j/downloads.htmlで最新バージョンに切り替えると、 タブのエンティティエスケープが突然なくなりました。 。でも皆さんの助けに感謝します。

于 2009-06-30T22:18:42.330 に答える
1

SAXTransformerFactoryをXMLReaderと組み合わせて使用​​してみることができます。

何かのようなもの:

SAXTransformerFactory transformFactory = (SAXTransformerFactory) TransformerFactory.newInstance();
StreamSource source = new StreamSource(TRANSFORMER_PATH);
StringWriter extractionWriter = new StringWriter();

TransformerHandler transformerHandler = null;
try {
    transformerHandler = transformFactory.newTransformerHandler(source);
    transformerHandler.setResult(new StreamResult(extractionWriter));
} catch (TransformerConfigurationException e) {
    throw new SAXException("Unable to create transformerHandler due to transformer configuration exception.");
}

XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
reader.setContentHandler(transformerHandler);
reader.parse(new InputSource(new FileReader(xml)));
System.err.println(extractionWriter.toString());

SAXパーサーがデフォルトでまだ含まれていない場合は、無視できる空白を含まないように設定できるはずです。私は実際にこれをテストしていませんが、私のプロジェクトの1つで同様のことをしています。

于 2009-06-30T06:52:51.880 に答える
0

このような場合、後で自分で正規表現に置き換えることは完全に悪いオプションではありません。少なくとも、後でより良いオプションが見つかるまで、それを実行できます。

于 2009-06-29T19:02:41.967 に答える
0

ファイルストリームを直接使用するのではなく、最初にファイルを文字列に読み込む理由はありますか?

それ以外の

String xml = FileUtils.readFileToString(new File(sampleXmlPath));
transformer.transform(new StreamSource(new StringReader(xml)),
    new StreamResult(extractionWriter));

あなたは試すことができます

transformer.transform(new StreamSource(new FileReader(sampleXmlPath)),
    new StreamResult(extractionWriter));

これは問題の原因ではないかもしれませんが、私は以前に同様の問題を引き起こすのを見ました。FileUtils.readFileToStringがCommons.IOバージョンの場合、文字列は、必要なUTF-8ではなくUFT-16(JavaのデフォルトであるIIRC)として読み込まれます。

于 2009-06-30T18:18:50.070 に答える