Как использовать саксон на Tomcat 9 - PullRequest
0 голосов
/ 11 июня 2019

Мы создаем приложения с использованием XSLT под CentOS 7.6, tomcat 9.0.20 и OpenJDK11.

Я хочу преобразовать и вывести XML-документ, определенный в файле JSP с XSL, но следующее сообщение об ошибке:вывод, я не могу использовать расширение саксонии.

[сообщение об ошибке] net.sf.saxon.trans.XPathException: неизвестная инструкция расширения саксон: пока

Вы можете использовать расширение саксон в CentOS6.x, tomcat 8.0.9 и среды Oracle JDK 1.8.112.

Если вы знаете, как устранить ошибку, сообщите нам, какая информация вам нужна.

Ниже приведены шагидля проверки операции после настройки среды и подробных сообщений об ошибке.

  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>

Поместите саксонскую библиотеку ниже и перезапустите 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 голосов
/ 11 июня 2019

Это похоже на проблему конфигурации при получении файла лицензии.

Механизм простого помещения файла лицензии в ту же папку, что и файл JAR, работает в некоторых средах, но не в других; это зависит от того, какой загрузчик классов используется для загрузки классов Saxon (некоторые загрузчики классов не позволяют Saxon обнаруживать местоположение, из которого он был загружен по соображениям безопасности).

Я вижу, что вы вызываете Saxon через интерфейсы JAXP.

Если вы установите для параметра "http://saxon.sf.net/feature/timing" значение true в TransformerFactory, то в System.err будут записываться сообщения, показывающие ход поиска файла лицензии, что может быть полезно для диагностики. Если вы невозможно определить, куда Tomcat выводит вывод System.err, тогда вы можете перенаправить его, приведя TransformerFactory к TransformerFactoryImpl и вызвав getConfiguration().setStandardErrorOutput(printStream).

В качестве альтернативы вы можете попытаться установить для свойства "http://saxon.sf.net/feature/licenseFileLocation" на TransformerFactory полный путь к файлу лицензии.

...