pl / sql java source class errorjavax.xml.transform.TransformerConfigurationException:无法编译样式表

时间:2016-05-27 16:40:04

标签: java oracle xslt plsql

我在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';

提前致谢!

2 个答案:

答案 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根目录可能有所不同,但我肯定会将此视为导致错误的可能原因。