Kurzbeschreibung
Die EdifactTransformerAction führt XSL Transformationen auf Elemente des Nachrichtenkontextes aus und speichert das Resultat als Kontext-Element. Anders als die reguläre TransformerAction ist sie dazu in der Lage direkt auf EDIFACT Dateien zu arbeiten. Weiterhin erlaubt sie die Konvertierung von EDIFACT in zusätzliche Ausgabeformate PDF (mittels XSL-FO siehe W3C Spezifikation), Text, XML DOM Bäume für die spätere Weiterverarbeitung innerhalb der B2B und zuletzt andere EDIFACT Dateien.
Die breite Palette an Einsatzmöglichkeiten dieser Action erlaubt es dem Benutzer mit Hilfe einer Standardisierten Sprache nahezu beliebige Transformationen von XML (auch IDOC) oder EDIFACT Dokumenten zu beliebigen anderen Formaten zu definieren. Eigene Mappings, die Bearbeitung von EDIFACT Nachrichten und die Erstellung von PDF Dokumenten aus EDIFACT Dateien werden somit ermöglicht.
Das zu verwendende XSL Skript wird wie in der TransformerAction in der B2B als Content hinterlegt. Näheres dazu ist der Dokumentation der TransformerAction zu entnehmen.
Zur XSL-Transformation wird standardmäßig die in der Java VM integrierte Funktionalität genutzt.
Die folgenden Nachrichten werden unterstützt
FORMAT | Version |
APERAK | UN D.07B |
CONTRL | UN D.3 |
IFTSTA | UN D.18A |
INSRPT | UN D.10A |
INVOIC | UN D.06A |
MSCONS | UN D.04B |
ORDCHG | UN D.20B |
ORDERS | UN D.09B |
ORDRSP | UN D.10A |
PRICAT | UN D.20B |
QUOTES | UN D.10A |
REMADV | UN D.05A |
REQOTE | UN D.10A |
UTILMD | UN D.11A |
UTILTS | UN D.07A |
Bitte beachten Sie, dass es notwendig sein könnte, Code-Anpassungen bei Formatumstellungen zu beantragen.
Einrichtung
Die EdifactTransformerAction wird als Java-Action eingerichtet (siehe Actions Anlegen). Dabei müssen die folgenden Einstellungen der Action vorgenommen werden.
- Klasse
com.nextlevel.b2b.edifact.transform.actions.EdifactTransformerAction - Typ
JAVA
Alle weiteren Einstellungen der Action, die nach Erstellen der Action gesetzt werden, finden sich in den nachstehenden Tabellen.
ActionEigenschaften (Erforderlich)
Hier genannte Eigenschaften müssen konfiguriert werden. Sonst wird bei der Ausführung der Action ein Fehler generiert.
Name der Eigenschaft | erlaubte Werte | Beschreibung |
B3P_CONTENT_DESTINATION_FORMAT | EDI, TEXT, XML, PDF | Diese Einstellung gibt das Zielformat an, das in der Adminstrationsansicht unter dem Reiter 'Content' zur Identifikation des zu verwendenden Skriptes genutzt wird.Velocity Template-Ausdrücke sind erlaubt.
|
ActionEigenschaften (Optional)
Neben der unter aufgeführten Eigenschaften existieren andere allegemeine Eingenschaften, die im Dokument TransformerAction beschrieben sind.
Name der Eigenschaft | erlaubte Werte | Beschreibung |
---|---|---|
B3P_EDI_PARSER_CONFIG | Durch Semikolon getrennte Liste von Schlüssel-Wert-Paaren der Länge 1..1000. Beispiel: "schluessel1=wert1;schluessel2=wert2". Die reservierten Zeichen ‘;’, ‘=’ und ‘' müssen mit einem zusätzlichen Backslash (‘') als Präfix versehen werden, falls sie in einem Schlüsselnamen oder einem Wert vorkommen. | Die hier definierten Eigenschaften werden an den Edifact-Parser weitergegeben. Die Einstellung allow.whitespace=false besagt, dass keine Zeilenumbrüche oder zusätzliche Leerzeichen im EDIFACT erlaubt sind. Ist allow.whitespace=true gesetzt werden Zeilenumbrüche ignoriert. |
Service Eigenschaften (Experte)
Hier genannte Eigenschaften sollten nur in Ausnahmefällen oder durch Expertennutzer gesetzt werden, die mit dem Quellcode der EdifactTransformerAction vertraut sind. Siehe auch den entsprechenden Abschnitt unter TransformerAction
Name der Eigenschaft | erlaubte Werte | Beschreibung |
---|---|---|
B3P_EDI_SCHEMA_PROVIDER | ein vollqualifizierter Klassenname | Die Eigenschaft gibt die Klasse an, durch die die Struktur des EDIFACT Baumes definiert wird. Standardeinstellung ist der Provider com.nextlevel.b2b.edifact.unschema.UNMessageSchemaProvider, der auf den UNECE Formaten basiert. |
Einlesen von EDIFACT Dateien
Für die Verarbeitung von EDIFACT Dateien mit XSL Transformationen werden
EDIFACT Dateien als XML-äquivalent Bäume dargestellt. Die
Dokumenthierarchie des XML-äquivalent Baumes orientiert sich dabei an
der von der UNECE
vorgegebenen Struktur der EDIFACT Dateien. Jede EDIFACT Datei hat dabei
ein Grundelement <edi>
. Unter diesem Hauptknoten befinden sich die
Segmente der EDIFACT Datei in derselben Reihenfolge wie in der
textuellen Darstellung. Existierende Segmentgruppen werden durch eine
Verschachtelung der XML-äquivalent Knoten dargestellt.
Das Grundgerüst jeder EDIFACT Datei wird wie folgt transformiert:
|
|
Die Elemente und Felder eines Segments wird unter einem XML-äquivalenten
Element <data>
im Element eines Segmentes gespeichert. Dabei erhalten
Kompositelemente einen Tag-Namen, der dem Namen des Komposits in den
Spezifikationen der UNECE (bzw. des MIGs des BDEW) entspricht. Unterhalb
des Komposits sind die einzelnen Felder mit einem Feldnamen der
F<Feldnummer> entspricht. Felder, die keine Kompositbezeichner
erhalten, da sie nur einen einzelnen Wert enhalten werden durch zwei
ineinander verschachtelte Elemente dargestellt, die jeweils durch den
Feldnamen bezeichnet sind. Der Zweck dieser Darstellung ist, dass
dadurch alle Feldinhalte eines Segments in derselben
Verschachtelungstiefe zu finden sind.
Ein UNH Segment wird daher wie folgt transformiert:
UNH+CBRASS14133787+INVOIC:D:06A:UN:2.6'
wird somit zu dem folgenden XML-äquivalent:
<UNH>
<data>
<F0062>
<F0062>CBRASS14133787</F0062>
</F0062>
<S009>
<F0065>INVOIC</F0065>
<F0052>D</F0052>
<F0054>06A</F0054>
<F0051>UN</F0051>
<F0057>2.6</F0057>
</S009>
</data>
...
</UNH>
Das folgende Beispiel zeigt das Transformationsergebnis einer vollständigen EDIFACT Datei in XML. Diese erhält man beispielsweise, wenn man das EDIFACT in TEXT (siehe unten) konvertiert.
UNB+UNOC:3+9905282000003:500+9903324000006:500+140910:1334+CBRASS01855921'
UNH+CBRASS14133787+INVOIC:D:06A:UN:2.6'
BGM+380+CBRASS91625573BGM+9'
DTM+137:20140910:102'
DTM+9:20140910:102'
DTM+203:20140910:102'
IMD++WIM'
RFF+Z13:31003'
RFF+OI:DE123456'
DTM+171:20140910:102'
NAD+MS+9905282000003::293++Tester:::::Z01+Nattermannalle ::1+Köln++50829+DE'
RFF+VA:123456789'
NAD+MR+9903324000006::293++Anderer Tester:::::Z01+Nattermannalle ::1+Köln++50829+DE'
NAD+DP+1+++Nattermannalle::1+Köln++50829+DE'
LOC+172+DE123456789'
CUX+2:EUR:4'
PYT+3'
DTM+265:20140910:102'
LIN+1++2321321:Z01'
QTY+47:1000:PCS'
DTM+155:20140910:102'
MOA+203:100'
MOA+131:10'
PRI+CAL:100'
TAX+7+VAT+++:::19+S'
UNS+S'
MOA+77:1000'
MOA+9:1000'
TAX+7+VAT+++:::19+S'
MOA+125:1000'
MOA+161:1000'
UNT+30+CBRASS14133787'
UNZ+1+CBRASS01855921'
<?xml version="1.0" encoding="UTF-8"?>
<edi>
<UNA>:+.? '</UNA>
<UNB>
<data>
<S001>
<F0001>UNOC</F0001>
<F0002>3</F0002>
</S001>
<S002>
<F0004>9905282000003</F0004>
<F0007>500</F0007>
</S002>
<S003>
<F0010>9903324000006</F0010>
<F0007>500</F0007>
</S003>
<S004>
<F0017>140910</F0017>
<F0019>1334</F0019>
</S004>
<F0020>
<F0020>CBRASS01855921</F0020>
</F0020>
</data>
<UNH>
<data>
<F0062>
<F0062>CBRASS14133787</F0062>
</F0062>
<S009>
<F0065>INVOIC</F0065>
<F0052>D</F0052>
<F0054>06A</F0054>
<F0051>UN</F0051>
<F0057>2.6</F0057>
</S009>
</data>
<BGM>
<data>
<C002>
<F1001>380</F1001>
</C002>
<C106>
<F1004>CBRASS91625573BGM</F1004>
</C106>
<F1225>
<F1225>9</F1225>
</F1225>
</data>
</BGM>
<DTM>
<data>
<C507>
<F2005>137</F2005>
<F2380>20140910</F2380>
<F2379>102</F2379>
</C507>
</data>
</DTM>
<DTM>
<data>
<C507>
<F2005>9</F2005>
<F2380>20140910</F2380>
<F2379>102</F2379>
</C507>
</data>
</DTM>
<DTM>
<data>
<C507>
<F2005>203</F2005>
<F2380>20140910</F2380>
<F2379>102</F2379>
</C507>
</data>
</DTM>
<IMD>
<data>
<F7077>
<F7077 />
</F7077>
<C272>
<F7081>WIM</F7081>
</C272>
</data>
</IMD>
<RFF>
<data>
<C506>
<F1153>Z13</F1153>
<F1154>31003</F1154>
</C506>
</data>
</RFF>
<RFF>
<data>
<C506>
<F1153>OI</F1153>
<F1154>DE123456</F1154>
</C506>
</data>
<DTM>
<data>
<C507>
<F2005>171</F2005>
<F2380>20140910</F2380>
<F2379>102</F2379>
</C507>
</data>
</DTM>
</RFF>
<NAD>
<data>
<F3035>
<F3035>MS</F3035>
</F3035>
<C082>
<F3039>9905282000003</F3039>
<F1131 />
<F3055>293</F3055>
</C082>
<C058>
<F3124 />
</C058>
<C080>
<F3036>Tester</F3036>
<F3036 />
<F3036 />
<F3036 />
<F3036 />
<F3045>Z01</F3045>
</C080>
<C059>
<F3042>Nattermannalle </F3042>
<F3042 />
<F3042>1</F3042>
</C059>
<F3164>
<F3164>Köln</F3164>
</F3164>
<C819>
<F3229 />
</C819>
<F3251>
<F3251>50829</F3251>
</F3251>
<F3207>
<F3207>DE</F3207>
</F3207>
</data>
<RFF>
<data>
<C506>
<F1153>VA</F1153>
<F1154>123456789</F1154>
</C506>
</data>
</RFF>
</NAD>
<NAD>
<data>
<F3035>
<F3035>MR</F3035>
</F3035>
<C082>
<F3039>9903324000006</F3039>
<F1131 />
<F3055>293</F3055>
</C082>
<C058>
<F3124 />
</C058>
<C080>
<F3036>Anderer Tester</F3036>
<F3036 />
<F3036 />
<F3036 />
<F3036 />
<F3045>Z01</F3045>
</C080>
<C059>
<F3042>Nattermannalle </F3042>
<F3042 />
<F3042>1</F3042>
</C059>
<F3164>
<F3164>Köln</F3164>
</F3164>
<C819>
<F3229 />
</C819>
<F3251>
<F3251>50829</F3251>
</F3251>
<F3207>
<F3207>DE</F3207>
</F3207>
</data>
</NAD>
<NAD>
<data>
<F3035>
<F3035>DP</F3035>
</F3035>
<C082>
<F3039>1</F3039>
</C082>
<C058>
<F3124 />
</C058>
<C080>
<F3036 />
</C080>
<C059>
<F3042>Nattermannalle</F3042>
<F3042 />
<F3042>1</F3042>
</C059>
<F3164>
<F3164>Köln</F3164>
</F3164>
<C819>
<F3229 />
</C819>
<F3251>
<F3251>50829</F3251>
</F3251>
<F3207>
<F3207>DE</F3207>
</F3207>
</data>
<LOC>
<data>
<F3227>
<F3227>172</F3227>
</F3227>
<C517>
<F3225>DE123456789</F3225>
</C517>
</data>
</LOC>
</NAD>
<CUX>
<data>
<C504>
<F6347>2</F6347>
<F6345>EUR</F6345>
<F6343>4</F6343>
</C504>
</data>
</CUX>
<PYT>
<data>
<F4279>
<F4279>3</F4279>
</F4279>
</data>
<DTM>
<data>
<C507>
<F2005>265</F2005>
<F2380>20140910</F2380>
<F2379>102</F2379>
</C507>
</data>
</DTM>
</PYT>
<LIN>
<data>
<F1082>
<F1082>1</F1082>
</F1082>
<F1229>
<F1229 />
</F1229>
<C212>
<F7140>2321321</F7140>
<F7143>Z01</F7143>
</C212>
</data>
<QTY>
<data>
<C186>
<F6063>47</F6063>
<F6060>1000</F6060>
<F6411>PCS</F6411>
</C186>
</data>
</QTY>
<DTM>
<data>
<C507>
<F2005>155</F2005>
<F2380>20140910</F2380>
<F2379>102</F2379>
</C507>
</data>
</DTM>
<MOA>
<data>
<C516>
<F5025>203</F5025>
<F5004>100</F5004>
</C516>
</data>
</MOA>
<MOA>
<data>
<C516>
<F5025>131</F5025>
<F5004>10</F5004>
</C516>
</data>
</MOA>
<PRI>
<data>
<C509>
<F5125>CAL</F5125>
<F5118>100</F5118>
</C509>
</data>
</PRI>
<TAX>
<data>
<F5283>
<F5283>7</F5283>
</F5283>
<C241>
<F5153>VAT</F5153>
</C241>
<C533>
<F5289 />
</C533>
<F5286>
<F5286 />
</F5286>
<C243>
<F5279 />
<F1131 />
<F3055 />
<F5278>19</F5278>
</C243>
<F5305>
<F5305>S</F5305>
</F5305>
</data>
</TAX>
</LIN>
<UNS>
<data>
<F0081>
<F0081>S</F0081>
</F0081>
</data>
</UNS>
<MOA>
<data>
<C516>
<F5025>77</F5025>
<F5004>1000</F5004>
</C516>
</data>
</MOA>
<MOA>
<data>
<C516>
<F5025>9</F5025>
<F5004>1000</F5004>
</C516>
</data>
</MOA>
<TAX>
<data>
<F5283>
<F5283>7</F5283>
</F5283>
<C241>
<F5153>VAT</F5153>
</C241>
<C533>
<F5289 />
</C533>
<F5286>
<F5286 />
</F5286>
<C243>
<F5279 />
<F1131 />
<F3055 />
<F5278>19</F5278>
</C243>
<F5305>
<F5305>S</F5305>
</F5305>
</data>
<MOA>
<data>
<C516>
<F5025>125</F5025>
<F5004>1000</F5004>
</C516>
</data>
</MOA>
<MOA>
<data>
<C516>
<F5025>161</F5025>
<F5004>1000</F5004>
</C516>
</data>
</MOA>
</TAX>
<UNT>
<data>
<F0074>
<F0074>30</F0074>
</F0074>
<F0062>
<F0062>CBRASS14133787</F0062>
</F0062>
</data>
</UNT>
</UNH>
<UNZ>
<data>
<F0036>
<F0036>1</F0036>
</F0036>
<F0020>
<F0020>CBRASS01855921</F0020>
</F0020>
</data>
</UNZ>
</UNB>
</edi>
Ein Transformationsergebnis im obenstehenden XML Format kann durch die EdifactTransformerAction ebenfalls wieder nach EDIFACT zurücktransformiert werden. Dadurch wird es möglich, den Dokumentbaum einer EDIFACT zu bearbeiten und ihn anschließend wieder in eine EDIFACT Nachricht umzuwandeln.
Konfiguration für die Umwandlung der Edifact in Xml
Um eine Edifact in die oben gezeigte Xml umzuwandelt, muss die Action so konfiguriert werden:
TRANSFORMER_FACTORY_CLASSNAME = com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
B3P_USE_EXTENSION = true
B3P_CONTENT_FORMAT_TYPE = EDIXML.xslt
B3P_CONTENT_DESTINATION_FORMAT = TEXT
Als Extension EDIXML.xslt
muss folgendes Template hochgeladen werden:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Konfiguration für die Umwandlung der Edi-XML in Edifact
Um eine XML im oben angeführten Format in eine Edifact umzuwandeln, muss die Action so konfiguriert werden:
TRANSFORMER_FACTORY_CLASSNAME = com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
B3P_USE_EXTENSION = true
B3P_CONTENT_FORMAT_TYPE = EDIXML.xslt
B3P_CONTENT_DESTINATION_FORMAT = EDI
Als Extension EDIXML.xslt
muss dasselbe Template aus dem vorherigen Abschnitt hochgeladen werden.
DIALECT für die Edi-XML
Damit die Edi-XML von der Formaterkennung korrekt erkannt wird, muss die Extension DIALECT so angepasst werden:
“EDIXML” in der Zeile “xml.dialect=” hinzufügen, z.B.: xml.dialect=IDOCXML,EDWXML,EDIXML
und diesen Block hinzufügen:
xml.dialect.EDIXML.id=<edi>
xml.dialect.EDIXML.type="EDIXML"
xml.EDIXML.type2="EDIXML"
xml.EDIXML.type=/edi/UNB/UNH/data/S009/F0065
xml.EDIXML.version=/edi/UNB/UNH/data/S009/F0057
xml.EDIXML.referenceNumber=/edi/UNB/data/F0020/F0020
xml.EDIXML.partnerName=""
xml.EDIXML.partner=/edi/UNB/data/S003/F0010
xml.EDIXML.senderName=""
xml.EDIXML.sender=/edi/UNB/data/S002/F0004
xml.EDIXML.alternativeId=""
xml.EDIXML.additional=UtilRef
xml.EDIXML.UtilRef=/edi/UNB/UNH/data/F0026/F0026
Umwandlung nach PDF
Die Ausgabe von PDF Dateien erfordert zunächst eine Transformation des Eingangsformates (XML oder EDIFACT) in das Übergangsformat XSL-FO. Dieses Format ist vom W3C dokumentiert. Um dieses Übergangsformat zu generieren muss der Benutzer eine entsprechende XSL-Transformation mit einem gewöhnlichen XSL Stylesheet definieren. Das Transformationsergebnis der XSL Transformation (dann XSL-FO) wird mit Hilfe der FOP-Bibliothek der Apache Software Foundation in ein PDF umgewandelt, dass binär im Nachrichtenkontext abgelegt wird.
Soll das Zieldokument Grafikobjekte enthalten (z. B. Logos) müssen diese im XSL-FO adressiert werden. Die Spezifikation des W3C sieht hierfür vor, dass Grafikobjekte als URLs adressiert werden können:
<xsl:template match="photo">
<fo:block text-align="center">
<fo:external-graphic src="'url({@image})'"/>
</fo:block>
</xsl:template>
Um diese Grafikobjekte ebenfalls aus der Datenbank laden zu können wurde der folgende Syntax für die Adressierung von als Content or als Extension hinterlegte Grafikobjekte entwickelt:
- Extension
b2b://extension/<type>/<provider>/<version> -
Content
b2b://content/<provider>/<version>/<format>/<format-version>/<destination-format>/<type>