将 stylesheet-declared 外部函数用于 XSLT

作为使用 API 将 Java™ 方法绑定到样式表中函数的备用方法,可以直接在样式表中声明 Java 外部函数。唯一需要的其他配置是在样式表执行期间,绑定的 Java 类位于类路径上。

过程

使用 ava-extension 元素,您可以将前缀绑定到 Java 类。
<xltxe:java-extension
prefix = string
class = string /> 
注: 只要将任何前缀名称绑定到 http://www.ibm.com/xmlns/prod/xltxe-j 名称空间,即可将其用于 java-extension 元素。
将前缀绑定到 Java 类后,可以通过指定按逗号分隔的前缀和方法名称,调用绑定的类中的方法。
prefix:methodName(Params*)

示例

调用静态方法

准备 XSLT 样式表(使用 stylesheet-declared 外部函数)时,声明 Java 类绑定的前缀:
<xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xltxe="http://www.ibm.com/xmlns/prod/xltxe-j"
     xmlns:calc="http://com.example/myApp/calculator"
     xmlns:sf="http://com.example/myApp/standardFormat">
 
<xltxe:java-extension prefix="calc" class="org.company.Calculator"/>
<xltxe:java-extension prefix="sf" class="org.standards.Formatter"/>
 
<xsl:template match="/">
     <xsl:value-of select="sf:format(calc:sqrt(64), 'ISO-42.7')"/>
</xsl:template>

</xsl:stylesheet>
假定在 xsltSource 源对象中此样式表可用,以下代码用于准备样式表:
// Create the factory
XFactory factory = XFactory.newInstance();

// Create an XSLT executable for the stylesheet
XSLTExecutable executable = factory.prepareXSLT(xsltSource);
以下代码执行在示例中准备的样式表:
// Create the xml input
String xml = "<doc/>";

// Create a result object to store the transformation result
Result result = new StreamResult(System.out);

// Execute the XSLT executable
executable.execute(new StreamSource(new ByteArrayInputStream(xml.getBytes())), result);

提供的示例样式表假定 org.company.Calculator 类包含采用一个参数的静态方法 sqrt(),org.standards.Formatter 类包含采用两个参数的静态方法 format()。准备时,类路径上不需要类;但执行样式表期间需要类。

以下为 org.company.Calculator 和 org.standards.Formatter 类的示例实现:
package org.company;

public class Calculator {
    public static int sqrt(int val) {
        return (int)Math.sqrt(val);
    }
}
package org.standards;

public class Formatter {
    public static String format(int val, String pattern) {
        return "Formatting " + val + " using pattern " + pattern;
    }
}

调用实例方法

从类调用实例方法与调用静态方法稍微有些不同,不同之处体现在实例对象的需求方面。 为了从样式表中的 Java 类获取实例对象,必须调用其新的构造函数:
prefix:new(Params*)
然后,您可以将结果存储在 xsl:variable 元素中,如以下样式表所说明:
<xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xltxe="http://www.ibm.com/xmlns/prod/xltxe-j"
     xmlns:car="http://com.example/myApp/car">
 
<xltxe:java-extension prefix="car" class="org.automobile.Car"/>

<xsl:variable name="var" select="car:new(3)"/>
 
<xsl:template match="/">
     <xsl:value-of select="car:getDoors($var)"/>
</xsl:template>

</xsl:stylesheet>
假定在 xsltSource 源对象中此样式表可用,以下代码用于准备样式表。
// Create the factory
XFactory factory = XFactory.newInstance();

// Create an XSLT executable for the stylesheet
XSLTExecutable executable = factory.prepareXSLT(xsltSource);
以下代码执行示例中准备的样式表:
// Create the xml input
String xml = "<doc/>";

// Create a result object to store the transformation result
Result result = new StreamResult(System.out);

// Execute the XSLT executable
executable.execute(new StreamSource(new ByteArrayInputStream(xml.getBytes())), result);

此示例样式表假定 org.automobile.Car 类包含采用类型 int 自变量的构造函数。此外,org.automobile.Car 类还包含未采用自变量的实例方法 getDoors()。从 stylesheet-declared 外部函数调用实例方法的语法需要将已创建实例对象作为第一个自变量传入。

以下是 org.automobile.Car 类的示例实现:
package org.automobile;

public class Car {
    private int doors;
	
    public Car (int doors) {
        this.doors = doors;
    }
	
    public int getDoors() {
        return doors;
    }
}
还支持继承实例方法。 如果 org.automobile.Car 类具有子类 org.automobile.Sedan,那么可以创建 org.automobile.Sedan 类的实例,并将其用于调用 org.automobile.Car 中的方法。以下样式表说明了此情况:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xltxe="http://www.ibm.com/xmlns/prod/xltxe-j"
     xmlns:sedan="http://com.example/myApp/sedan"
     xmlns:car="http://com.example/myApp/car">
 
<xltxe:java-extension prefix="sedan" class="org.automobile.Sedan"/>
<xltxe:java-extension prefix="car" class="org.automobile.Car"/>

<xsl:variable name="var" select="sedan:new(5)"/>
 
<xsl:template match="/">
     <xsl:value-of select="car:getDoors($var)"/>
</xsl:template>

</xsl:stylesheet>
以下是 org.automobile.Sedan 的示例实现:
package org.automobile;

public class Sedan extends Car {
    public Sedan (int doors) {
        super(doors);
    }
}
Limitation: 用于在 Java 类中解析方法的机制需要仅存在一种方法,且名称和元数匹配。如果存在多种方法,且名称相同而元数不同,那么会抛出错误。

指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_funcs_style_xslt
文件名:txml_funcs_style_xslt.html