In einem Style-Sheet deklarierte externe Funktionen mit XSLT verwenden
Ale Alternative zur Bindung von Java™-Methoden an Funktionen in einem Style-Sheet über die API können externe Java-Funktionen direkt in einem Style-Sheet deklariert werden. Die einzige zusätzlich erforderliche Konfiguration ist, dass während der Style-Sheet-Ausführung gebundene Java-Klassen im Klassenpfad vorhanden sind.
Vorgehensweise
<xltxe:java-extension
prefix = string
class = string />
Präfix:Methodenname(Parameter*)
Beispiel
Statische Methoden aufrufen
<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>
// Factory erstellen
XFactory factory = XFactory.newInstance();
// Ausführbares XSLT-Objekt für das Style-Sheet erstellen
XSLTExecutable executable = factory.prepareXSLT(xsltSource);
// XML-Eingabe erstellen
String xml = "<doc/>";
// Ergebnisobjekt zum Speichern des Umsetzungsergebnisses erstellen
Result result = new StreamResult(System.out);
// Ausführbare XSLT-Datei ausführen
executable.execute(new StreamSource(new ByteArrayInputStream(xml.getBytes())), result);
Im bereitgestellten Beispiel-Style-Sheet wird angenommen, dass die Klasse "org.company.Calculator" eine statische Methode "sqrt()" enthält, die einen Parameter akzeptiert, und dass die Klasse "org.standards.Formatter" eine statische Methode "format()" enthält, die zwei Parameter akzeptiert. Während der Vorbereitung sind die Klassen im Klassenpfad nicht erforderlich. Während der Ausführung des Style-Sheets müssen die Klassen jedoch vorhanden sein.
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;
}
}
Instanzdefinitionsmethoden aufrufen
Präfix:new(Params*)
<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>
// Factory erstellen
XFactory factory = XFactory.newInstance();
// Ausführbares XSLT-Objekt für das Style-Sheet erstellen
XSLTExecutable executable = factory.prepareXSLT(xsltSource);
// XML-Eingabe erstellen
String xml = "<doc/>";
// Ergebnisobjekt zum Speichern des Umsetzungsergebnisses erstellen
Result result = new StreamResult(System.out);
// Ausführbare XSLT-Datei ausführen
executable.execute(new StreamSource(new ByteArrayInputStream(xml.getBytes())), result);
Das Beispiel-Style-Sheet setzt voraus, dass die Klasse "org.automobile.Car" einen Konstruktor enthält, der ein Argument des Typs "int" akzeptiert. Außerdem enthält die Klasse "org.automobile.Car" eine Instanzdefinitionsmethode "getDoors()", die keine Argumente akzeptiert. Die Syntax für den Aufruf von Instanzdefinitionsmethoden über externe Funktionen, die in einem Style-Sheet deklariert sind, erfordert, dass das erstellte Instanzobjekt als erstes Argument übergeben wird.
package org.automobile;
public class Car {
private int doors;
public Car (int doors) {
this.doors = doors;
}
public int getDoors() {
return doors;
}
}
<?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>
package org.automobile;
public class Sedan extends Car {
public Sedan (int doors) {
super(doors);
}
}