XSLT无法处理实体

zen*_*non 0 java xml xslt

我有一个XML字符串,我试图删除所有空的XML标签和空格.为此,我使用以下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>
Run Code Online (Sandbox Code Playgroud)

我的输入String XML例如:

String s = "<main>           <test>123öü aksdjf0192301ß09aasdfg   0</test>            <test> </test>  <test>12031</test>"

             + "\n" +

             "<test>" + "</test>" + "</main>";
Run Code Online (Sandbox Code Playgroud)

对于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();
Run Code Online (Sandbox Code Playgroud)

我的输出是:

<?xml version="1.0" encoding="UTF-8"?><main><test>123öü aksdjf0192301ß09aasdfg   0</test><test>12031</test></main>
Run Code Online (Sandbox Code Playgroud)

这正是我的预期结果,但是当我在输入字符串中添加一个实例,例如'&'时,转换失败.

出现错误: 实体名称必须紧跟实体引用中的"&".

我该如何解决这个问题?XSL是否正确实现这样的功能?

我期待这个输出:

 <?xml version="1.0" encoding="UTF-8"?><main><test>123öü aksdjf0192301ß09aasdfg   0</test><test>120>&& | 31</test></main>
Run Code Online (Sandbox Code Playgroud)

有了这个输入:

 String s = "<main>           <test>123öü aksdjf0192301ß09aasdfg   0 >&& |  </test>            <test> </test>  <test>120>&& | 31</test>"

                 + "\n" +

                 "<test>" + "</test>" + "</main>";
Run Code Online (Sandbox Code Playgroud)

Tod*_*odd 5

Ampersand(&)本身不是一个合法的角色,你必须将其编码为&amp;.

XML规范:

&符号(&)和左尖括号(<)不得以其文字形式出现,除非用作标记分隔符,或用于注释,处理指令或CDATA部分.如果在其他地方需要,他们都必须用数字字符引用或字符串进行转义 &amp;&lt; 分别.