2009-06-29 21 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