我有一个定义了多个函数的 XSL。
我想编写 Java 代码,它采用 XSL 函数的名称(和参数列表)并运行该函数(当然,还将参数绑定(bind)到函数的形式参数)。
到目前为止,我唯一的解决方案是使用运行所选函数的主模板动态生成 XSL 代码。这是相当尴尬的。我正在寻找一种解决方案,让我可以直接通过 Saxon API 运行函数。
最佳答案
XPath Visualizer 执行此操作的方式(无论使用哪种 XSLT 处理器)是将主 XSL 样式表作为 XML 文档加载,并使用必要的 XPath 表达式动态修改一个 select
属性。
类似这样的:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="yourTrueMainStylesheetModule"/>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vResult" select="."/>
<xsl:template match="/">
<xsl:sequence select="$vResult"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
将上述样式表模块加载为 XmlDocument。
问题:
SelectNodes("/*/xsl:variable[@name='vResult']/@select")
使用 DOM API 将所选属性的值修改为所需的值,例如:
my:foo(1,2,3)
。使用已加载(且动态修改的样式表)启动转换。
我多年来一直使用 XPath Visualizer 2(用于 XSLT 2.0 - 未发布)作为 FXSL 函数的命令行解释器。我可以自由地写:
f:fold(f:mult(), 1, 1 to 4)
并显示正确的结果:
24
以下是使用 XPath Visualizer 2 作为 FXSL 解释器的屏幕截图:
关于Java/撒克逊 : Running an XSL function programmatically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7789863/