gpt4 book ai didi

tomcat - 如何在 Tomcat 9 上使用撒克逊

转载 作者:行者123 更新时间:2023-11-28 23:12:08 25 4
gpt4 key购买 nike

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

我想用XSL转换并输出定义在JSP文件中的XML文档,但是输出了如下错误信息,我无法使用撒克逊扩展。

[错误信息]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>

[样式.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)

最佳答案

这看起来确实像是获取许可文件的配置问题。

将许可证文件简单地放在与 JAR 文件相同的文件夹中的机制在某些环境中有效,但在其他环境中无效;这取决于用于加载 Saxon 类的类加载器(出于安全原因,某些类加载器不允许 Saxon 发现它的加载位置)。

我看到您正在通过 JAXP 接口(interface)调用 Saxon。

如果您在 TransformerFactory 上将功能“http://saxon.sf.net/feature/timing”设置为 true,那么将有消息记录到 System.err 中,显示搜索许可文件的进度,这可能有助于诊断。如果您不知道 Tomcat 将 System.err 输出放在哪里,那么您可以通过将 TransformerFactory 转换为 TransformerFactoryImpl 并调用 getConfiguration( ).setStandardErrorOutput(printStream).

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

关于tomcat - 如何在 Tomcat 9 上使用撒克逊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56535863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com