用xalan转化时的问题:
源xml的图片是base64编码的图片, 直接用FileOutputStream图片转换异常,FileOutputStream外层用 PrintStream格式化后,可转换成功。
这是网上的示例代码:
String xsltPath="C:\\XTX.xsl";
String xmlPath="C:\\76552.xml";
String htmlPath="C:\\Users\\Administrator\\Desktop\\654.html";
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer =
tFactory.newTransformer
(new javax.xml.transform.stream.StreamSource
(xsltPath));
transformer.transform
(new javax.xml.transform.stream.StreamSource
(xmlPath),
new javax.xml.transform.stream.StreamResult
( new FileOutputStream(htmlPath)));
这样转化后的html是失败的,似乎是在xslt里调用java方法时出了问题,struts在转化xsl时候用DOMSource进行了格式化,改用DOMSource作为Transformer的传入参数就可以成功转换,解决如下:
String xsltPath="C:\\XTX.xsl";
String xmlPath="C:\\76552.xml";
String htmlPath="C:\\Users\\Administrator\\Desktop\\654.html";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(new File(xmlPath));
document.normalize();
DOMSource source=new DOMSource(document);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer
(new javax.xml.transform.stream.StreamSource
(xsltPath));
transformer.transform(source, new javax.xml.transform.stream.StreamResult(
new FileOutputStream(htmlPath)));
后来发现这种方式是简单粗暴的,用FileOutputStream作为Transformer.transform的传参是有隐患的:
我的xslt有这么一句:
<xsl:element name="img">
<xsl:attribute name="src" >data:<xsl:value-of select="value/@mediaType" /> ;base64,<xsl:value-of select="value" /></xsl:attribute>
<xsl:attribute name="width">700px</xsl:attribute>
<xsl:attribute name="hspace">4px</xsl:attribute>
<xsl:attribute name="vspace">10px</xsl:attribute>
</xsl:element>
源xml的图片是base64编码的图片, 直接用FileOutputStream图片转换异常,FileOutputStream外层用 PrintStream格式化后,可转换成功。
transformer.transform(source, new javax.xml.transform.stream.StreamResult(
new FileOutputStream(htmlPath)));
fos=new FileOutputStream(remote_html_file);
PrintWriter writer = new PrintWriter( new OutputStreamWriter(fos));
transformer.transform(source,new javax.xml.transform.stream.StreamResult(writer));