Show TOC Anfang des Inhaltsbereichs

Funktionsdokumentation XSLT Mapping mit Java-Erweiterung Dokument im Navigationsbaum lokalisieren

Verwendung

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.

Achtung

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.

Aktivitäten

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.

Hinweis

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.

Beispiel

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>
   <last-name>White</last-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.

Hinweis

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.

Hinweis

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;
    }

    //...

}

 

 

 

Ende des Inhaltsbereichs