我们正在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扩展。
如果您知道如何解决错误,请告诉我们您需要什么信息。
下面是设置环境后检查操作的步骤以及错误消息的详细信息。
[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 < 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>
将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)
答案 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
设置为许可证文件的完整路径。