我在使用Xalan的业务流程中有几个XSL转换,其中这些步骤之一将生成具有静态Java扩展功能的XSL样式表。

我想用Saxon替换Xalan(不仅因为性能问题,而且也因为使用XSLT2)。

我知道在XSL中要进行哪些更改才能使Saxon使用这些功能。而且效果很好(通过Xalan优化的XSL,我的加速比提高了40,而RAM的使用率只有一半)。

我的问题是,这些生成的XSL样式表被“缓存” /存储了大量,“刷新”它们将是极大的痛苦(或不可能)。

我的问题是,是否可以使XSL与Saxon一起使用而无需更改它们或预处理XML(修改SAX-Parser或StringReplacing等)?

目前,我需要更改名称空间和函数调用,因为在Xalan中,我在名称空间中使用了包,而Saxon(似乎)想要该类。

我完全控制“ de.server.macro”的程序包和类结构以及代码。

(用于测试)我正在使用Saxon-9B,但最终它将是Saxon-PE或Saxon-EE。

这是我的最小化示例:

Xalan

<?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的资源(博客文章和书籍),但是基于这些信息,答案似乎是“否”。

但是也许我错过了Saxon中某些或某些可能的映射机制来模拟正确的行为?

最佳答案

我认为有一部分格式可以在Xalan和Saxon中使用。例如,如果使用Xalan所谓的“类格式”名称空间

xmlns:String="xalan://java.util.Hashtable"


那么您应该能够调用静态方法,例如

String:valueOf($x)


在任一产品中;对于Saxon,您需要设置配置属性FeatureKeys.ALLOW_OLD_JAVA_URI_FORMAT

关于xslt - 使用Java扩展将Xalan替换为Saxon for XSL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32093005/

10-15 06:22