我在oracle数据库中使用xslt和java扩展转换xml
当我用xsl解析xml时,我得到了错误:
errorjavax.xml.transform.TransformerConfigurationException: Could not compile stylesheet
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:858)
我已经测试过,没有扩展xslt,它运行正常。 此外,我已经在其他环境中测试了转换,它运作正常。
java版本是1.6.0_43。
xslt是:
<xsl:stylesheet version="1.0"
xmlns:java="http://xml.apache.org/xalan/java/XsltTransformer"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="APSDocument">
<atag value='{java:GetDateTimeNow()}' ></atag>
</xsl:template>
</xsl:stylesheet>
XML:
<APSDocument Tag="APP002"> <Section Tag="APPLICATION_FINISHED"> <SectionBody> <Field Tag="APP_FINISHED">1</Field> </SectionBody> </Section> </APSDocument>
java类:
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "XsltTransformer" AS
import java.io.*;
import java.text.*;
import java.util.Date;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import org.xml.sax.InputSource;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.sql.*;
public class XsltTransformer
{
public static String TransformToSvTLV(String xmlDoc, String xsltDoc) throws Exception
{
try
{
XsltTransformer xsltTransformer = new XsltTransformer();
Document svmlDoc = xsltTransformer.TransformToSvML(xmlDoc, xsltDoc);
return xsltTransformer.TransformSvMLToStTlv(svmlDoc);
} catch (Exception e)
{
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
return sw.toString();
}
}
private Document TransformToSvML(String xmlDoc, String xsltDoc) throws Exception
{
TransformerFactory tFactory=TransformerFactory.newInstance();
Source xslSourceDoc=new StreamSource(new StringReader(xsltDoc));
Source xmlSourceDoc=new StreamSource(new StringReader(xmlDoc));
StringWriter writer = new StringWriter();
Transformer trasform=tFactory.newTransformer(xslSourceDoc);
trasform.transform(xmlSourceDoc, new StreamResult(writer));
//System.out.println(writer.toString());
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = docBuilder.parse(new InputSource(new StringReader(writer.toString())));
doc.getDocumentElement().normalize();
return doc;
}
public static String GetDateTimeNow()
{
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm");
return simpleDateFormat.format((new Date())).replace('/', '.');
}
private String TransformXmlNodeToSvTlv(Node svmlNode, String endChar)throws Exception
{
return "do nothing";
}
}
调用TransformToSvTLV方法:
FUNCTION EtlTransformToSvXML(xmlDoc LONG,xsltDoc LONG) RETURN VARCHAR2
IS LANGUAGE JAVA NAME
'XsltTransformer.TransformToSvTLV(java.lang.String, java.lang.String)
return java.lang.String';
提前致谢!
答案 0 :(得分:0)
在这种情况下最可能出现的问题是程序无法读取xslt文件。 可能的解决方案我建议使用
new StreamSource(new File("path/to/your/xslt"))
答案 1 :(得分:-1)
我没有使用oracle或xalan的经验,但我在其他环境中看到了类似的问题。考虑到这一点并考虑到这个问题已经存在了一段时间,我会在这里提出建议而不是提供可能的答案。
xsl编译器失败通常是由于命名空间或权限问题(特别是在数据库中托管)。我的外行理解是xslt处理器将在编译xslt期间尝试创建扩展类的实例。如果这是正确的,那么拥有正确的命名空间和权限将是重要的。
我在oracle中看到使用xslt函数扩展的唯一示例使用了namespace-uri,如下所示:“http://www.oracle.com/XSL/Transform/java/classname”其中 classname 完全限定 (即 module.class )。当然,您的URI根目录可能有所不同,但我肯定会将此视为导致错误的可能原因。