Vorlage
Wertauflöser - Kurzfassung
Zweck: Interpretiert eine als Parameter statisch definierte Vorlage, die über XPath (1.0) die Daten des Druck-XML für den Eingabewert einbeziehen kann, und gibt das Ergebnis als Zeichenfolge zurück.
Siehe auch: XML Parsen
►WICHTIG◄ Der Vorlage-Wertauflöser ist im Client-Kontext (Client Workflow, Client Workflows) nicht verfügbar.
Der Vorlage-Wertauflöser interpretiert eine als Parameter statisch definierte Vorlage, die über XPath (1.0) die Daten des Druck-XML des Eingabewerts einbeziehen kann, und gibt das Ergebnis als Zeichenfolge zurück:
Als Eingabewert eignen sich alle serialisierbaren Objekte, die einzeln oder als Liste übergeben werden können.
Wenn eine Liste von Objekten übergeben wird, darf diese auch unterschiedliche Objekttypen enthalten.
Die übergebenen Objektdaten erscheinen im printObjects-Element des intern erzeugten Druck-XML-Dokuments (siehe Beispiel unten), auf das XPath-(1.0)-Ausdrücke innerhalb der Vorlage zugreifen können.
Das printObjects-Element erscheint im Druck-XML als direktes Kind des Wurzelements (<core:Print>) nach den folgenden Elementen mit Informationen zur aktuellen Sitzung:
Das Element <base:User> zeigt den Stand des Benutzerkontos (Benutzer-Objekt für den Benutzer der Session) zum Zeitpunkt der Anmeldung.
►HINWEIS◄ Mit einer Gastbenutzer-Anmeldung, erscheint stattdessen ein Gastbenutzer-Element (<base:GuestUser>).Das Element <base:CompanyAccount> zeigt den Stand des Firmenkontos (Firmen-Objekt für die Firma der Session) zum Zeitpunkt der Anmeldung.
Das Element <locale> beinhaltet den internen Schlüsselwert für die Aktuelle Sprache als Textknoten.
Das Element <storage> beinhaltet alle im Ausführungskontext gültigen Variablen und deren Werte als Liste von Elementen mit folgender Struktur: <entry><key>...</key><value>...</value></entry>, wobei das <key>-Element den Variablennamen als String angibt und das <value>-Element den Wert der Variablen enthält. Ein XPath-Ausdruck wie /core:Print/storage/entry[key="test"]/value liefert also den Wert einer Variablen test.
►HINWEIS◄ Im Unterschied zu den anderen Elementen ist das <storage>-Element nicht in einem Druck-XML enthalten, wenn dieses über den Ribbon-Befehl Druck-XML ansehen (s. folgendes Beispiel) interaktiv erzeugt wird. Allerdings existieren dann auch schlicht keine Variablen.
Der Rückgabewert ist immer vom Typ Text (string), außer falls bei der Interpretation des Ausdrucks mit den Objektdaten ein Problem auftritt, denn dann wird "kein Wert" (null) zurückgegeben. Ein echter Fehler, der z. B. mit einer Try-Catch-Aktion "behandelt" werden könnte, wird dabei allerdings nicht ausgelöst.
Beispiel für den Inhalt eines Druck-XML-Dokuments:
Für Objekte, auf die in Übersichten und Erfassungsmasken zugegriffen werden kann, bietet das Export-Ribbon den Befehl Druck-XML ansehen an, mit der eine Ausgabe wie die folgende (basierend auf der aktuellen Auswahl) erzeugt werden kann.
Die Ausgabe des benachbarten Ribbon-Befehls XML ansehen entspricht dabei weitgehend den im Element printObjects des Druck-XML-Dokuments je Objekt enthaltenen Daten.
Das folgende Beispiel zeigt den Aufbau eines Druck-XML-Dokuments mit einem Geschäftsobjekt vom Typ "Sendung" als einziges printObject:
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
core
:Print
xmlns:base
=
"SCM.BASE"
... >
<
base
:User ...>
...
</
base
:User>
<
base
:CompanyAccount ...>
...
</
base
:CompanyAccount>
<
locale
>de</
locale
>
<
printObjects
>
<
shp
:Shipment
id
=
"305"
...>
<
attributes
>
<
shp
:ShipmentNumericValue
id
=
"63"
...>
<
value
numericValueType
=
"GROSS_WEIGHT"
value
=
"3.2"
unit
=
"kg"
/>
</
shp
:ShipmentNumericValue>
...
<
shp
:ShipmentCompanyAddress ...>
<
value
companyType
=
"CNR"
reference
=
"354234653465"
>
<
address
salutation
=
"MR"
name1
=
"Max"
name2
=
"Mustermann"
accNumber
=
"1234567890"
accMatchCode
=
"Mustermann"
street1
=
"Hindenburgstraße"
streetNo
=
"15"
countryCode
=
"DE"
zipcode
=
"82343"
city
=
"Pöcking"
stateProvince
=
"Bayern"
stateCode
=
"BY"
>
<
attributes
>
<
base
:AddressCommunicationInfo
communicationType
=
"EMAIL"
communicationContext
=
"Vertrieb"
...>
<
communicationValue
>vertrieb@lobster.de</
communicationValue
>
</
base
:AddressCommunicationInfo>
...
</
attributes
>
</
address
>
</
value
>
</
shp
:ShipmentCompanyAddress>
...
<
shp
:ShipmentDate ...>
<
value
dateType
=
"DELIVERY_TO"
>
<
date
start
=
"1454454000000"
timeZone
=
"Europe/Berlin"
/>
</
value
>
</
shp
:ShipmentDate>
<
shp
:ShipmentDate ...>
<
value
dateType
=
"DELIVERY_FIXED"
>
<
date
start
=
"1455058800000"
end
=
"1455145199999"
timeZone
=
"Europe/Berlin"
/>
</
value
>
</
shp
:ShipmentDate>
...
</
attributes
>
<
lineItems
>
<
lineItem
numberOfPackages
=
"3"
typeOfPackaging
=
"BAG"
...>
...
</
lineItem
>
<
lineItem
numberOfPackages
=
"1"
typeOfPackaging
=
"BOX"
...>
...
</
lineItem
>
...
</
lineItems
>
</
shp
:Shipment>
</
printObjects
>
</
core
:Print>
Beispiele für den Zugriff auf Inhalt dieses Druck-XML-Dokuments mit XPath-Ausdrücken:
Ausdruck |
Rückgabewert |
Beschreibung |
Da sich alle Beispiele auf denselben Startpunkt (den Sendungskopf) beziehen, wird dieser hier nur einmalig ausgeschrieben. Allen nachfolgenden Beispielen verwenden die für relative Notation ausgehend vom Sendungskopf. |
||
/core:Print/printObjects/shp:Shipment |
(gesamte Sendung) |
in den folgenden Beispielen relativ als '.' adressiert |
./@id |
305 |
Das ID-Feld (id) der Sendung ist ein Attribut (@ als Präfix) im Element für den Sendungskopf (<shp:Shipment>). |
./attributes/shp:ShipmentCompanyAddress/value[@companyType='CNR']/@reference |
354234653465 |
Eine Firmenreferenz (reference) wird als Attribut aus dem value-Element eines Firmen-Adressattributs (shp:ShipmentCompanyAddress) für den Firmentyp (companyType) Versender ('CNR') gelesen. |
./attributes/shp:ShipmentDate/value[@dateType='DELIVERY_FIXED']/date/@start |
1455058800000 |
Der Von-Wert (start-Attribut) aus dem date-Elements im Wert (value) eines Datumsattributs (shp:ShipmentDate) für den Datumstyp (dateType) "Liefertermin fix" ('DELIVERY_FIXED') wird als long-Wert (in UTC-Millisekunden) zurückgegeben. In der Praxis werden Datums-/Zeitangaben oft über die date()-Funktion (s. u.) als lesbarer Textwert formatiert. |
./attributes/shp:ShipmentNumericValue/value[@numericValueType='GROSS_WEIGHT']/@value |
3.2 |
Hier wird der reine Zahlenwert (value-Attribut) aus einem numerischen Attribut vom Nummerntyp (numericValueType) "Gewicht Brutto" ('GROSS_WEIGHT') gelesen. |
Einbinden von XPath-Ausdrücken innerhalb der Vorlage:
XPath-Ausdrücke und die unten beschriebenen Funktionen müssen in geschweifte Klammern "{ ... }" eingeschlossen werden, da Zeichenfolgen ohne diese Kennzeichnung als Literale direkt ausgegeben werden.
Funktionsnamen muss zuätzlich ein Dollar-Zeichen "$" vorangestellt werden.
Beispiel: Vorlage zum Erstellen einer Ausgabe im HTML-Format:
Folgende Sendung wurde zugestellt:<
br
>
<
br
>
<
table
>
<
tr
><
td
>SendungsNr.</
td
><
td
>{/core:Print/printObjects/shp:Shipment/@id}</
td
></
tr
>
<
tr
><
td
>Geplantes Entladedatum</
td
><
td
>{$date("dd.MM.yyyy HH:mm:ss",{/core:Print/printObjects/shp:Shipment/attributes/shp:ShipmentDate/value[@dateType='DELIVERY_FIXED']/date/@start}) }</
td
></
tr
>
</
table
>
<
br
>
Positionen
<
br
>
<
table
>
{$ foreach( {/core:Print/printObjects/shp:Shipment/lineItems/lineItem} )
<
tr
><
td
>Anzahl Packstücke: {@numberOfPackages} Packstückart:{$r("typeOfPackaging",{@typeOfPackaging})}</
td
></
tr
>
}
</
table
>
HTML-Ausgabe mit konkreten Sendungsdaten:
HTML-Quelltext |
Ansicht im Browser |
Ausgabe
Folgende Sendung wurde zugestellt:< br > < br > < table > < tr >< td >SendungsNr.</ td >< td >305</ td ></ tr > < tr >< td >Geplantes Entladedatum</ td >< td >04.02.2016 09:39:00</ td ></ tr > </ table > < br > Positionen < br > < table > < tr >< td >Anzahl Packstücke: 3 Packstückart:Beutel</ td ></ tr > < tr >< td >Anzahl Packstücke: 1 Packstückart:Schachtel</ td ></ tr > </ table > |
Folgende Sendung wurde zugestellt: SendungsNr. 305 Geplantes Entladedatum 04.02 . 2016 09 : 39 : 00 Positionen Anzahl Packstücke: 3 Packstückart:Beutel Anzahl Packstücke: 1 Packstückart:Schachtel |
Funktionen für die Verwendung im Parameter "Vorlage"
WICHTIG
In den folgenden Beispielen wurden die dargestellten Ausdrücke zwecks übersichtlicherer Darstellung mit Zeilenumbrüchen wiedergegeben, die teilweise innerhalb einer Konfiguration so nicht vorkommen dürfen. Das Kopieren und Einfügen solcher Ausdrücke in eine konkrete Konfiguration ist daher nicht empfehlenswert, da Fehler oder unerwartete Ergebnisse auftreten können.
Funktion |
Syntax / Details |
Beispiele |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
date() |
{$date(Datumspattern,Datumswert[;Zeitzone])} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Das Datumspattern verwendet die Syntax für die Java-Klasse SimpleDateFormat, die unter dem folgenden Link im Detail spezifiziert ist: Patterns können insgesamt in doppelten Hochkommas ("") eingeschlossen werden. Dies ermöglicht z. B. die Verwendung von syntaxrelevanten Zeichen wie ( ) oder , innerhalb des Patterns. Literale Sequenzen können außerdem mit einfachten Hochkommas auskommentiert werden. Buchstaben sind in Patterns als Literale sonst unzulässig, bzw. werden nach der unten aufgelisteten Zuordnung als Platzhalten für Datumskomponenten interpretiert. Beispiel: {$date("h'h 'mm'm'",{timestamp})} erzeugt Ausgaben wie: "7h 05m" ►WICHTIG◄ Die Notation für das Datumspattern ist nicht identisch mit Zuordnungen im Kontext anderer Datumsfunktionen. Da sich die verwendeten Kennbuchstaben und deren Bedeutung teilweise überschneiden, ist es wichtig beim Aufbau von Patterns die spezifischen Zuordnungen und Logiken exakt zu beachten. Die nachfolgende Tabelle dient zum schnellen Nachschlagen und beschreibt nicht alle Details:
|
Beispiel: Datumsattribut "DELIVERY_FIXED" in System-Standardzeitzone ausgeben: {$date("dd.MM.yyyy HH:mm:ss (z)",{/core:Print/printObjects/shp:Shipment/attributes/shp:ShipmentDate/value[@dateType='DELIVERY_FIXED']/date/@start})} Ergebnis: "04.02.2020 09:39:00 (Europe/Berlin)" ... wenn die System-Standardzeitzone "Europe/Berlin" ist und das Datumsattribut existiert. ►HINWEIS◄ Wird das per XPath abgefragte Datumsattribut im Druck-XML eines Sendung nicht gefunden, führt der hier verwendete Direktzugriff zu einem Fehler und der Wertauflöser gibt ingesamt kein Ergebnis zurück. Mit der with()-Funktion (s. folgendes Beispiel) kann dieser Effekt bei Bedarf elegant vermieden werden. Beispiel: Datumsattribut "DELIVERY_FIXED"" in der gespeicherten Zeitzone ausgeben:{$with(/core:Print/printObjects/shp:Shipment/attributes/shp:ShipmentDate/value[@dateType='DELIVERY_FIXED']/date)
Ergebnis: "04.02.2020 07:39:00 (UTC)" ... wenn das Datum mit Zeitone 'UTC' gespeichert wurde. ►HINWEISE◄
Beispiel: Datumsattribut "DELIVERY_FIXED"" in der Default-Zeitzone des angemeldeten Benutzers ausgeben: {$date("dd.MM.yyyy HH:mm:ss (z)",
Ergebnis: "03.02.2020 21:39:00 (Pacific/Honolulu)" ... wenn die Default-Zeitzone "Pacific/Honolulu" im Benutzerkonto zugeordnet ist. ►HINWEIS◄ Falls im angemeldeten Benutzerkonto keine Angabe für die Default-Zeitzone gefunden wird, gibt der Wertauflöser insgesamt kein Ergebnis zurück. Dieser Fall kann bei Bedarf allerdings mit den Funktionen if und cmp abgefangen werden. Das könnte z. B. so aussehen: {$date("dd.MM.yyyy HH:mm:ss (z)",
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fn() Zahl formatieren
|
{$fn(Zahlenwert[Dezimalen=2[,Ganzzahlstellen=1[,Tausendertrennzeichen=false]]])} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Diese Funktion erstellt einen formatierten String aus einem verpflichtend bereitzustellenden Zahlenwert oder einem String, der als Zahlenwert interpretierbar ist. Die folgenden Parameter können optional angegeben werden, um Details zur Formatierung zu steuern:
►HINWEIS◄ Als Dezimal- und Tausendertrennzeichen werden die für die Aktuelle Sprache anwendbaren Lokalisierungen für die Sprachverwaltungseinträge lobsterui/decimalSeparator und lobsterui/thousandsSeparator herangezogen. |
Beispiel: Eine Variable mtom im Datenkontext enthält eine "Zahl mit Einheit" (UnitNumber), die mit Hinweis auf die Einheit und exakt 3 Nachkommastellen ausgegeben werden soll. {$with({//storage/entry[key='mtom']/value}) Ergebnis: (Beispieldaten) max. take-off mass [t]: 10,423 ►ANMERKUNG◄ Die Einheit kann hier ausschließlich über den "Alias" (s. Einheiten) gekennzeichnet werden, den die XML-Struktur für die UnitNumber direkt beinhaltet. Im String-Abbild einer UnitNumber wird im Unterschied dazu der "Name" (name) des zugehörigen Dynamischen Aufzählungswerts (z. B. TON) bzw. die anwendbare Lokalisierung (z. B. "Tonne") herangezogen, um die Einheit abzubilden. Im Kontext des Vorlage-Wertauflösers gibt es keinen direkten Weg, um diese Lokalisierung ausgehend vom "Alias"-String zu erhalten. Beispiel: Es sollen alle IDs und Namen der Attribute aufgelistet werden, die zur "Adresse" (address) des angemeldeten Benutzers gehören. Die IDs sollen dabei als exakt sechsstellige Ganzzahl (ggf. mit "Vornullen") und Tausendertrennzeichen abgebildet werden. {$foreach({/core:Print/base:User/address/attributes/*}) Ergebnis: (Beispieldaten) #016.153 - base:AddressCommunicationInfo |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
r() Lokalisierung |
{$r(Resource Bundle,Resource Name[,prepareValue=true[,param0[,param1,[...]]]])} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Diese Funktion ermittelt den über die Kombination aus Resource Bundle und Resource Name adressierten Übersetzungstext aus der Sprachverwaltung. Über den optionalen Parameter prepareValue (Standardwert: true) können Escape-Ersetzungen (z. B. für ZPL-Druckbefehle) ausgeschaltet werden (false). Über die nachfolgenden optionalen Parameter (param0, param1, ...) können Werte für die entsprechenden Platzhalter ({0}, {1}, ...) in Lokalisierungstexten bereitgestellt werden. ►HINWEIS◄ Anders als andere Zugriffsmethoden für die Sprachverwaltung sieht die r()-Funktion keine Definition für einen Standardwert vor, der als Rückgabewert zugewiesen würde, wenn für die gegebene Kombination von Resource Bundle und Resource Name kein Eintrag existiert. |
Beispiel: Beschriften einer Datumsangabe ausgehend von der Lokalisierung für den Datumstyp {$with ({/core:Print/printObjects/shp:Shipment/attributes/shp:ShipmentDate/value[@dateType='DISPATCH_DATE']}) {$r(de.lobster.scm.base.bto.attribute.DateType,{@dateType})}: {$date(y-MM-dd,{date/@start})}} Ergebnis: "Versanddatum: 2020-02-19"
Beispiel: Hervorheben eines Werts über eine als Sprachverwaltungseintrag definierte Formatierung {$r(textModules,highlight,,{/core:Print/base:User/address/@name1})} Ergebnis: "►Karola◄" |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
with() XPath-Kontext |
{$with({XPath-Ausdruck})Template-Ausdruck} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Die with()-Funktion definiert per XPath-Ausdruck ein bestimmtes Element aus dem Druck-XML als Bezugspunkt für die relative Interpretation weiterer im Template-Ausdruck enthaltener XPath-Ausdrücke. Da der gemeinsame Teil des XPath-Pfads dann nur einmalig im eingeklammerten Kopf des Funktionsaufrufs erscheint, fällt der Template-Ausdruck insgesamt kürzer und transparenter aus. Außerdem können die relativ definierten Ausdrücke durch Kopieren und Einfügen einfacher in einen anderen with-Kontext übertragen werden. Die relative Interpretation von XPath-Ausdrücken im Template-Ausdruck ermöglicht auch Zugriffe auf Knoten "oberhalb" der Einstiegsebene der with()-Funktion (../). Außerdem werden innerhalb des Template-Ausdrucks natürlich auch absolute Pfade zu beliebigen anderen Elementen aufgelöst. Der Template-Ausdruck kann beliebig komplexe Ausdrücke enthalten, also auch weitere Aufrufe der with()-Funktion, die dann vorübergehend einen neuen "verschachtelten" Kontext setzen. ►HINWEIS◄ Falls der verwendete XPath-Ausdruck mehrere Rückgabewerte liefert, gilt ausschließlich der erste "Treffer" als Kontext für den Template-Ausdruck. Um stattdessen sämtliche Rückgabewerte eines XPath-Ausdrucks zu verarbeiten, sollte die foreach()-Funktion (s. unten) anstelle von with() verwendet werden. |
Beispiel: Strukturierte Ausgabe der Adresse aus einem Firmenkonto {$with ({/core:Print/printObjects/base:CompanyAccount/address}) #{ @accNumber } (ID {../ @id }) { @name1 } { @name2 } { @name3 } { @street1 } { @streetNo } { @zipcode } { @city } {$r(de.lobster.scm.localization.Country,{ @countryCode })} }
Ergebnis: Ausgabe des Rückgabewerts des Wertauflösers in einem Popup vom Typ "Info": Beispiel: Ein ähnlicher Adressblock soll für ausgewählte Auftraggeber-Firmenattribute (Firmentyp AAL, CNE) einer Bestellung erzeugt werden: {$with ({/core:Print/printObjects/ord:Order/attributes/ord:OrderCompanyAddress/value[ @companyType = 'AAL' ]/company/address}) {$r(de.lobster.scm.base.company.CompanyType,{../../ @companyType })} ------------------------------------- #{ @accNumber } (ID {../ @id }) { @name1 } { @name2 } { @name3 } { @street1 } { @streetNo } { @zipcode } { @city } {$r(de.lobster.scm.localization.Country,{ @countryCode })} } {$with ({/core:Print/printObjects/ord:Order/attributes/ord:OrderCompanyAddress/value[ @companyType = 'CNE' ]/company/address}) {$r(de.lobster.scm.base.company.CompanyType,{../../ @companyType })} ------------------------------------- #{ @accNumber } (ID {../ @id }) { @name1 } { @name2 } { @name3 } { @street1 } { @streetNo } { @zipcode } { @city } {$r(de.lobster.scm.localization.Country,{ @countryCode })} }
Ergebnis:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
foreach() Schleife über XPath-Liste |
{$foreach({XPath-Ausdruck}) Template-Ausdruck} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Der Template-Ausdruck wird zyklisch für alle Elemente ausgewertet, die der XPath-Ausdruck zurückgibt. Für jede Iteration der Schleife gilt dabei ein anderer Rückgabewert als Kontext für die relative Interpretation von XPath-Ausdrücken, die im Template-Ausdruck enthalten sein können. Der Template-Ausdruck kann beliebig komplexe Ausdrücke enthalten, also auch weitere Aufrufe der foreach()-Funktion, die dann vorübergehend einen neuen "verschachtelten" Schleifenkontext setzen (s. letztes Beispiel rechts). |
Beispiel: In Anlehnung an die Beispiele für die with()-Funktion (s. o.) soll eine Liste aller an einer Bestellung beteiligten Firmen ausgegeben werden. {$foreach ({/core:Print/printObjects/ord:Order/attributes/ord:OrderCompanyAddress/value/company/address}) {$r(de.lobster.scm.base.company.CompanyType,{../../ @companyType })} ------------------------------------- #{ @accNumber } (ID {../ @id }) { @name1 } { @name2 } { @name3 } { @street1 } { @streetNo } { @zipcode } { @city } {$r(de.lobster.scm.localization.Country,{ @countryCode })} } Ergebnis: Eine Liste von Firmenadressen wie im vorigen Beispiel, allerdings inklusive weiterer Beteiligter, sofern vorhanden. Beispiel: Als Baustein einer HTML-Ausgabe soll eine Tabelle erzeugt werden, die auflistet in welcher Funktion (bzgl. Firmentyp) die aktuell angemeldete Firma an einer bestimmten Bestellung beteiligt ist. < table >{$foreach ({/core:Print/printObjects/ord:Order/attributes/ ord:OrderCompanyAddress/value[company/@id=/core:Print/base:CompanyAccount/@id]}) < tr > < td >{@companyType}</ td > < td >{$r(de.lobster.scm.base.company.CompanyType,{@companyType})}</ td > </ tr >} </ table >
Ergebnis: (mit einer anderen Bestellung als im Beispiel für die with()-Funktion)
Beispiel: Aus den Daten einer Bestellung soll ein Auszug aller enthaltenen Adressen gewonnen werden, der für jede Adresse ausgewählte Adressfelder als HTML-Liste wiedergibt, sofern vorhanden. {$with({/core:Print/printObjects}) {$foreach({.//address|.//contactAddress}) < p >ADDRESS # {@id} < ul >{$foreach({@*[starts-with(name(),'name') or starts-with(name(),'street') or contains('|zipcode|city|countryCode|',concat('|',name(),'|'))]}) < li >{.}</ li >} </ ul ></ p >} }
Ergebnis: (Auszug aus einer längeren Liste)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if() Bedingung |
{$if(if-Ausdruck) {then then-Ausdruck} [{elseif (elseif-Ausdruck) elseifthen-Ausdruck}] [{else else-Ausdruck}]} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Der Rückgabewert des if-Ausdrucks entscheidet darüber, welche der weiteren im Funktionsaufruf enthaltene Ausdrücke ausgewertet werden, um den Rückgabewert der if()-Funktion zu bestimmen. Entscheiden ist dabei immer, ob der Rückgabewert aus dem if-Ausdruck dem Text 'true' entspricht, wobei ausnahmsweise die Groß-/Kleinschreibung nicht beachtet wird. In diesem Fall gilt die "wenn"-Bedingung als erfüllt. Gelegentlich können entsprechende Werte direkt aus dem Druck-XML gelesen werden, weil sie - wie im ersten Beispiel rechts - Inhalte betreffen, die als Datentyp "boolean" bereits in geeigneter Form vorliegen. Meistens beinhaltet ein if-Ausdruck dagegen ein mehr oder weniger komplexes Prüfkriterium, in dem Inhalte anderer Datentypen über die Vergleichsfunktion cmp() "digitalisiert" also in Wahrheitswerte überführt werden können. Bei Bedarf können mehrere Wahrheitswerte mit den logischen Operatoren $and(), $or() und $not() im if-Ausdruck zu beliebig komplexen Aggregaten verknüpft werden. Ermitteln des Rückgabewerts per Fallunterscheidung (then - elseif - else): Ist die im if-Ausdruck spezifizierte Bedingung erfüllt, dann wird geprüft, ob der Funktionsaufruf einen Ausdruck enthält, der mit dem Schlüsselwort then ("dann") eingeleitet wird. Trifft dies zu, wird der enthaltene then-Ausdruck ausgewertet, um den Rückgabewert der if()-Funktion zu ermitteln. Wird das Schlüsselwort then nicht gefunden, tritt ein Fehler auf und der Wertauflöser liefert insgesamt das Ergebnis 'kein Wert' - außer die vereinfachte Syntax (s. o.) wird verwendet, bei der der then-Ausdruck ohne den Schlüsselwert direkt auf den if-Ausdruck folgt (s. zweites Beispiel rechts). Ist die im if-Ausdruck spezifizierte Bedigung nicht erfüllt, dann wird im Funktionsaufruf nach Ausdrücken mit dem Schlüsselwort elseif ("sonst-wenn") gesucht. Soweit vorhanden, werden diese in der Reihenfolge ihres Auftretens verarbeitet, indem zunächst geprüft wird, ob der enthaltene elseif-Ausdurck eine Rückgabe liefert, die dem Wert 'true' entspricht. Trifft dies zu, gilt die betreffende "sonst-wenn"-Bedingung als erfüllt und der zugehörige elseifthen-Ausdruck bestimmt den Rückgabewert der if()-Funktion. Ist die "sonst-wenn"-Bedingung nicht erfüllt, dann wird der ggf. nachfolgende elseif-Ausdruck ausgewertet. Falls für keinen der mit elseif eingeleiteten Ausdrücke die "sonst-wenn"-Bedingung erfüllt ist, oder überhaupt kein solcher Ausdruck existiert, wird geprüft ob der Funktionsaufruf einen Ausdruck mit dem Schlüsselwort else ("sonst") enthält. Trifft dies zu, bestimmt der enthaltene else-Ausdruck den Rückgabewert der if()-Funktion. Anderenfalls ist der Rückgabewert eine leere Zeichenfolge. ►ANMERKUNG◄ Technisch ist es möglich, mehrere Ausdrücke im Funktionsaufruf mit dem Schlüsselwort then oder else einzuleiten. Allerdings wird dann im Verlauf der oben beschriebenen Fallunterscheidung (ander als bei elseif) immer nur der erste "Treffer" berücksichtigt. ►WICHTIG◄ Logische Verknüpfungsfunktionen innerhalb des if-Ausdrucks oder eine elseif-Ausdrucks müssen jeweils von geschweiften Klammern eingeschlossen sein, damit wirklich das betreffende Zwischenergebnis "aufgelöst" wird: {$if({$or(true,false)})KORREKT} liefert "KORREKT", während der Ausdruck{$if($or(true,false))KORREKT} keine Ausgabe erzeugt, weil hier der vermeintliche Aufruf der or()-Funktion als Literal mit dem Wert 'true' verglichen wird, was für den if-Ausdruck 'false' ergibt. |
Beispiel: Name und Wert aller in einem hier nicht näher spezifizierten Kontext gefundenen Kennzeichenattribute (s. Kennzeichentyp) sollen in Textform aufgelistet werden. Der Kennzeichenwert soll dabei durch die Zeichen 'X' (true) und 'O' (false) symbolisiert werden. {$foreach({.//value[@flagValue and @flagType]})
Ergebnis: Popup zum Status von Auswahloptionen für einen Benutzer, wobei zwei von drei Kennzeichen gesetzt sind und eines nicht gesetzt (aber mit Wert 'false' vorhanden): Beispiel: In Anlehnung an das vorige Beispiel soll im ausgegebenen Text ein besonderer Hinweistext (z. B. "Kontaktaufnahme unerwünscht!") erscheinen, falls im Benutzerkonto keines der verfügbaren Kennzeichen gesetzt ist, die eine Zustimmung zu bestimmten Formen der Kontaktaufnahme signalisieren: {$if({$not({$or( {.//value[@flagType='SEND_MAIL']/@flagValue},
►HINWEIS◄ Beim Verarbeiten des if-Ausdrucks oben führt das Fehlen eines Kennnzeichenattributs (oder des darin enthaltenen flagValue-Felds) dazu, dass im jeweiligen Argument der or()-Funktion eine leere Zeichenfolge ("") mit 'true' verglichen wird, was 'false' liefert. Ob das Kennzeichen nicht gefunden wird oder explizit 'false' gesetzt ist, macht damit keinen Unterschied. Eine derartige "Opt-In"-Logik entspricht dem konkreten Zweck einer Zustimmung zur Kontaktaufnahme vermutlich recht gut. Für eine Interpretation der Kennzeichen nach "Opt-Out"-Logik, könnte der if-Ausdruck stattdessen z. B. so umgebaut werden: {$if({$and( {$cmp({.//value[@flagType='SEND_MAIL']/@flagValue},=,false)}, {$cmp({.//value[@flagType='SEND_NEWS']/@flagValue},=,false)})}){$r{PRIVACY_STATUS,ZERO_SPAM}}}
►ANMERKUNG◄ Da die vereinfachte Syntax der if()-Funktion letztlich nur eine "bedingte Ausgabe" des then-Ausdrucks bewirkt, lässt sich ein vergleichbares Ergebnis oft auch erzielen, indem man eine vergleichbare Logik im Prädikat eines XPath-Ausdrucks innerhalb einer with()-Funktion formuliert. Für eine "Opt-Out"-Prüfung im Beispiel wäre etwa auch der folgende Ansatz zielführend: {$with({./attributes[ .//value[@flagType='SEND_MAIL' and @flagValue='false'] and .//value[@flagType='SEND_NEWS' and @flagValue='false'] ]}){$r{PRIVACY_STATUS,ZERO_SPAM}}} Das hier als Bezugspunkt neu einbezogene attributes-Element stammt aus dem in den vorigen Varianten nicht komplett wiedergegeben Zusammenhang der Auswertung. Das zugehörige Prädiakt stellt sicher, dass unter den betreffenden Attributen beide Kennzeichentypen gefunden werden und auch explizit den Kennzeichenwert (flagValue) 'false' definieren. Beispiel: Der Text einer Benachrichtigung soll personalisiert werden, indem Adressmerkmale ("Anrede" und "Nachname") einbezogen werden. Hier wird unterstellt, dass der Nachname stets im Feld "Name 3" (name3) einer Adresse eingetragen ist und das im Feld "Anrede" (salutation) die Werte 'MR' und 'MS' (s. Anrede) für den Anwendungsfall relevant sind. {$with({/core:Print/base:User/address}) Sehr geehrte{$ if ({$cmp({ @salutation },=,MR)}){then r Herr} {elseif ({$cmp({ @salutation },=,MS)}) Frau} { else r User}} { @name3 }! ... }
►HINWEIS◄ Nach jedem der Schlüsselwörter then, else oder elseif muss ein Leerzeichen folgen, das als Teil der Syntax und nicht etwa als Bestandteil eines nachfolgenden Literals betrachtet wird. Dagegen sieht die syntax keine Leerzeichen nach der schließenden Klammer für den elseifthen-Ausdruck vor. Aus diesem Grund schließen im Beispiel {then r Herr} und {else r User} direkt an den vorherigen Text ('Sehr geehrte') an, während das Leerzeichen vor 'Frau' in {elseif (...) Frau} notwendig ist, um den angemessenen Abstand von diesem Text sicherzustellen. Ergebnisse:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cmp() Vergleichs-Funktion |
{$cmp(linkerAusdruck,Vergleichsoperator,rechter Ausdruck[,Vergleichsdatentyp])} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Die cmp()-Funktion vergleicht die Rückgabewerte bzw. Literale von linkerAusdruck und rechterAusdruck abhängig vom angegeben Vergleichsoperator und gibt die Zeichenfolge "true" zurück, wenn die dadurch definierte Bedingung erfüllt ist (sonst "false").
Der optionale Parameter Vergleichsdatentyp definiert einen spezifischen Ziel-Datentyp für die Interpretation der Rückgabewerte von linkerAusdruck und rechterAusdruck bei der Prüfung der Vergleichsbedingung.
►HINWEISE◄ Per Standard werden die Ausdrücke als Zeichenfolgen verglichen, was beim Vergleichen von numerischen Daten ohne Angabe für den Vergleichsdatentyp nur in Sonderfällen die gewünschten Vergleichsergebnisse liefert. Für den Vergleich von Zahlenwerten ist es daher grundsätzlich empfehlenswert immer einen geeigneten Vergleichsdatentyp anzugeben, auch wenn ein Ausdruck ohne eine explizite Spezifikation in oberflächlichen Tests plausible Ergebnisse liefert. Wenn ein numerischer Vergleichsdatentyp angegeben wird, müssen die Rückgabewerte von linkerAusdruck und rechterAusdruck mit dem Zielformat kompatibel sein, sonst läuft der Wertauflöser insgesamt auf einen FEHLER oder das Vergleichsergebnis ist nicht aussgekräftig. Konkret bedeutet das (s. a. Beispiele rechts):
Für Datums-/Zeitangaben, die üblicherweise als Zahlenangabe (UTC-Millisekunden) vorliegen, eignet sich ein Double-Vergleich oder ein String-Vergleich, wenn die Millisekunden je Ausdruck mit Hilfe der date()-Funktion vorher geeignet formatiert werden. Abhängig vom dabei verwendeten Datumspattern ermöglicht ein String-Vergleich dabei wesentlich spezifischere Analysen als die Bewertung der relativen Terminlage am UTC-Zahlenstrahl (s. Beispiele rechts). Vergleiche von Wahrheitswerten, z. B. aus Kennzeichenattributen, ermöglicht bei Bedarf der String-Vergleich mit den Werten "true" und "false". ►ANMERKUNG◄ Wenn Textwerte aus Ausdrücken als Wahrheitswert verglichen werden sollen, ohne dass eine einheitliche "Groß-/Kleinschreibung" sichergestellt ist, empfiehlt es sich, je Ausdruck die and()- oder or()-Funktion zu verwenden, um die ggf. uneinheitliche Schreibung zu neutralisieren. Beispiel: Es soll festgestellt werden, ob zwei fiktive Felder (required und granted) eines Elements (permission) auf denselben Wahrheitswert verweisen. Ein Ausschnitt aus einem Druck-XML könnte so aussehen: <permission type= "00" required= "TRUE" granted= "true" ></permission> Ein Ausdruck wie {$cmp(@required,=,@granted)} würde für dieses Element "false" liefern, weil die Texte hier nicht identisch sind, obwohl das vermutlich nicht dem Sinn der Prüfung entspricht. Der folgende Ausdruck sieht über die unterschiedliche Schreibweise der Kennzeichen hinweg und meldet per "true" Übereinstimmung: {$cmp({$or({@required})},=,{$or({@granted})})} |
Beispiele:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
and() UND-Verknüpfung |
{$and(Ausdruck[,Ausdruck[,...]])} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Die and()-Funktion wertet alle als Argument übergebenen Ausdrücke einzeln aus und verknüpft deren Ergebnisse als logische UND-Verknüpfung (Konjunktion), d. h. nur wenn jeder einzelne Ausdruck einen Wert liefert, der "true" entspricht (ohne Beachtung der Groß-/Kleinschreibung), liefert die und()-Funktion auch den Wert "true" - sonst "false". |
Beispiele: Anstelle der hier vor allem zwecks Transparenz verwendeten Literale können XPath-Ausdrücke oder andere Funktionen eingesetzt werden.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
or() ODER-Verknüpfung |
{$or(Ausdruck[,Ausdruck[,...]])} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Die or()-Funktion wertet alle als Argument übergebenen Ausdrücke einzeln aus und verknüpft deren Ergebnisse als logische ODER-Verknüpfung (Disjunktion), d. h. sobald auch nur ein Ausdruck einen Wert liefert, der "true" entspricht (ohne Beachtung der Groß-/Kleinschreibung), liefert die or()-Funktion auch den Wert "true" - sonst "false". |
Beispiele: Anstelle der hier vor allem zwecks Transparenz verwendeten Literale können XPath-Ausdrücke oder andere Funktionen eingesetzt werden.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
not() Negation |
{$not(Ausdruck)} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Die not()-Funktion dient zur logischen Negation eines durch den Ausdruck definierten Wahrheitswerts. Entspricht dieser der Zeichenfolge "true" (ohne Beachtung der Groß-/Kleinschreibung), lautet der Rückgabewert "false" - sonst "true". |
Beispiele: Anstelle der hier vor allem zwecks Transparenz verwendeten Literale können XPath-Ausdrücke oder andere Funktionen eingesetzt werden.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
substr() Teilzeichenfolge |
{$substr(Startindex,Zeichenanzahl,Ausdruck)} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Die substr()-Funktion extrahiert einen bestimmten Abschnitt aus der Zeichenfolge, im Parameter Ausdruck der als Literal oder über einen XPath-Ausdruck definiert wird. Der Funktionsaufruf verlangt zwei integer-Argumente, die die Startposition und die (maximale) Länge des Ausschnitts fest. Diese können nicht durch Ausdrücke bestimmt sein, sondern verlangen explizite Zahlenwerte (vom Typ integer):
►HINWEIS◄ Da intern ein "Endindex" durch eine Addition von Startindex + Zeichenanzahl berechnet wird, muss diese Summe ebenfalls noch im Wertebereich für integer-Werte (max. 231-1 = 2147483647) liegen. |
Beispiele: Für die folgenden Beispielen wird als Kontext ein address-Element angenommen, das im Druck-XML (Auszug) etwa so aussehen könnte: ... <address id=... name1= "♥ Karola" name2= "" name3= "Mustermann" > ... </address> ... Es wird angenommen, dass die Beispiel Ausdrücke in einem with()-Kontext ausgeführt werden, der auf dieses <address>-Element verweist.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bsh() bsh-Skript |
{$bsh(Skript-Ausdruck)} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Der Skript-Ausdruck wird als bsh-Skript ausgeführt und der interpretierte Wert als String zurückgeliefert. |
Die Verwendung von Bean Shell-Skript in Lobster Data Platform / Orchestration erfordert fortgeschrittene Programmiererfahrung und intensive Systemkenntnisse. Durch fehlerhafte Verwendung von Skript kann erheblicher und unwiderruflicher Schaden am System und dem Datenbestand entstehen. Die Funktion bsh() dient ausschließlich zur Behandlung von Anforderungen, die so speziell sind, dass sie mit generischen Konfigurationsmöglichkeiten nicht abgedeckt werden können. Bitte kontaktieren Sie für weitere Informationen oder bei Interesse an Schulungen/Workshops den Lobster Data Platform / Orchestration-Support per support.pro@lobster.de. |