我在使用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.html和http://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/