2009-06-29 19 views
2

我使用的javax.xml.transform.Transformer類來執行一些XSLT轉換,就像這樣:如何防止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

在這種情況下,在字符引用或實際Unicode字符之間,XML(即XSLT)之間沒有語義差異。這也是Xalan特有的(正如你自己的答案似乎指出的那樣)。所以,這個答案的索引標籤是`xsltprocessor`。 – 2010-09-10 18:50:01

回答

2

所以這個問題的答案證明是非常蹩腳的:更新Xalan。我不知道我的舊版本出了什麼問題,但是當我切換到最新版本時: http://xml.apache.org/xalan-j/downloads.html 突然間,標籤的實體轉義消失了。儘管感謝所有人的幫助。

0

有時候,像這樣的事情,事後用正則表達式替換它們並不是一個完全錯誤的選擇,它至少會讓你繼續前進,直到你稍後找到更好的選項。

+0

感謝您的建議。如果我絕對找不到更好的東西,我會使用它,但是我希望避免kludges(和我的驕傲;我的同事可能會在某天看到這個代碼;-))會阻止我使用它。 – machineghost 2009-06-30 00:34:36

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解析器不包括忽略的空格,如果它不已經在默認情況下做到這一點。我沒有真正測試過,但我在其中一個項目中做了類似的事情。

+0

謝謝你的建議,但又一次(正如我對克里斯托弗莫利所說的)一個後處理額外的處理層實際上是一團糟;我真正想要的是一種告訴Transformer僅將標籤首先轉換爲 實體引用的方法。 – machineghost 2009-06-30 16:36:23

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版本,則它將讀取UFT-16(Java默認值,IIRC)中的字符串,而不是您想要的字符串,即UTF-8。

+0

雖然我做了<3個FileUtils,但在這種特殊情況下,我根本沒有使用它(即使直接從命令行運行Xalan也遇到過同樣的問題)。 – machineghost 2009-06-30 22:16:34