我在 Xalan 的业务流程中有几个 XSL 转换,其中这些步骤之一生成具有静态 Java 扩展功能的 XSL 样式表。
我想用 Saxon 替换 Xalan(不仅是为了性能问题,也是为了使用 XSLT2)。
我知道要在 XSL 中更改什么才能让 Saxon 使用这些函数。它运行良好(使用 Xalan 优化的 XSL,我获得了 40 的加速并且只使用了一半的 RAM)。
我的问题是这些生成的 XSL 样式表被“缓存”/大量存储,“刷新”它们将是一个巨大的痛苦(或不可能)。
我的问题是我是否可以在不更改 XSL 或预处理 XML(修改 SAX-Parser 或 StringReplaceing 等)的情况下设法让 XSL 与 Saxon 一起使用?
目前我需要更改命名空间和函数调用,因为在 Xalan 中我使用了命名空间中的包,而 Saxon(似乎)想要这个类。
我可以完全控制“de.server.macro”的包和类结构和代码。
(用于测试)我使用的是 Saxon-9B,但最终它会是 Saxon-PE 或 Saxon-EE。
这是我的最小化示例:
夏兰
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:macro="xalan://de.server.macro">
<xsl:template match="/">
<output>
<xsl:text>Hello World!</xsl:text>
<mymacro>
<xsl:variable name="foo">5</xsl:variable>
<xsl:value-of select="macro:data.setVar('testdata', $foo)"/>
<xsl:value-of select="macro:data.getVar('testdata')"/>
</mymacro>
</output>
</xsl:template>
撒克逊
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:macro="de.server.macro.data">
<xsl:template match="/">
<output>
<xsl:text>Hello World!</xsl:text>
<mymacro>
<xsl:variable name="foo">5</xsl:variable>
<xsl:value-of select="macro:setVar('testdata', $foo)"/>
<xsl:value-of select="macro:getVar('testdata')"/>
</mymacro>
</output>
</xsl:template>
我知道 http://xml.apache.org/xalan-j/extensions.html和 http://www.saxonica.com/documentation9.5/extensibility/functions/staticmethods.html以及其他一些关于 xslt-extensions 的资源(博客文章和书籍),但根据这些信息,答案似乎是否定的。
但也许我错过了撒克逊中的某些东西或一些可能的映射机制来模拟正确的行为?
最佳答案
我认为有一部分格式可以在 Xalan 和 Saxon 中使用。例如,如果您使用 Xalan 所谓的“类格式”命名空间
xmlns:String="xalan://java.util.Hashtable"
那么你应该能够调用静态方法,例如
String:valueOf($x)
在任一产品中;在 Saxon 的情况下,您需要设置配置属性 FeatureKeys.ALLOW_OLD_JAVA_URI_FORMAT
关于xslt - 将 Xalan 替换为 Saxon for XSL with Java-Extension,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32093005/