0

出于某种原因,我的以下代码给出了异常:javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet

public String removePrettyPrint(String xml) throws TransformerException, TransformerFactoryConfigurationError {
    String result = "";
    TransformerFactory factory = TransformerFactory.newInstance();
    String source = "<?xml version=\"1.0\"?><xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">    <xsl:output indent=\"no\" />    <xsl:template match=\"@*|node()\">        <xsl:copy>            <xsl:apply-templates select=\"@*|node()\"/>        </xsl:copy>    </xsl:template></xsl:stylesheet>";
    Source xslt = new StreamSource(source);
    Transformer transformer = factory.newTransformer(xslt);
    Source text = new StreamSource(xml);
    transformer.transform(text, new StreamResult(result));
    return result;
}

它有什么问题?

4

2 回答 2

5

我认为问题在于,当您将字符串作为参数传递给StreamSource时,它​​希望它是 XML 文档的 URL,而不是实际的 XML 字符串本身。

您可能需要在这里使用 StringReader 阅读器:

String source = "...XSL Here...";
StringReader xsltReader = new StringReader(source);
Source xslt = new StreamSource(xsltReader);
Transformer transformer = factory.newTransformer(xslt);

您可能必须对 XML 执行相同的操作,假设您传递的是 XML,而不是 XML 文档的 URL。

StringReader xmlReader = new StringReader(xml);
Source text = new StreamSource(xmlReader);

对于转换本身,您可能需要使用 StringWriter

StringWriter writer = new StringWriter();
transformer.transform(text, new StreamResult(writer));
result = writer.toString();
于 2013-02-01T14:16:02.457 回答
0

问题是因为编码..当您使用 File() 类读取文件时,它会在内部进行编码..但是当您尝试将 XML 作为字符串加载..那么您必须手动执行..

观察使用情况.getBytes() and ByteArrayInputStream(bytes).

    String source = "<?xml version=\"1.0\"?><xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">    <xsl:output indent=\"no\" />    <xsl:template match=\"@*|node()\">        <xsl:copy>            <xsl:apply-templates select=\"@*|node()\"/>        </xsl:copy>    </xsl:template></xsl:stylesheet>";
    byte[] bytes = source .getBytes("UTF-16");
    Source xslsource = new StreamSource(new ByteArrayInputStream(bytes));
    Transformer transformer = factory.newTransformer(xslsource);

另一种解决方案是使用 StringReader:

    String source = "<?xml version=\"1.0\"?><xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">    <xsl:output indent=\"no\" />    <xsl:template match=\"@*|node()\">        <xsl:copy>            <xsl:apply-templates select=\"@*|node()\"/>        </xsl:copy>    </xsl:template></xsl:stylesheet>";
    StringReader xslReader = new StringReader(source);
    Source xslsource= new StreamSource(xslReader);

它会自动处理编码..

于 2013-02-01T14:19:54.027 回答