Externe Funktionen mit XSLT verwenden
Wenn Sie mit einem XSLT-Syle-Sheet arbeiten, das externe Funktionen verwendet, deklarieren Sie die Funktionssignaturen mit einer XStaticContext-Instanz. Verwenden Sie außerdem für jede Funktion eine XDynamicContext-Instanz, um eine Java-Implementierung bereitzustellen (bzw. zu binden).
Vorgehensweise
- Wenn Sie ein XSLT-Syle-Sheet erstellen, das externe Funktionen verwendet, deklarieren Sie die Funktionssignaturen mit einer
XStaticContext-Instanz.
Das Interface XStaticContext stellt zwei declareFunction-Methoden mit jeweils drei Parametern bereit, einem Parameter für den Namen, einem für den Rückgabetyp der Funktion und einem für ein Array mit den Typen der Argumente. Der Name wird immer als ein QName-Objekt angegeben. Der Typ kann jedoch ein QName oder XSequenceType sein. Der Funktionsname, der Rückgabetyp und die Argumenttypen müssen eine eindeutige Identifizierung der Funktion ermöglichen.
Es ist möglich, dass eine Style-Sheet-Funktion denselben Namen wie eine externe Funktion hat. Ist ein Attribut "override" der Style-Sheet-Funktion auf "yes" gesetzt, referenziert jeder Verweis auf diesen Funktionsnamen im Style-Sheet auf die Style-Sheet-Funktion. Wenn das Attribut "override" den Wert "no" hat, referenziert der Verweis die externe Funktion.
Tabelle 1. declareFunction-Methoden von XStaticContext. In der folgenden Tabelle ist die Verwendung der einzelnen Varianten der Methode declareFunction erläutert.
Methodensignatur Zweck declareFunction(QName name, QName type, QName[] argTypes) Verwendung, wenn der Rückgabewert und die Argumente der Funktion ausschließlich einzelne atomare Werte sind QNames für die Typen müssen auf integrierte Typen verweisen oder auf globale Typen, die in einem Schema deklariert sind, das in der für die Erstellung der XStaticContext-Instanz verwendeten XFactory-Instanz registriert ist. Wenn ein QName auf einen nicht atomaren Typ verweist, behandelt der Prozessor ihn so, als wäre er vom Typ element(*, ns:type). Hier steht ns:type für den gegebenen QName. In der Schnittstelle XTypeConstants sind praktische Konstanten verfügbar, die für jeden integrierten Typ ein QName-Objekt bereitstellen.
declareFunction(QName name, XSequenceType type, XSequenceType[] argTypes) Verwendung, wenn eines der Argumente oder der Rückgabewert der Funktion ein Knoten oder eine Sequenz atomarer Werte bzw. Knoten ist Im folgenden Style-Sheet wird eine externe Funktion verwendet, die vom QName ext:pow referenziert wird.<?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>
Ist das angegebene Style-Sheet beispielsweise über das xsltSource-Source-Objekt verfügbar, bereitet der folgende Code das Style-Sheet vor.// Factory erstellen XFactory factory = XFactory.newInstance(); // Neuen statischen Kontext erstellen XStaticContext staticContext = factory.newStaticContext(); // Namespace für die Funktion deklarieren staticContext.declareNamespace("ext", "http://www.example.com/functions"); // QName für den Namen der Funktion erstellen QName methodQName = new QName("http://www.example.com/functions", "pow"); // Funktion im statischen Kontext deklarieren staticContext.declareFunction(methodQName, XTypeConstants.DOUBLE_QNAME, new QName[]{XTypeConstants.DOUBLE_QNAME, XTypeConstants.DOUBLE_QNAME}); // Ausführbares XSLT-Objekt für das Style-Sheet erstellen XSLTExecutable executable = factory.prepareXSLT(xsltSource, staticContext);
- Wenn Sie ein XSLT-Style-Sheet ausführen, das externe Funktionen verwendet, geben Sie
mit einer XDynamicContext-Instanz die Java-Methoden an, die die Funktionen implementieren, bzw. binden Sie diese Java-Methoden mit der genannten Instanz.
Verwenden Sie die Java-Darstellung, um ein Objekt java.lang.reflect.Method für die Funktion zu erhalten. Handelt es sich bei der Methode um eine Instanzmethode, ist zum Binden dieser Funktion ein Instanzobjekt erforderlich.
Ist für eine bei Ausführung des XSLT-Style-Sheets verwendete Funktion keine Java-Methode angegeben, tritt ein Fehler auf.
XDynamicContext stellt zwei bindFunction-Methoden bereit. Jede dieser Methoden erfordert ein QName-Objekt, das dem Namen der Funktion entspricht, und ein Methodenobjekt, das die Java-Methode bezeichnet, die die Implementierung der Funktion zur Verfügung stellt.Tabelle 2. bindFunction-Methoden von XDynamicContext. In der folgenden Tabelle ist die Verwendung der einzelnen Varianten der bindFunction-Methoden von XDynamicContext erläutert.
Methodenname Zweck bindFunction(QName qname, Method method) Verwendung, wenn eine statische Methode gebunden werden soll bindFunction(QName qname, Method method, Object instanceObject) Verwendung, wenn eine Instanzmethode gebunden werden soll Im folgenden Beispiel wird das im ersten Beispiel vorbereitete XSLT-Style-Sheet ausgeführt. Dabei wird zunächst eine Methode für die verwendete Funktion gebunden. In diesem Beispiel wird mit der statischen Methode pow(double a, double b) der Klasse java.lang.Math die Implementierung für die externe Funktion bereitgestellt.// Neuen dynamischen Kontext erstellen XDynamicContext dynamicContext = factory.newDynamicContext(); // Objekt java.lang.reflect.Method für diese Funktion abrufen Method method = Math.class.getMethod("pow", Double.TYPE, Double.TYPE); // Funktion an den dynamischen Kontext binden dynamicContext.bindFunction(methodQName, method); // XML-Eingabedokument erstellen 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)); // Style-Sheet ausführen XSequenceCursor result = executable.execute(source, dynamicContext); // Ergebnis in System.out serialisieren result.exportItem(new StreamResult(System.out), executable.getOutputParameters());
Unterartikel
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.


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