标签: xalan

Java/XSLT:找不到匹配的1参数函数

我收到以下错误:

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可以解决问题.

java xslt jsp tomcat xalan

7
推荐指数
1
解决办法
8149
查看次数

使用Xalan和Saxon一起使用

我在我的应用程序中使用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部件放在不同的项目中,我也尝试在第三个项目中使用它们,结果相同.

xslt xpath saxon xalan maven

7
推荐指数
1
解决办法
4352
查看次数

用Java转换StAX源代码

我有一些代码:

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

java stax xalan xml-parsing

7
推荐指数
1
解决办法
4815
查看次数

在TransformerFactory中设置FEATURE_SECURE_PROCESSING是否还会更新其他安全功能?

在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。

java xerces xalan

7
推荐指数
2
解决办法
5507
查看次数

XSL与Xalan与STX与Joost

与使用STX(使用Joost)相比,我在哪里可以找到使用XSLT(使用Xalan)的非平凡示例的性能指标(内存/时间)

xslt performance xalan stx

6
推荐指数
1
解决办法
1902
查看次数

使用local-name()在XSLT中获取第一个子节点

假设我们有这个简单的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)

xml xslt xpath xalan xslt-1.0

6
推荐指数
2
解决办法
4万
查看次数

由于Xalan(XSLT)安全处理功能,Ant <junitreport>失败

我的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任务禁用安全处理功能(我不需要并且此时只是我的方式)但我不知道如何因为任务没有要禁用的属性它.或者我应该做些什么来使这项工作?

eclipse ant xslt xalan

6
推荐指数
1
解决办法
4156
查看次数

是否可以从Android上的Xalan调用Java扩展函数?

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)

java xslt android dalvik xalan

6
推荐指数
1
解决办法
1119
查看次数

Xerces2 XML 解析器和 Xalan XSLT 处理器——状态和替换?

现在是 2018 年。用于 Java的Xerces2 XML 解析器Xalan XSLT 处理器库的状态如何?他们的最新版本似乎分别是2013 年的 2.11.02014年的2.7.2

  • 他们还在维护吗?

  • 它们是否完美到甚至不需要偶尔发布补丁?

  • 是否有来自不同供应商的替代库可供使用?这些替代品是否与这两种替代品一样免费?

  • 使用 JDK 提供的功能,通常可以没有这些吗?

java xml xslt xalan xerces2-j

6
推荐指数
2
解决办法
1123
查看次数

是否可以避免使用xalan TransformerFactory?

我有以下代码:

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从类路径中删除,因为我们使用的许多其他库都依赖于它。

java xml xalan

6
推荐指数
1
解决办法
1945
查看次数

标签 统计

xalan ×10

xslt ×7

java ×6

xml ×3

xpath ×2

android ×1

ant ×1

dalvik ×1

eclipse ×1

jsp ×1

maven ×1

performance ×1

saxon ×1

stax ×1

stx ×1

tomcat ×1

xerces ×1

xerces2-j ×1

xml-parsing ×1

xslt-1.0 ×1