Java 使用XSLT删除预打印

Java 使用XSLT删除预打印,java,xml,xslt,Java,Xml,Xslt,出于某种原因,我下面的代码给出了异常:javax.xml.transform.TransformerConfiguration异常:无法编译样式表 public String removePrettyPrint(String xml) throws TransformerException, TransformerFactoryConfigurationError { String result = ""; TransformerFactory factory = Transfo

出于某种原因,我下面的代码给出了异常:
javax.xml.transform.TransformerConfiguration异常:无法编译样式表

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;
}
公共字符串移除预打印(字符串xml)引发TransformerException,TransformerFactoryConfigurationError{
字符串结果=”;
TransformerFactory=TransformerFactory.newInstance();
字符串源=”;
Source xslt=新的StreamSource(Source);
变压器=工厂新变压器(xslt);
源文本=新的StreamSource(xml);
transform(文本,新的StreamResult(result));
返回结果;
}

有什么问题吗?

我认为问题在于,当您将字符串作为参数传递给时,它希望它是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文档的URL,那么您可能也必须对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();

我认为问题在于,当您将字符串作为参数传递给时,它希望它是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文档的URL,那么您可能也必须对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();

问题是因为编码的缘故。。当您使用file()类读取文件时,它会在内部进行编码。。但是当您尝试将XML作为字符串加载时。。那你就得手工做了

观察
.getBytes()和ByteArrayInputStream(字节)的用法。

String source=”“;
byte[]bytes=source.getBytes(“UTF-16”);
Source xslsource=newstreamsource(newbytearrayinputstream(字节));
变压器=工厂新变压器(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);
String source=”“;
StringReader xslReader=新的StringReader(源);
Source xslsource=新的StreamSource(xslReader);

自动进行编码。

问题是因为编码。。当您使用file()类读取文件时,它会在内部进行编码。。但是当您尝试将XML作为字符串加载时。。那你就得手工做了

观察
.getBytes()和ByteArrayInputStream(字节)的用法。

String source=”“;
byte[]bytes=source.getBytes(“UTF-16”);
Source xslsource=newstreamsource(newbytearrayinputstream(字节));
变压器=工厂新变压器(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);
String source=”“;
StringReader xslReader=新的StringReader(源);
Source xslsource=新的StreamSource(xslReader);

它会自动编码。

您能澄清一下“删除预打印”是什么意思吗?您的目标是删除XML的缩进和换行吗?您当前尝试使用的XSLT只需按原样复制XML。@威胁,要删除prentyprint,您应该使用normalize-space()stripspace功能。您能澄清一下“删除PrettyPrint”是什么意思吗?您的目标是删除XML的缩进和换行吗?您当前尝试使用的XSLT只需按原样复制XML。@如果要删除prentyprint,应使用normalize-space()stripspace功能。这不是编码问题。正如Tim C的回答所解释的,接受字符串参数的
StreamSource()
构造函数需要一个URL,StreamResult()也是如此。@JLRishe,这是编码问题!StringReader在内部处理它。。请尝试第一个代码。。它不会弹出任何编译错误!如果更改此行:
byte[]bytes=source.getBytes(“UTF-16”)
to
byte[]bytes=source.getBytes(),它可以正常工作。正如我所说,询问者出错的原因是
StreamSource()
构造函数正在处理
这不是编码问题。正如Tim C的回答所解释的,接受字符串参数的
StreamSource()
构造函数需要一个URL,StreamResult()也是如此。@JLRishe,这是编码问题!StringReader在内部处理它。。请尝试第一个代码。。它不会弹出任何编译错误!如果更改此行:
byte[]bytes=source.getBytes(“UTF-16”)
to
byte[]bytes=source.getBytes(),它可以正常工作。正如我所说,询问者出现错误的原因是
StreamSource()
构造函数正在处理