我收到以下错误:
javax.servlet.ServletException: Cannot find a matching 1-argument function named {http://exslt.org/dynamic}evaluate()
at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:841)
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:774)
Run Code Online (Sandbox Code Playgroud)
我的xslt文件的顶部是
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:dyn="http://exslt.org/dynamic"
extension-element-prefixes="dyn">
Run Code Online (Sandbox Code Playgroud)
你知道为什么我会收到这个错误吗?
UPDATE
我的XML文件的顶部现在读取.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:xalan="http://xml.apache.org/xalan"
exclude-result-prefixes="xalan">
Run Code Online (Sandbox Code Playgroud)
我们失败的XML是
<xsl:template name="test">
<xsl:param name="param" />
<xsl:value-of select="$param"/>
<xsl:value-of select="xalan:evaluate($param)"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
此代码适用于运行Tomcat 5.0的一台服务器,但不能在运行Tomcat 5.5的服务器上运行.我想是因为代码在一台服务器上运行而不是环境问题.
XSLT通过JSP页面应用于XML.对我来说,看起来没有使用xalan.jar文件.JSP的顶部是:
<%@page import="javax.xml.transform.*"%>
<%@page import="javax.xml.transform.stream.*"%>
<%@page import=" java.security.Principal,
java.net.URL,
java.net.URLConnection,
java.io.InputStream,
java.io.InputStreamReader,
java.io.Reader,
java.io.BufferedReader,
java.io.File,
javax.xml.transform.*,
javax.xml.transform.stream.*,
javax.xml.transform.*,
javax.xml.transform.stream.*"%>
Run Code Online (Sandbox Code Playgroud)
更新 问题是Saxon被选为XML解析器.Saxon不支持此功能.删除Saxon.jar可以解决问题.
我在我的应用程序中使用Xalan,但需要使用Saxon和参考实现来生成测试输出以进行比较.我想在单元测试中使用它们.但是,一旦我在项目.pom中添加对Saxon的依赖,应用程序似乎在测试期间对所有xslt和XPath操作使用Saxon:
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId>
<version>9.4</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这使得主应用程序在生成输出时由于不同的XPath行为而失败.在测试范围之外运行主应用程序时,它可以工作.
如何使用Xalan运行主应用程序,但在测试期间使用Saxon进行测试?
我在运行Xalan和Saxon部件之前尝试设置以下属性:
System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl ");
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
Run Code Online (Sandbox Code Playgroud)
我也尝试将Xalan和Saxon部件放在不同的项目中,我也尝试在第三个项目中使用它们,结果相同.
我有一些代码:
XMLInputFactory xif = XMLInputFactory.newInstance()
TransformerFactory tf = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl", null)
Transformer t = tf.newTransformer()
DOMResult result = new DOMResult()
t.transform(new StAXSource(reader), result)
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
抓到:javax.xml.transform.TransformerException:无法转换类型为javax.xml.transform.stax.StAXSource的Source
读者对象属于类型 com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl
在jdk1.6中,当我设置
transformerFactory.setFeature(XMLConstants.ACCESS_EXTERNAL_DTD, false)
Run Code Online (Sandbox Code Playgroud)
我遇到以下错误:
javax.xml.transform.TransformerConfigurationException:无法在此TransformerFactory上设置功能' http://javax.xml.XMLConstants/property/accessExternalDTD '。在org.apache.xalan.processor.TransformerFactoryImpl.setFeature(TransformerFactoryImpl.java:418)
就像我在这里找到的一样:如何防止具有META-INF \ services \ javax.xml.transform.TransformerFactory的xalan.jar接管Xalan实现中内置的JDK 1.6? 我无法进行此处建议的更改,因为管理员还会查看其他API冲突。
并按此链接:http : //xml.apache.org/xalan-j/features.html#domsource
您可以使用该TransformerFactory.setFeature(String, boolean)方法来设置功能的值。Xalan-Java仅支持设置XMLConstants.FEATURE_SECURE_PROCESSING功能。对于所有其他功能,TransformerFactory公开其值,但不能更改其状态。
因此,如果使用TransormerFactory的xalan实现,似乎只能设置此功能。
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Run Code Online (Sandbox Code Playgroud)
最后我的问题:如果我们设置功能:
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Run Code Online (Sandbox Code Playgroud)
然后是另一个功能(XMLConstants.ACCESS_EXTERNAL_DTD)自动设置为false。
我从设置的日志中获得了上述功能“ false”。但是我想确定是否accessExternalDTD默认将功能设置为false或将安全处理功能设置为true。
与使用STX(使用Joost)相比,我在哪里可以找到使用XSLT(使用Xalan)的非平凡示例的性能指标(内存/时间)
假设我们有这个简单的xml ...
<books>
<book>
<author/>
<title/>
</book>
<book>
<author/>
<title/>
</book>
</books>
Run Code Online (Sandbox Code Playgroud)
我正在使用此xpath来获取第一个book实例的元素.
//books[1]/*
Run Code Online (Sandbox Code Playgroud)
返回
<author/>
<title/>
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我必须使用local-name().我试过以下但没有一个工作......
//*[local-name()='books']/*
Run Code Online (Sandbox Code Playgroud)
这会返回重复的作者和标题元素,不好,我只需要第一个孩子
//*[local-name()='books'][0]/*
Run Code Online (Sandbox Code Playgroud)
这不会返回任何东西
基本上,我想创建一个CSV文件,因此输出中的第一行将是一个标题,列出书籍属性名称,后跟任意数据值.我只需要让标题部分工作.
author,title
john,The End is Near
sally,Looking for Answers
Run Code Online (Sandbox Code Playgroud) 我的junit测试从我的Eclipse环境中通过ant 1.7运行,但是在执行junitreport任务时构建失败:
BUILD FAILED .../build.xml:222:应用转换时的错误:javax.xml.transform.TransformerException:java.lang.RuntimeException:使用扩展函数'xalan://org.apache.tools.ant.util当安全处理功能设置为true时,不允许使用.stringUtils:replace'.
我试图弄清楚如何使junitreport任务禁用安全处理功能(我不需要并且此时只是我的方式)但我不知道如何因为任务没有要禁用的属性它.或者我应该做些什么来使这项工作?
docx4j使用Xalan将docx转换为HTML,并且在很大程度上依赖于Xalan Java扩展来完成工作.
但Xalan扩展在Android上不适用于我(使用4.0.3).LogCat说:
05-14 15:38:02.840: I/dalvikvm(7249): DexOpt: illegal method access (call Lorg/apache/xalan/extensions/ExtensionHandler;.getClassForName (Ljava/lang/String;)Ljava/lang/Class; from Lorg/apache/xalan/extensions/ExtensionHandlerJavaPackage;)
05-14 15:38:02.840: I/dalvikvm(7249): Could not find method org.apache.xalan.extensions.ExtensionHandler.getClassForName, referenced from method org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction
05-14 15:38:02.840: W/dalvikvm(7249): VFY: unable to resolve static method 21489: Lorg/apache/xalan/extensions/ExtensionHandler;.getClassForName (Ljava/lang/String;)Ljava/lang/Class;
05-14 15:38:02.840: D/dalvikvm(7249): VFY: replacing opcode 0x71 at 0x0096
05-14 15:38:02.840: I/dalvikvm(7249): Could not find method org.apache.xalan.transformer.TransformerImpl.getDebug, referenced from method org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction
05-14 15:38:02.840: W/dalvikvm(7249): VFY: unable to resolve virtual method 23717: Lorg/apache/xalan/transformer/TransformerImpl;.getDebug ()Z
05-14 15:38:02.840: D/dalvikvm(7249): VFY: replacing opcode 0x74 at …Run Code Online (Sandbox Code Playgroud) 现在是 2018 年。用于 Java的Xerces2 XML 解析器和Xalan XSLT 处理器库的状态如何?他们的最新版本似乎分别是2013 年的 2.11.0和2014年的2.7.2。
他们还在维护吗?
它们是否完美到甚至不需要偶尔发布补丁?
是否有来自不同供应商的替代库可供使用?这些替代品是否与这两种替代品一样免费?
使用 JDK 提供的功能,通常可以没有这些吗?
我有以下代码:
final TransformerFactory factory = TransformerFactory.newInstance();
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
Run Code Online (Sandbox Code Playgroud)
第二行在带有默认值的现代JDK(我尝试过1.8)中运行良好TransformerFactory。但是,当我xalan向类路径添加(最新的版本2.7.2)时,在第二行得到以下内容:
Exception in thread "main" java.lang.IllegalArgumentException: Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD
at org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:571)
at Main.main(Main.java:11)
Run Code Online (Sandbox Code Playgroud)
我猜这是因为xalan's TransformerFactory不支持此属性。Xalan的实现通过以下ServiceLoader机制获得:services/javax.xml.transform.TransfomerFactory在xalan jar中指定。
可以TransformerFactory使用javax.xml.transform.TransformerFactory系统属性或$JRE/lib/jaxp.properties文件覆盖实现,也可以直接在代码中传递类名称。但是要做到这一点,我必须提供一个具体的类名。现在是com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl,但是在系统属性中对其进行硬编码有点吓人,因为在JDK升级中,它们可以轻松更改类名,而我们只会遇到运行时错误。
有什么方法可以指示TransformerFactory.newInstance()忽略Xalan提供的实现吗?或告诉它“仅使用系统默认值”。
PS我不能仅仅xalan从类路径中删除,因为我们使用的许多其他库都依赖于它。