如何在Tomcat 9上使用Saxon

时间:2019-06-11 02:55:45

标签: tomcat xslt saxon

我们正在CentOS 7.6,tomcat 9.0.20和OpenJDK11下使用XSLT构建应用程序。

我想使用XSL转换和输出JSP文件中定义的XML文档,但输出以下错误消息, 我不能使用saxon扩展名。

[错误消息] net.sf.saxon.trans.XPathException:未知的扩展指令saxon:while

您可以在CentOS 6.x,tomcat 8.0.9和Oracle JDK 1.8.112环境中使用saxon扩展。

如果您知道如何解决错误,请告诉我们您需要什么信息。

下面是设置环境后检查操作的步骤以及错误消息的详细信息。

  1. 创建JSP文件和XSL文件,并将它们放在Tomcat示例下。

[SaxonSample.jsp:/opt/tomcat/webapps/examples/jsp/xml/SaxonSample.jsp]

    <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix = "x" uri = "http://java.sun.com/jsp/jstl/xml" %>

    <html>
       <head>
          <title>JSTL x:transform Tags</title>
       </head>
       <body>
          <h3>Books Info:</h3>
          <c:set var = "xmltext">
             <books>
                <book>
                   <name>Padam History</name>
                   <author>ZARA</author>
                   <price>100</price>
                </book>

                <book>
                   <name>Great Mistry</name>
                   <author>NUHA</author>
                   <price>2000</price>
                </book>
             </books>
          </c:set>
          <c:import url = "http://server_ip:8080/examples/jsp/xml/style.xsl" var = "xslt"/>
          <x:transform xml = "${xmltext}" xslt = "${xslt}"/>
       </body>
    </html>

[style.xsl:/opt/tomcat/webapps/examples/jsp/xml/style.xsl]

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:saxon="http://saxon.sf.net/"
            extension-element-prefixes="saxon"
    >

    <xsl:variable name="i" select="0" saxon:assignable="yes"/>
    <xsl:output method = "html" indent = "yes"/>
       <xsl:template match = "/">
          <html>
             <body>
                <xsl:apply-templates/>
             </body>
          </html>
          <saxon:while test="$i &lt; 10">
              <p>The value of i is <xsl:value-of select="$i"/></p>
              <saxon:assign name="i" select="$i+1"/>
          </saxon:while>
       </xsl:template>
       <xsl:template match = "books">
          <table border = "1" width = "100%">
             <xsl:for-each select = "book">
                <tr>
                   <td>
                      <i><xsl:value-of select = "name"/></i>
                   </td>
                   <td>
                      <xsl:value-of select = "author"/>
                   </td>
                   <td>
                      <xsl:value-of select = "price"/>
                   </td>
                </tr>
             </xsl:for-each>
          </table>
       </xsl:template>
    </xsl:stylesheet>
  1. 将saxon库放在下面,然后重新启动tomcat

    ・ Saxon9pe.jar ・ Saxon9pe-test.jar ・ Saxon9-sql.jar ・ Saxon-license.lic

位置:[/ opt / tomcat / lib]和[/ opt / tomcat / webapps / examples / WEB-INF / lib /]

[错误消息详细信息]

    net.sf.saxon.trans.XPathException: Unknown extension instruction saxon:while
        net.sf.saxon.expr.ErrorExpression.evaluateItem(ErrorExpression.java:137)
        net.sf.saxon.expr.Expression.process(Expression.java:929)
        net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:689)
        net.sf.saxon.expr.instruct.TemplateRule.applyLeavingTail(TemplateRule.java:347)
        net.sf.saxon.trans.Mode.applyTemplates(Mode.java:505)
        net.sf.saxon.Controller.transformDocument(Controller.java:2411)
        net.sf.saxon.Controller.transform(Controller.java:1979)
        net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:596)
        net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:73)
        org.apache.taglibs.standard.tag.common.xml.TransformSupport.doEndTag(TransformSupport.java:151)
        org.apache.jsp.jsp.xml.SaxonSample_jsp._jspx_meth_x_005ftransform_005f0(SaxonSample_jsp.java:281)
        org.apache.jsp.jsp.xml.SaxonSample_jsp._jspService(SaxonSample_jsp.java:154)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:444)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

1 个答案:

答案 0 :(得分:0)

这看起来像是配置问题,无法获取许可证文件。

仅将许可证文件与JAR文件放在同一文件夹中的机制在某些环境下有效,而在其他环境下则无效;这取决于用来加载Saxon类的类加载器(出于安全原因,某些类加载器不允许Saxon发现从其加载的位置)。

我看到您正在通过JAXP界面调用Saxon。

如果在TransformerFactory上将功能“ http://saxon.sf.net/feature/timing”设置为true,则将有消息记录到System.err,其中显示了搜索许可证文件的进度,这可能有助于诊断。如果无法确定Tomcat将System.err输出放置的位置,则可以通过将TransformerFactory强制转换为TransformerFactoryImpl并调用getConfiguration().setStandardErrorOutput(printStream)来重定向它。

或者,您可以尝试将"http://saxon.sf.net/feature/licenseFileLocation"上的属性TransformerFactory设置为许可证文件的完整路径。