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 文字列自体ではなく、XML ドキュメントの URL であると想定していることだと思います。

おそらく、ここで StringReader リーダーを使用する必要があります。

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

XML ドキュメントへの URL ではなく、XML を渡すと仮定すると、おそらく XML に対しても同じことを行う必要があります。

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 に答える