2009-06-29 11 views
2

私はそうのように、いくつかのXSLT変換を実行するたjavax.xml.transform.Transformerクラスを使用していないよ:空白をエスケープしないようにjavaxトランスフォーマーを禁止する方法を教えてください。

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> 

(実際には機能していても)本当に馬鹿に見えます。

+0

この場合、caracter参照または実際のUnicode文字の間にXML(次にXSLT)の意味上の違いはありません。また、これはXalanに固有のものです(自分の答えが指摘しているようです)。ですから、この答えのタグは 'xsltprocessor'です。 –

答えて

2

それで、この回答はかなり不自由なものでした.Xalanを更新してください。以前のバージョンで何が間違っていたのか分かりませんが、最新のバージョンに切り替えると、 http://xml.apache.org/xalan-j/downloads.html 突然エンティティエスケープのタブが消えてしまいました。あなたのお手伝いをしてくれてありがとう。

0

時にはこのようなもので、後で自分自身をregexに置き換えることは、あまり良いオプションではありません。

+0

提案していただきありがとうございます。私は絶対に何も見つけられない場合に使用しますが、kludges(そして私の誇り、私の同僚はいつかこのコードを見るかもしれません;-))を避けたいという私の欲求は私がそうでなければそれを使うのを妨げるでしょう。 – machineghost

1

XMLReaderと組み合わせてSAXTransformerFactoryを試すことができます。あなたはそれがデフォルトですでにそれをしないならば、無視できる空白文字を含まないようにSAXパーサーを設定することができるはず

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()); 

:よう

何か。私は実際にこれをテストしていませんが、私は私のプロジェクトの1つで似たようなことをしています。

+0

提案をお寄せいただきありがとうございますが、(私がChristopher Morleyに言ったように)後処理余分な処理レイヤーは本当に厄介です。私が本当に探しているのは、Transformerに最初に 実体参照へのタブを変換しないように指示する方法です。 – machineghost

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)として文字列を読み込んでいます。

+0

私は<3 FileUtilsを実行しますが、この場合、私はまったく使用していませんでした(コマンドラインからXalanを直接実行しても同じ問題が発生しました)。 – machineghost

関連する問題