将外部函数用于 XSLT
使用 XSLT 样式表(使用了外部函数)时,使用 XStaticContext 实例声明函数特征符,并使用 XDynamicContext 实例为各个函数提供(或绑定)Java 实现。
过程
- 准备 XSLT 样式表(使用了外部函数)时,使用 XStaticContext 实例声明函数特征符。
XStaticContext 接口具有两种 declareFunction 方法,每种方法具有三个参数:一个参数用于名称,一个参数用于函数的返回类型,一个数组用于自变量的类型。始终将名称作为 QName 对象提供,但类型可以为 QNames 或 XSequenceTypes。函数名称、返回类型和自变量类型必须唯一标识该函数。
样式表函数可以具有与外部函数相同的名称。如果样式表函数具有值为 yes 的 override 属性,那么样式表中此函数名称的任何引用是样式表函数的引用;如果它具有值为 no 的 override 属性,那么它是外部函数的引用。
表 1. XStaticContext declareFunction 方法. 此表说明何时使用各种格式的 declareFunction 方法。
方法特征符 用途 declareFunction(QName name, QName type, QName[] argTypes) 用于当函数的返回值和自变量都为单一原子值的情况 类型 QName 必须引用模式中声明的内置类型或全局类型,此模式已在用于创建 XStaticContext 实例的 XFactory 实例上注册。如果 QName 引用非原子类型,那么处理器会将其视为 type 元素 (*, ns:type),其中 ns:type 是给定的 QName。XTypeConstants 接口具有可用的方便常量,这些常量为各种内置类型提供 QName 对象。
declareFunction(QName name, XSequenceType type, XSequenceType[] argTypes) 用于在函数的任何自变量或返回值为节点、原子值序列或节点序列的情况 以下样式表使用 QName ext:pow 引用的外部函数。<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://www.example.com/functions" version="2.0"> <xsl:output method="text"/> <xsl:template match="polynomial"> <xsl:variable name="p" select="."/> <xsl:for-each select="1 to 5"> <xsl:text>x = </xsl:text> <xsl:value-of select="."/> <xsl:text>; </xsl:text> <xsl:value-of select="for $t in $p/term return concat($t/@coefficient, 'x^', $t/@power)" separator=" + "/> <xsl:text> = </xsl:text> <xsl:value-of select="sum($p/term/(ext:pow(current(), @power) * @coefficient))"/> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
假定使用 xsltSource 源对象提供了给定的样式表,那么以下代码用于准备该样式表。// Create the factory XFactory factory = XFactory.newInstance(); // Create a new static context XStaticContext staticContext = factory.newStaticContext(); // Declare a namespace for the function staticContext.declareNamespace("ext", "http://www.example.com/functions"); // Create a QName for the name of the function QName methodQName = new QName("http://www.example.com/functions", "pow"); // Declare the function on the static context staticContext.declareFunction(methodQName, XTypeConstants.DOUBLE_QNAME, new QName[]{XTypeConstants.DOUBLE_QNAME, XTypeConstants.DOUBLE_QNAME}); // Create an XSLT executable for the stylesheet XSLTExecutable executable = factory.prepareXSLT(xsltSource, staticContext);
- 要执行使用外部函数的 XSLT 样式表,请使用 XDynamicContext 实例提供(或绑定)实现函数的 Java 方法。
使用 Java 反映以获取此函数的 java.lang.reflect.Method 对象。如果方法为实例方法,那么绑定此函数时需要实例对象。
如果没有为执行 XSLT 样式表时使用的函数提供 Java 方法,那么会发生错误。
XDynamicContext 具有两种 bindFunction 方法。每种方法需要对应于该函数的名称的 QName 对象,以及标识将提供此函数的实现的 Java 方法的方法对象。表 2. XDynamicContext bindFunction 方法. 此表说明何时使用各种格式的 XDynamicContext bindFunction 方法。
方法名 用途 bindFunction(QName qname, Method method) 用于绑定静态方法的情况 bindFunction(QName qname, Method method, Object instanceObject) 用于绑定实例方法的情况 以下示例执行第一个示例中准备的 XSLT 样式表,同时首先绑定它所使用的函数的方法。在此示例中,将 java.lang.Math 类的静态 pow(double a, double b) 方法用于提供外部函数的实现。// Create a new dynamic context XDynamicContext dynamicContext = factory.newDynamicContext(); // Retrieve the java.lang.reflect.Method object for this function Method method = Math.class.getMethod("pow", Double.TYPE, Double.TYPE); // Bind the function to the dynamic context dynamicContext.bindFunction(methodQName, method); // Create an XML input document String xml = "<polynomial>" + "<term power='2' coefficient='3'/>" + "<term power='1' coefficient='-2'/>" + "<term power='0' coefficient='1'/>" + "</polynomial>"; StreamSource source = new StreamSource(new StringReader(xml)); // Execute the stylesheet XSequenceCursor result = executable.execute(source, dynamicContext); // Serialize the result to System.out result.exportItem(new StreamResult(System.out), executable.getOutputParameters());
子主题
将 stylesheet-declared 外部函数用于 XSLT
作为使用 API 将 Java 方法绑定到样式表中函数的备用方法,可以直接在样式表中声明 Java 外部函数。唯一需要的其他配置是在样式表执行期间,绑定的 Java 类位于类路径上。


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_funcs_xslt
文件名:txml_funcs_xslt.html