有没有一种方法可以强制Transformer在XML中以unicode转义的形式写入空间



当我在写入XML文件的文本中有一个不间断的空格(在HTML中为&#0A;/amp;nbsp;(时,我希望对其进行转义,以便在XML中看到它不是一个常规空格。

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element element = document.createElement("Foo");
document.appendChild(element);
element.appendChild(document.createTextNode("Au00A0B"));
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
transformer.transform(new DOMSource(document), new StreamResult(new FileWriter("test.xml")));

创建

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Foo>A B</Foo>

但我希望是

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Foo>A&#A0;B</Foo>

是否有任何设置可以传递给Transformer以强制执行此操作?我不想使用CDATA部分,因为那样我就必须使用'&A0;'序列,并在我显示该字符串时处理它。

在XSLT2.0+中,您可以使用字符映射

<xsl:output use-character-map="visible-spaces">
<xsl:character-map name="visible-spaces">
<xsl:output-character character="&#xa0;" string="&amp;npsp;"/>
<xsl:output-character character="&#x0a;" string="&amp;nl;"/>
</xsl:character-map>

如果以这种方式生成命名实体引用,则需要确保结果文档引用定义这些实体的DTD,这可能需要一些后处理。

XSLT1.0中最接近的等效方法是使用禁用输出转义破解,但这意味着要更改代码中输出这些字符的每个位置。

最新更新