【发布时间】:2015-01-16 14:26:16
【问题描述】:
我有一个 XML-String,我正在尝试删除所有空的 XML-Tags 和空格。 为此,我正在使用以下 XSL 表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(*) and not(text()[normalize-space()])]"/>
</xsl:stylesheet>
我的输入字符串 XML 是例如:
String s = "<main> <test>123öü aksdjf0192301ß09aasdfg 0</test> <test> </test> <test>12031</test>"
+ "\n" +
"<test>" + "</test>" + "</main>";
对于 XSL 转换,我使用以下 Java 代码:
StringReader reader = new StringReader(xmlContent);
StringWriter writer = new StringWriter();
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new javax.xml.transform.stream.StreamSource(
"style.xsl"));
transformer.transform(new javax.xml.transform.stream.StreamSource(reader),
new javax.xml.transform.stream.StreamResult(writer));
String result = writer.toString();
我的输出是:
<?xml version="1.0" encoding="UTF-8"?><main><test>123öü aksdjf0192301ß09aasdfg 0</test><test>12031</test></main>
这正是我的预期结果,但是当我将一个实体(例如 '&')添加到我的输入字符串时,转换失败。
出现错误:实体名称必须紧跟实体引用中的“&”。
我该如何解决这个问题? XSL 是实现这样一个功能的正确原因吗?
我期望这个输出:
<?xml version="1.0" encoding="UTF-8"?><main><test>123öü aksdjf0192301ß09aasdfg 0</test><test>120>&& | 31</test></main>
使用此输入:
String s = "<main> <test>123öü aksdjf0192301ß09aasdfg 0 >&& | </test> <test> </test> <test>120>&& | 31</test>"
+ "\n" +
"<test>" + "</test>" + "</main>";
【问题讨论】:
-
当您添加
&amp;时,编译器认为您正在尝试引用实体。如果您只是想添加字符,则只需添加&amp; -
不要尝试使用字符串连接构建 XML,使用 JDOM 或 DOM 或类似的,这样您就不会遇到格式错误的 XML 问题,从而导致稍后在应用程序期望的工具链中出现错误XML。