Ansicht
Dokumentation

CL_XSLT_PROCESSOR - XSLT-Prozessor

CL_XSLT_PROCESSOR - XSLT-Prozessor

TXBHW - Original Tax Base Amount in Local Currency   ABAP Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

SAP XSLT-Prozessor

Diese Klasse ist die Schnittstelle zum SAP XSLT-Prozessor. Gegenwärtig wird XSLT unterstützt wie angegeben unter

http://www.w3.org/TR/1999/REC-xslt-19991116

mit Ausnahme von und einigen weiteren kleineren Ausnahmen. Der XML-Namensraum für den XSLT-Standard und für SAP-Erweiterungen ist:

http://www.w3.org/1999/XSL/Transform

http://www/sap.com/sapxsl

Ein gültiges XSLT-Programm muß den obigen Namensraum verwenden und das XSLT-Versionsattribut "1.0" im obersten Element angeben. Die SAP- Namensraumerweiterung enthält insbesondere die Erweiterungsanweisungen für ABAP-Aufrufe und den Beinahestandard-Erweiterungsfunktionsknotensatz() zur Umformung eines Ergebnisteilbaums in einen Knotensatz.

Solange XSLT noch nicht von allen Plattformen unterstützt wird, kann der Constructor eine Ausnahme der Klasse CX_XSLT_EXCEPTION auslösen. Der SAP XSLT-Prozessor kann für folgende Zwecke eingesetzt werden:

XSLT-Transformation: XML in XML / XHTML / Text

Setzen Sie die XML-Source mit einer der SET_SOURCE_-Methoden. Beachten Sie, daß bei SET_SOURCE_URI die iXML-Ströme, die von XSLT eingesetzt werden, nicht wirklich URI-fähig sind außer für lokale Dateiablagen auf dem Anwendungsserver. Daher wird die XML-Source normalerweise auf andere Art von der Anwendung beschafft und dann über SET_SOURCE_STRING oder SET_SOURCE_STREAM angegeben. Wenn Sie ein Dokument selbst parsen und dann SET_SOURCE_NODE verwenden, haben die Anweisungen strip-space und preserve-space im XSLT-Programm keine Wirkung.

Wenn Sie auf das Transformationsergebnis als DOM zugreifen wollen, setzen Sie das Ergebnisdokument mit Hilfe von SET_RESULT_DOCUMENT auf ein leeres, nicht Null enthaltendes iXML-Dokumentobjekt (das ist der Zustand nach dem Anlegen). Dieses Dokument wird im Transformationprozess gefüllt. Wenn Sie jedoch das Ergbnis an einen Strom ausgeben wollen, verwenden Sie SET_SOURCE_STREAM. Damit vermeiden Sie den Aufbau eines DOM und die Ergebnisse werden durch den dedizierten XSLT Renderer direkt an diesen Strom gerendert (Deaktivieren von Ausgabe-Escaping funktioniert).

Führen Sie die Transformation mit RUN aus, geben Sie den R/3-Namen des XSLT-Programms und mögliche Parameter an. XSLT-Programme werden im R/3 Repository gepflegt (Ausnahme: siehe "Ad-hoc XSLT Sources" unten).

Wenn Sie SET_RESULT_DOCUMENT verwendet haben, greifen Sie auf das Transformationsergebnis im Dokument zu oder geben Sie es mit einer der OUTPUT_-Methoden aus, wie im XSLT-Programm angegeben. (Hinweis: [a] Deaktivieren von Ausgabe-Escaping funktioniert nicht bei dieser Ausgabeprozedur. [b] Wenn das Dokument mithilfe eines iXML Renderer-Objekts gerendert wurde anstatt mit einer XSLT OUTPUT_-Methode, haben die Ausgabeeinstellungen im XSLT-Programm keinerlei Wirkung.)

Greifen Sie mit NUM_MESSAGES oder GET_MESSAGE auf die während des Ablaufs erzeugten Nachrichten zu.

Ausnahmen der (Unterklassen der) Klasse CX_XSLT_EXCEPTION können von diversen Methoden wegen falschen Eingaben oder Laufzeitfehlern ausgelöst werden und sollten abgefangen werden (new-style TRY / CATCH).

XSLT-Transformation: XML- in ABAP-Datenstrukturen (in Entwicklung)

Verwenden Sie SET_RESULT_ABAP, um ABAP-Datenobjekte an die vom XSLT-Programm erzeugten "Wertkennungen" anzubinden.

Das XSLT-Programm muß ein besonderes Format erzeugen, die die kanonische XML-Darstellung der ABAP-Datenstrukturen ist. (Die Angabe dieses Formats wird dann verfügbar gemacht, wenn diese XSLT-Anwendung vollständig implementiert ist.)

Greifen Sie auf das Transformationergebnis in den gebundenen Datenobjekten zu.

XPath-Auswertung

Verwenden Sie keine SET_RESULT_-Methoden.

Verwenden SET_EXPRESSION um einen XPath-Knotensatzausdruck anzugeben, der in der XML-Source ausgewertet werden soll. Wenn er XML-Namensräume enthält, deklaren Sie diese Namensräume in der Form "prefix1 URI1 prefix2 URI2 ..." im zweiten Parameter. Wenn mehrere ähnliche XPath-Ausdrücke ausgewertet werden sollen, versuchen Sie die Unterschiede als Parameter eines einzigen XPath-Ausdrucks zu bestimmen und deklarieren Sie die XPath-Parameter separat im dritten Parameter (mit XPath-Ausdrücken für ihre Vorgabewerte). Es ist effizienter, die Aktualparameter eines einzigen Ausdrucks abzuändern als mehrere Ausdrücke zu parsen und zu kompilieren.

Geben Sie einen leeren Programmnamen in RUN an sowie Werte für die mit SET_EXPRESSION deklarierten XPath-Parameter.

Verwenden Sie GET_NODES um das Ergebnis der Auswertung als eine iXML-Knotensammlung zu beschaffen. Wenn die Knotensammlung initial ist, war der Ausdruck kein gültiger XPath-Knotensatzausdruck.

Da bei der Konstruktion und Destruktion einer XSLT-Prozessorinstanz bestimmte Kosten entstehen, sollten kurzlebige Anlage und Verwendung zugunsten einer längeren Lebenszeit nach Möglichkeit vermieden werden.

Ad-hoc XSLT Sources

In der Regel sollten XSLT-Programme in der Workbench gepflegt werden. In manchen Fällen können XSLT-Programme jedoch dynamisch entstehen, wobei es nicht wünschenswert sein kann, sie als Repository-Objekte zu generieren. In solchen Fällen kann die XSLT-Source direkt in den XSLT-Prozessor eingegeben werden.

Stellen Sie dazu die XSLT-Source in einem iXML-Strom bereit und rufen Sie SET_SOURCE_STREAM, wobei Sie den (normalerweise unbenutzten) Parameter P auf 'X' setzen. SET_SOURCE_STREAM interpretiert den Strom dann als eine XSLT-Source und gibt in P einen erzeugten Programmnamen zurück (ist das Programm jedoch fehlerhaft, wird dies erst bei RUN entdeckt). Verwenden Sie diesen Programmnamen im nachfolgenden RUN-Aufruf. Soll das Programm mehrfach ausgeführt werden, verwenden Sie dieselbe Aufrufreihenfolge, aber liefern Sie den erzeugten Programmnamen im Parameter P. Das System versucht dann, das kompilierte Programm aus dem Programmpuffer zu beschaffen anstatt die Source erneut zu kompilieren. (Trotzdem sollte der Strom bereitgestellt werden, da das Programm aus dem Puffer gelöscht worden sein könnte).

Zusätzliche XML-Dokumente aus einem XSLT-Programm laden

In den meisten Fällen genügt die Funktion document() nicht, um ein XML-Dokument zur XSLT-Laufzeit zu laden. Das liegt daran, daß die Implementierung der Funktion auf iXML-Strömen basiert, die nur den Zugriff auf lokale Dateien auf dem Anwendungsserver unterstützen. Auf der anderen Seite braucht man zu Laden eines Dokuments über HTTP z.B. mehr als in einem einfachen Funktionsaufruf ausgedrückt werden kann - im allgemeinen erfordert das Einhalten des Protokolls immer Programmierarbeit.

Der richtige Weg, ein XML-Dokument zu laden, ist die Ausführung eines ABAP-Aufrufs (siehe nächsten Abschnitt), der das Dokument beschafft und es (oder Teile davon) als einen Knotensatz, d.h. eine iXML-Knotensammlung, zurückgibt. Aus praktischen Gründen ist es auch möglich, ein iXML-Knotenobjekt zurückzugeben (aus jeder Klasse, die IF_IXML_NODE implementiert), das dann als ein einzelner Knotensatz interpretiert wird.

Erweiterung: ABAP aus XSLT aufrufen

Bestehende ABAP-Objekte können als "Objektparameter" an ein XSLT-Programm übergeben werden, wenn es mit RUN gestartet wird. Methoden auf diese Objekte können dann aus dem XSLT-Programm heraus aufgerufen werden.

Aus der Sicht von (SAP) XSLT ist ein externes (d.h. ABAP-) Objekt eine Entität auf höchster Ebene mit einem qualifizierten Namen und muß ebenso deklariert werden wie Parameter und Template-Regeln auf höchster Ebene. Die Deklaration erfolgt mit der obersten Erweiterungsanweisung 'external-object'. Ein Typ (eine ABAP-Klasse oder -Schnittstelle) für das externe Objekt kann angegeben werden, obwohl dieses Attribut zur Zeit nicht ausgewertet wird. Beispiel:

Ein deklariertes und durch RUN gebundenes externes Objekt kann in einem ABAP-Methodenaufruf mithilfe der Erweiterungsanweisung 'call-external' verwendet werden, die überall dort erlaubt ist, wo auch 'call-template' zulässig ist.

Werte für Importing- und Changing-Parameter der Methode werden durch die Unteranweisung 'callvalue' von 'call-external' geliefert. Die ABAP- Parameternamen müssen im Attribut 'param' übergeben werden. XSLT-Strings, Zahlen und Boolesche Werte können übergeben werden und werden, wie erforderlich, in ABAP-Werte konvertiert. (Beachte Sie, daß es keine implizite Konvertierung von Knotensätzen in Strings gibt. Wenn Sie z.B. den Wert eines Attributs "attr" an einen ABAP-Stringparameter übergeben wollen, verwenden Sie den XPath-Ausdruck "string(@attr)".
Exporting-, Changing- und Returning-Parameter werden durch die Unteranweisung 'callvariable' beschafft. Das Attribut 'type' kann verwendet werden, um den gewünschten Ergebnistyp anzugeben. Anderenfalls wird eine Standardkonvertierungslogik verwendet. Beispielsweise wird C(1) im Standard in einen XSLT-String ungewandelt, kann bei entsprechender Angabe von type='boolean' aber auch in einen Booleschen XSLT-Wert konvertiert werden. Changing-Parameter können sowohl in einer 'callvalue'-Anweisung als auch in einer 'callvariable'-Anweisung auftauchen.


  

  

  

  

  

  

Aus XSLT-Sicht ist ein externer Aufruf eine variablenbindende Anweisung ähnlich der Standardanweisung 'variable'. Die im Attribut 'name' der Unteranweisung 'callvariable' deklarierten XSLT-Variablen sind an die Rückgabewerte des Aufrufs gebunden. Sie haben denselben Umfang als ob die 'call-external'-Anweisung durch die entsprechenden 'variable' Anweisungen ersetzt würden. Daher könnte das obige Beispiel wie folgt weitergehen:

Beachten Sie, dass XSLT eine deklarative Sprache ist und grundsätzlich keine Ausführungsreihenfolge definiert ist. Seien Sie daher vorsichtig mit Seiteneffekten. ABAP-Aufrufe sollten nur lesenden Zugriff haben, mit Ausnahme von Zustandsmanipulationen, die dem XSLT-Ablauf transparent sind.






General Data in Customer Master   CL_GUI_FRONTEND_SERVICES - Frontend Services  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 12036 Date: 20240426 Time: 054258     sap01-206 ( 277 ms )