Java/撒克逊 : Running an XSL function programmatically

标签 java xslt saxon

我有一个定义了多个函数的 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>
  1. 将上述样式表模块加载为 XmlDocument。

  2. 问题:SelectNodes("/*/xsl:variable[@name='vResult']/@select")

  3. 使用 DOM API 将所选属性的值修改为所需的值,例如:my:foo(1,2,3)

  4. 使用已加载(且动态修改的样式表)启动转换。

我多年来一直使用 XPath Visualizer 2(用于 XSLT 2.0 - 未发布)作为 FXSL 函数的命令行解释器。我可以自由地写:

f:fold(f:mult(), 1, 1 to 4)

并显示正确的结果:

24

以下是使用 XPath Visualizer 2 作为 FXSL 解释器的屏幕截图:

enter image description here

关于Java/撒克逊 : Running an XSL function programmatically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7789863/

相关文章:

Java使用对象的类来创建泛型类型这可能吗?

xquery - 调用 XQuery 更新函数会导致错误 如果任何子表达式正在更新,则所有子表达式都必须更新

java - 如何获得数组中五个最少重复的元素

java - Mockito:使用泛型参数进行验证

java - 如何插入 Quickblox 自定义对象上的数组?

xml - 使用 XSLT 访问 XML

java - Servlet 无法从 AJAX 调用中检索参数

xslt - 在 xpath 中连接两个字符串序列

java - 在没有自定义内容处理程序的情况下转换流式 XSLT

java - 从java中的xpath表达式中提取所有变量引用的最安全方法