!--a11y-->
XSLT Mapping mit Java-Erweiterung 
Die XSLT-Spezifikation schlägt einen Erweiterungsmechanismus vor, der es ermöglicht, von XSLT aus externe Routinen aufzurufen, um Transformationen von XML-Strukturen durchzuführen. Java ist eine Programmiersprache, die von einigen Java-XSLT-Prozessoren als Erweiterungssprache unterstützt wird.
Mit Hilfe des XSLT Mapping mit Java-Erweiterung können Sie Mappings schneller und flexibler implementieren.

Der Working Draft der Spezifikation für XSL Transformations (XSLT) Version 2.0 (Stand vom 20. Dezember 2001) definiert nicht den Funktionsumfang des Erweiterungsmechanismus der XSL-Transformation. Es gibt auch keine begleitenden Standards, die den Erweiterungsmechanismus mit Java normieren. Aus diesem Grund unterscheiden sich die auf dem Markt verfügbaren XSLT-Prozessoren in dieser Hinsicht stark voneinander.
Im Folgenden wird eine der Möglichkeiten vorgestellt, die das SAP J2EE Engine XML Toolkit 2.0 unterstützt.
Um XSLT Mapping mit Java-Erweiterung zu implementieren, müssen Sie folgende Schritte durchführen:
...
1. Implementieren Sie eine Java-Klasse, die statische Methoden zur Transformation von XML-Dokumenten bzw. -Strukturen enthält. Innerhalb dieser Java-Klasse können Sie auch Meldungen über das MappingTrace-Objekt in einen Trace schreiben, der im Message-Monitoring sichtbar ist.

Das MappingTrace-Objekt wird im PCK nicht unterstützt.
2. Binden Sie die Methodenaufrufe im XSLT-Mapping-Programm ein (siehe unten).
3. Importieren Sie das XSLT-Mapping-Programm und die Java-Klasse als Archiv in das Integration Repository. Sie können auch zwei verschiedene Archive verwenden. Das Archiv mit der Java-Klasse muss in der gleichen oder unterliegenden Software-Komponentenversion sein wie das XSLT-Mapping-Programm (siehe auch: XSLT- und Java-Mappings).
Das folgende Beispiel veranschaulicht den Vorgang anhand eines einfachen XSLT-Mappings für eine Message.
Folgende Tabelle zeigt die Instanz einer Message, die Sie in die Ziel-Message mittels eines XSLT-Mapping-Programms mit Java-Erweiterung überführen wollen.
Ausgangs-Instanz |
Ziel-Instanz |
<person> <first-name>Robert</first-name> </person> |
<person> <name>Robert White</name> </person> |
Die Verkettung der Elemente <first-name> und <last-name> soll über eine Java-Methode concat() realisiert werden. Außerdem wollen Sie innerhalb dieser Methode eine Meldung in den Mapping-Trace schreiben. In dem XSLT-Mapping-Programm, in dem Sie diese Java-Methode aufrufen wollen, müssen Sie folgende Schritte durchführen:
...
1. Deklarieren Sie die Java-Klasse mit einer Namensraumdefinition als ein Attribut des Elementes <xsl:stylesheet>. Die Bezeichnung des Namensraums kann ein beliebiger String sein, wobei sie in diesem Beispiel javamap heißt (siehe unten). Der Identifikator des Namensraums besteht aus dem String java: als Präfix und dem vollqualifizierten Namen der Klasse. Der vollqualifizierte Name einer Java-Klasse besteht aus dem Namen des Package und dem Klassennamen, im Beispiel ist dies com.company.group.MappingClass.
2. Definieren Sie mit <xsl:param> die Parameter, die Sie bei den Methodenaufrufen übergeben wollen. Im Beispiel unten werden drei Parameter der Signatur der Methode concat() entsprechend definiert:
¡ Der Parameter first nimmt den Wert des Elementes <first-name> an
¡ Der Parameter last nimmt den Wert des Elementes <last-name> an
¡ Der Parametername inputparam ist festgelegt und dient dazu, dem Java-Programm die Konstanten der Klasse StreamTransformationConstants zu übergeben.

Bei einem Java-Mapping müssten Sie die Methode setParameter() implementieren, damit die Konstanten zur Laufzeit vom Integration Server gesetzt werden. Bei XSLT-Mappings mit einer Java-Erweiterung reicht es aus, die Konstanten über den Parameter inputparam zu übergeben. Der Parameter wird von der Mapping-Laufzeit gesetzt. (siehe auch: Java Mapping).
3. Der Methodenaufruf erfolgt durch das Element <xsl:value-of>. Mit dem Attribut select geben Sie die Methode mit zugehörigen Parametern an. Die Bezeichnung für den Namensraum javamap ersetzt als Präfix den vollqualifizierten Klassennamen.

Es ist ratsam, die Verfügbarkeit der Methoden vor ihren Aufrufen zu prüfen. Das können Sie beispielsweise mit dem XSL-Element <xsl:if> mit dem Attribut test durchführen.
Das XSLT-Programm sieht folgendermaßen aus:
<?xml version="1.0"
encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:javamap="java:com.company.group.MappingClass">
<xsl:param
name="first">
<xsl:value-of select="//first-name"/>
</xsl:param>
<xsl:param
name="last">
<xsl:value-of select="//last-name"/>
</xsl:param>
<xsl:param name="inputparam" />
<xsl:template match="/">
<name>
<xsl:if
test="function-available('javamap:concat')">
<xsl:value-of select="javamap:concat($first, $last, $inputparam)"/>
</xsl:if>
</name>
</xsl:template>
</xsl:stylesheet>
Mit der Klassenmethode concat() der Java-Klasse com.company.group.MappingClass verketten Sie die Werte der Elemente <first-name> und <last-name> der Ausgangs-Instanz zu einem String für den Wert des Elementes <name> der Ziel-Instanz. Um Informationen in den Trace zu schreiben, hat die Methode außerdem den Parameter inputparam vom Typ Map. Mit diesem holen Sie sich zunächst ein MappingTrace-Objekt und können dann mit dessen Methoden addInfo() oder AddWarning() Meldungen and den Trace übergeben:
package com.company.group;
import
java.util.Map;
import com.sap.aii.mapping.api.AbstractTrace;
import
com.sap.aii.mapping.api.StreamTransformationConstants;
public class MappingClass {
private AbstractTrace trace = null;
public
static String concat(String first,
String
last,
Map
inputparam)
{
// write trace information
trace =
(AbstractTrace)inputparam.get(
StreamTransformationConstants.MAPPING_TRACE
);
trace.addInfo(“concat():
\nfirst-name
= “ + first +
“\nlast-name
= “ + last );
// return concatentation
return
first + ' ' + last;
}
//...
}