xslt - 将 Xalan 替换为 Saxon for XSL with Java-Extension

标签 xslt saxon xalan

我在 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.htmlhttp://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/

相关文章:

xml - xslt fn :replace not working as expected

xml - XSLT 嵌套选择

xml - 使用单个 XSL 流将一个大型 XML 文件拆分为多个文件

xpath - XPath 3.1 中 map 的目的/用途是什么?

xml - 从某些定义的 XPATH 生成 XML

xslt - 使用 document() 在 XSLT 中交叉引用和扩充 XML 元素的问题

c# - 如何在 .NET XslCompiledTransform 中使用 XPath 表达式 "document(' ')"?应该吗?

xpath - XSD 1.1 断言依赖于实现的结果

java - jboss 7.1 xalan 问题?

java - 有没有办法在 JAXP 或 Xalan XSLT 范围内绑定(bind) Java 对象?