Saxon Transformation导致未知扩展指令

时间:2015-12-14 07:31:26

标签: xml xslt saxon

我正在尝试使用sql查询来自XSLT的oracle数据库;查询,我正在使用sql9-sql.jar以及saxon EE 9.6.0.7版本,其中我已经在eclipse的buildpath中放置了ojdc6.jar。我收到了以下错误

  

队列名称为xsl:value-of / @中的错误在第37行pro.xsl:XTDE1450第65列中选择:内置模板规则中的未知扩展指令; SystemID:file:/ C:/home/oracle/workspace/XSLTsaxonEE/src/com/thbs/viniReq/pro.xsl;行#:37 net.sf.saxon.trans.XPathException:net.sf.saxon.expr.Expression.process(表达式)net.sf.saxon.expr.ErrorExpression.evaluateItem(ErrorExpression.java:127)中的未知扩展指令.java:880)net.sf.saxon.expr.instruct.DocumentInstr.evaluateItem(DocumentInstr.java:325)at net.sf.saxon.expr.instruct.DocumentInstr.evaluateItem(DocumentInstr.java:50)at net。 sf.saxon.expr.Atomizer.evaluateItem(Atomizer.java:317)at net.sf.saxon.expr.Atomizer.evaluateItem(Atomizer.java:37)at net.sf.saxon.expr.AtomicSequenceConverter.evaluateItem(AtomicSequenceConverter。 java:311)在net.sf.sax.sax.saxon的net.sf.saxon.expr.AtomicSequenceConverter.evaluateItem(AtomicSequenceConverter.java:34)at net.sf.saxon.expr.instruct.ValueOf.evaluateItem(ValueOf.java:313) .expr.instruct.ValueOf.evaluateItem(ValueOf.java:45)at net.sf.saxon.expr.instruct.SimpleNodeConstructor.iterate(SimpleNodeConstructor.java:281)at net.sf.saxon.expr.instruct.BlockIterator.next (BlockIterator.java:49)在net.sf.saxon.expr .instruct.Message.processLeavingTail(Message.java:214)at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:657)at net.sf.saxon.expr.instruct.TemplateRule.applyLeavingTail(TemplateRule) .java:393)net.sf.saxon.trans.Mode.applyTemplates(Mode.java:456)at net.sf.sax.sax上的net.sf.saxon.trans.TextOnlyCopyRuleSet.process(TextOnlyCopyRuleSet.java:65)。在net.sf的net.sf.saxon.Controller.transform(Controller.java:1889)的net.sf.saxon.Controller.transformDocument(Controller.java:2291)中的trans.Mode.applyTemplates(Mode.java:433)位于com.sthbs.viniReq.TransformXsl.main的net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:183)中的.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:553)(TransformXsl.java:90 )

这是我的java代码:

 public static void main(String[] args) throws XPathException { 

   System.setProperty("javax.xml.transform.TransformerFactory","net.sf.saxon.TransformerFactoryImpl");  

    EnterpriseConfiguration config=new EnterpriseConfiguration();
    config.setExtensionElementNamespace("http://ns.saxonica.com/sql", "net.sf.saxon.option.sql.SQLElementFactory");

    EnterpriseTransformerFactory factory = new EnterpriseTransformerFactory();
    factory.setConfiguration(config);
    try {  
        Transformer transformer =  factory.newTransformer(new StreamSource(new File(xslt)));

         transformer.transform(new StreamSource(new File(xml)),  
                              new StreamResult(new File(resultDir))); 

       transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    } catch (Exception e) {  
        e.printStackTrace();  
    }  

这是我的XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:sql="http://ns.saxonica.com/sql"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:java="http://saxon.sf.net/java-type"
 xmlns:saxon="http://saxon.sf.net/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 exclude-result-prefixes="java saxon xsd xsi xsl"
 extension-element-prefixes="saxon sql"
 >
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"
/>

<!-- Database Querying -->
<xsl:param name="jdbc.driver"   as="xsd:string" select="'oracle.jdbc.OracleDriver'" />
<xsl:param name="jdbc.database" as="xsd:string" select="'jdbc:oracle:thin:@localhost:1521:orclaq'" />
<xsl:param name="jdbc.user" as="xsd:string" select="'artl'" />
<xsl:param name="jdbc.pass" as="xsd:string" select="'artl'" />

<xsl:template match="OrderSubline">

<xsl:variable name="sql.conn" as="java:java.sql.Connection">
              <sql:connect driver="{$jdbc.driver}" database="{$jdbc.database}" user="{$jdbc.user}" password="{$jdbc.pass}">
                <xsl:fallback>
                  <xsl:message terminate="yes">SQL extenstions are not installed</xsl:message>
                </xsl:fallback>
              </sql:connect>
</xsl:variable>
<xsl:variable name="queue-table">
    <sql:query connection="$sql.conn" table="QUEUE_CONFIG" column="QUEUE_NAME" row-tag="book" column-tag="col" where="QUEUE_NAME='TVXX_INPT'"/>

</xsl:variable>
<xsl:variable name="queue-id">
    <sql:query connection="$sql.conn" table="QUEUE_CONFIG" column="QUEUE_ID" row-tag="book" column-tag="col" where="QUEUE_NAME='TVXX_INPT'"/>
</xsl:variable>
<xsl:message>queue name is <xsl:value-of select="$queue-table"/></xsl:message>

<RequestHeader>
<NeType><xsl:value-of select="$queue-table"/></NeType>
<OrderNo>100001</OrderNo>
<ReqUser>ff</ReqUser>
</RequestHeader>
</xsl:template>

</xsl:stylesheet>

如果我错过了什么,请告诉我。因为我在过去的3天里被困在里面。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我无法立即看到这里出了什么问题,但我想到的第一种可能性,即应该被调查并消除的可能原因是,许可证文件不是找到。 (这会导致Saxon基本上以Saxon-HE模式运行。)既然你已经掌握了Configuration对象,那么最简单的检查方法就是

config.isLicensedFeature(Configuration.LicenseFeature.ENTERPRISE_XSLT)

如果它确实是许可证问题,那么我们需要查看类路径。我注意到你在Eclipse中运行,在Eclipse中动态加载可能相当古怪。