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

Mit dem Element "java-extension" können Sie ein Präfix an eine Java-Klasse binden.
<xltxe:java-extension
prefix = string
class = string /> 
Anmerkung: Es kann jeder beliebige Präfixname für das Element "java-extension" verwendet werden, solange er an den Namespace http://www.ibm.com/xmlns/prod/xltxe-j gebunden ist.
Nachdem Sie ein Präfix an eine Java-Klasse gebunden haben, können Methoden in der gebundenen Klasse aufgerufen werden, indem Sie den Präfix- und den Methodennamen durch einen Doppelpunkt getrennt angeben:
Präfix:Methodenname(Parameter*)

Beispiel

Statische Methoden aufrufen

Wenn Sie ein XSLT-Style-Sheet vorbereiten, das in einem Style-Sheet deklarierte externe Funktionen verwendet, deklarieren Sie das Präfix für die Java-Klassenbindung:
<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>
Ist dieses Style-Sheet beispielsweise über das xsltSource-Source-Objekt verfügbar, bereitet der folgende Code das Style-Sheet vor:
// Factory erstellen
XFactory factory = XFactory.newInstance();

// Ausführbares XSLT-Objekt für das Style-Sheet erstellen
XSLTExecutable executable = factory.prepareXSLT(xsltSource);
Der folgende Code führt das Style-Sheet aus, das in dem Beispiel vorbereitet wurde:
// 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.

Im Folgenden sehen Sie Beispielimplementierungen für die Klassen "org.company.Calculator" und "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;
    }
}

Instanzdefinitionsmethoden aufrufen

Der Aufruf von Instanzdefinitionsmethoden über eine Klasse weicht geringfügig vom Aufruf statischer Methoden ab, weil ein Instanzobjekt vorausgesetzt wird. Zum Abrufen eines Instanzobjekts über eine Java-Klasse in einem Style-Sheet müssen Sie den neuen Konstruktor aufrufen:
Präfix:new(Params*)
Anschließend können Sie das Ergebnis in einem Element "xsl:variable" speichern, wie im folgenden Style-Sheet veranschaulicht wird:
<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>
Ist dieses Style-Sheet beispielsweise über das xsltSource-Source-Objekt verfügbar, bereitet der folgende Code das Style-Sheet vor.
// Factory erstellen
XFactory factory = XFactory.newInstance();

// Ausführbares XSLT-Objekt für das Style-Sheet erstellen
XSLTExecutable executable = factory.prepareXSLT(xsltSource);
Der folgende Code führt das Style-Sheet aus, das in dem Beispiel vorbereitet wurde:
// 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.

Im Folgenden sehen Sie eine Beispielimplementierung für die Klasse "org.automobile.Car":
package org.automobile;

public class Car {
    private int doors;
	
    public Car (int doors) {
        this.doors = doors;
    }
	
    public int getDoors() {
        return doors;
    }
}
Die Übernahme mit Instanzdefinitionsmethoden wird auch unterstützt. Wenn die Klasse "org.automobile.Car" eine Unterklasse "org.automobile.Sedan" hat, können Sie eine Instanz der Klasse "org.automobile.Sedan" erstellen und diese für den Aufruf von Methoden in "org.automobile.Car" verwenden. Diese wird anhand des folgendenn Style-Sheets veranschaulicht:
<?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>
Im Folgenden sehen Sie eine Beispielimplementierung für "org.automobile.Sedan":
package org.automobile;

public class Sedan extends Car {
    public Sedan (int doors) {
        super(doors);
    }
}
Einschränkung: Der für das Auflösen von Methoden in einer Java-Klasse verwendete Mechanismus erfordert, dass nur eine einzige Methode vorhanden ist, deren Name und Stelligkeit übereinstimmt. Wenn mehrere Methoden mit demselben Namen und unterschiedlicher Stelligkeit vorhanden sind, wird ein Fehler ausgelöst.

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_funcs_style_xslt
Dateiname:txml_funcs_style_xslt.html