E-Book Startseite Karteikarten-Programm
0

Argumente wahr und falsch

In der Computertechnik gibt es das 2er-System. In der Programmierung bedeutet dies wahr (also true - 1) oder falsch (false - 0). XPath stellt 3 Funktionen für das Arbeiten mit diesen Werten bereit. Die XPath-Funktion bietet für das Erstellen des booleschen Werts wahr die Funktion true() zur Verfügung. Ein Argument benötigt bzw. besitzt diese Funktion nicht. Eingesetzt kann die Funktion bspw. in select-Attributen. Um den booleschen Wert falsch zu erstellen gibt es die Funktion false(). Auch diese Funktion besitzt keine Argumente und kann bspw. in select-Attributen eingesetzt werden. Viel interessanter jedoch ist die Funktion boolean(). boolean() kann ein Argument mit den Angaben true oder false bewerten. Innerhalb der Klammer, also als Argument, muss lediglich der Ausdruck notiert werden. Dies kann bspw. eine weitere Funktion sein oder der Name eines bestimmten Knotens. Mit dieser XPath-Funktion kann man in einem xsl:when-Element überprüfen ob beide Werte den gleichen booleschen Wert zurückliefern. Das heißt in unserem Code muss element1 und element2 den gleichen Wert zurückliefern. Mit dieser Anweisung kann geprüft werden ob beide Elemente, also element1 und element2, vorhanden sind oder nicht vorhanden sind. Hier ein Code eines test-Attributs eines when-Elements:

boolean(element1) == boolean(element2)

Knoten und Namen ermitteln

Es gibt viele verschiedene XPath-Funktionen um Daten über Knoten und deren Namen zu ermitteln. Hier stellen wir insgesamt 5 Funktionen vor um solche Daten zu ermitteln. Die wohl wichtigste bzw. am häufigsten verwendete Funktion ist current(). current() kann sowohl in select-Attributen, innerhalb von anderen Funktionen aber auch an anderen Stellen eingesetzt werden. current() bewirkt das gleiche wie die XPath-Pfadangabe . (Punkt). Hier 2 Codes die dasselbe bewirken:

<xsl:value-of select="." />
<xsl:value-of select="current()" />

Nun gibt es 3 weitere Funktionen, die sehr eng beieinander stehen: name(), local-name() und namespace-uri(). Innerhalb der Klammer, kann als Argument das Knoten-Set ausgewählt werden, auf welches sich die Funktion beziehen soll. Diese Regel gilt für alle 3 Funktionen. Die Funktion local-name() gibt den Namen des Elements aus. name() gibt zwar ebenfalls den Namen des Elements aus, jedoch mit Namensraum. Stellen wir uns vor wir haben ein Element <xml:element>. Die Funktion local-name gibt den Wert "element" aus. Die Funktion name() dagegen gibt "xml:element" aus. Nachdem nun nur noch die Funktion namespace-uri() vorhanden ist, könnte man meinen diese Funktion würde im oberen Beispiel nur den Wert xml zurückgeben. Dies ist jedoch nicht der Fall, denn die Funktion gibt nicht den Namen des Namensraums aus, sondern den URI. Der URI ist die Adresse des Namensraums. Bei XSLT wäre der URI http://www.w3.org/1999/XSL/Transform. Eingesetzt werden können die Funktionen in select-Attributen aber auch in Abfrage-Reihen oder anderen.

<xsl:value-of select="local-name()" />
<xsl:value-of select="name()" />
<xsl:value-of select="namespace-uri()" />

Wer in Listen, Kontakt-Datenbanken oder anderen die Einträge zählen will wird sich freuen, denn auch dafür gibt es eine XPath-Funktion: count(). Innerhalb der Klammer wird ein Knoten-Set ausgewählt. Stellen wir uns vor das Wurzelelement heißt liste und die untergeordneten Elemente heißen eintrag. Nun kann man mit dem folgenden Code alle untergeordnete Elemente von dem Element liste zählen das heißt es werden alle Elemente die dem Element liste untergeordnet sind gezählt und in einer Variable gespeichert:

<xsl:variable name="eintragszahl" select="count(liste)" />

Positionen ermitteln

Für die genaue Positionsbestimmung gibt es 2 Funktionen: position() und last(). Des Weiteren spielt auch die Funktion count manchmal eine wichtige Rolle. In der Praxis wird jedoch selten count() vewendet und stattdessen last(). In der vorherigen angesprochen Listen-Ordnung mit der Variabel könnte man statt der count()-Funktion genauso gut die Funktion last() verwenden. count() zählt die Elemente - last() dagegen ermittelt dagegen an wievielter Position das letzte Element ist. In der Praxis bewirken jedoch beide Funktionen die gleichen nummerischen Werte. Daher ist es letzendlich egal welches man verwendet. Ein wichtiger Unterschied zwischen count() und last() ist jedoch noch, dass bei last() keine Argumente (wie z. B. eine Pfadangabe) angegeben werden, dass heißt last() muss immer mit Template-Definitionen so eingeschränkt werden, dass es an der richtigen Stelle das letzte Element ermittelt. count() dagegen kann auch ganz außerhalb von Template-Definitionen zum Speichern des Wertes in einer Variabel vorkommen. Für manche Programmierungen heißt das also, dass last() nicht geeignet ist. Es gibt also doch einen kleinen, aber in manchen Fällen, bedeutenden Unterschied. position() ist vom Aufbau gleich wie last(). position() ermittelt jedoch die Nummer des aktuellen Knotens. In Listen, kann man mit den Funktionen position() und count() vor den eigentlichen Inhalt des Elements den folgenden Text schreiben: x von y: INHALT - So etwas würde sich durch eine for-each-Schleife leicht realisieren. Hier das selbe Beispiel mit position() und last():

<xsl:value-of select="position()" />
<xsl:text> von </xsl:text>
<xsl:value-of select="last()" />


Zeichenkette und Teilzeichenkette

Um mit Zeichenketten und Teilzeichenketten zu arbeiten hat XPath 8 Funktionen bereitgestellt, mit dem man sehr interessante Dinge anstellen kann. Wir beginnen mit einer einfachen Funktion. Manchmal kann es vorkommen, dass Elemente Zahlen enthalten, obwohl Sie eigentlich Text enthalten sollen. Daher kann man mit der Funktion string() Zahlen aber auch boolesche Werte in eine Zeichenkette übersetzten, das heißt bspw. aus 10 wird "10" und aus true wird "true". Dieser Vorgang nennt man Argument in Zeichenkette umwandeln. Sobald diese Aktion ausgeführt wurde, wird der Inhalt auch gleich ausgegeben. Als Inhalt der Klammer können weitere Funktion notiert werden, aber auch eine Variable oder ein manuell eingetragener Wert. Wird nichts angegeben handelt es sich um den aktuellen Knoten.

<xsl:value-of select="string()" />

Eine interessante Funktion ist die Ermittlung der Länge eines Strings: string-length(). Eine Verwendung für diese Funktion kann man in Abfrage-Reihen oder if-Bedingungen finden. So kann bspw. in einem Formular ermittelt werden, ob das Vorname-Feld bspw. nur 2 Zeichen hat. Übrigens handelt es sich bei dem auf string-length() bezogenen Wert um keine Zeichenkette wird dieser erst in eine Zeichenkette umgewandelt. Für das Argument innerhalb der Klammer dürfen ebenfalls weitere Funktionen, Variablen oder manuelle Werte angegeben werden. Wird nichts angegeben handelt es sich um den aktuellen Knoten.

<xsl:when test="string-length() &lt; 2" >

Zeichenketten zusammenfügen ist auch keine Kunst. Dafür gibt es die Funktion concat(). In der Klammer muss man nur noch die Variablen oder den Knoten angeben. Die einzelnen Zeichenketten werden durch Komma getrennt. Wer noch manuell Text dazu eingeben möchte, kann dies auch tun. Der manuelle Text muss natürlich noch mit den einfachen Anführungszeichen gekennzeichnet werden. Verwenden kann man die Funktion an allen möglichen Stellen, wo diese Sinn machen. Auch hier gilt: handelt es sich um keine Zeichenkette wird sie erst umgewandelt.

<xsl:value-of select="concat(name, 'ist geboren am', geburtstag)" />

Zwei tolle Funktionen bei XPath sind für die Überprüfung von Zeichenketten zuständig: contains() und starts-with(). Die contains()-Funktion überprüft ob bestimmte Buchstaben oder Zeichen (also eine Teilzeichenkette) in einer Zeichenkette vorhanden sind. In der Klammer müssen immer zwei Werte stehen: Der erste Wert muss ein element sein, in dem gesucht werden soll. Danach folgt ein Komma und dann als zweiter Wert eine Teilzeichenkette. Man sollte hier nicht in einem weiteren Element suchen und nicht mit Variablen arbeiten, sondern die Teilzeichenkette direkt eingeben (also in einfachen Anführungszeichen). Die Überprüfungs-Funktion starts-with() prüft, wie der Name schon sagt, mit was der String beginnt. Der Aufbau ist gleich: Zeichenkette, Teilzeichenkette - Hier dürfen auch bei der Teilzeichenkette ein Element / Knoten verwendet werden. Die Verwendung von Variablen ist bei Zeichenkette und Teilzeichenkette ebenfalls unproblematisch. Beide Funktionen können nur die Werte true und false zurückliefern.

<xsl:if test="starts-with(.,'Müller')" >

Um Zeichenketten in Einzelteile zu zerlegen gibt es 3 verschiedene XPath-Funktionen: substring(), substring-before() und substring-after(). Die Funktion substring() ist dazu fähig einen bestimmten Teil aus einer Zeichenkette zu extrahieren. Innerhalb der Klammer müssen 2 oder 3 Daten notiert werden. Als erstes muss die Zeichenkette ausgewählt werden. Dabei darf entweder ein Element eine Variabel oder ein manueller Wert verwendet werden. Als nächstes wird die Nummer des Zeichens ausgewählt, ab dem extrahiert werden soll (Bsp. 4 bedeutet ab dem 4. Zeichen). Die 3. Angabe ist nicht notwendig und wird nur in manchen Fällen benötigt. Mit der 3. Angabe kann angegeben werden für wie viele Zeichen die Extrahierung gelten soll. Getrennt werden die 2 oder 3 Werte durch Kommas. Die Angabe substring(.,4,4) bedeutet das vom aktuellen Knoten ab Zeichen 4, 4 Zeichen extrahiert werden sollen. Mit den Funktionen substring-before() und substring-after() lassen sich Zeichenketten vor oder ab dem ersten Vorkommen von einem oder mehreren bestimmten Zeichen (Teilzeichenkette) ausgeben. Stellen Sie sich vor wir haben eine mathematische Gleichung x+y=z. Nun wollen wir die linke Seite der Gleichung und die rechte Seite der Gleichung extra ausgeben. Nehmen wir an die Funktion substring() können wir nicht verwenden, da wir nicht wissen, wie viel Zeichen es sind. Deshalb nehmen wir die Funktion substring-beofre(). Als Argument in der Klammer benötigen wir 2 Dinge: 1. Die Zeichenkette die die Gleichung enthält (Element, Variabel oder manueller Wert) - 2. Die Teilzeichenkette oder das Zeichen, wessen Inhalt wo sich davor befindet wir extrahieren wollen (Inhalt in einfach Anführungszeichen noteiren!). In unserem Beispiel notieren wir also substring-before(.,'='). Als Ergebnis erhalten wir: x+y Die Funktion substring-after() ist genau gleich aufgebaut wie substring-before(). Vom englischen kann man ableiten, dass diese Funktion nicht den Inhalt vor (before) dem Zeichen extrahiert, sondern den nach (after) dem Zeichen. Auf unser oberes Beispiel bezogen würden wir als Ergebnis z erhalten.

<xsl:value-of select="substring-before(., '=')" />
<xsl:value-of select="substring-after(., '=')" />


Arbeiten mit Zahlen

Auch die Arbeit mit Zahlen, vereinfachen uns manche XPath-Funktionen. Um eine Zeichenkette als Zahl zu interpretieren, benötigen wir schon mal die erste Funktion: number(). Mit der Funktion number() lässt sich eine Zeichenkette wie "7 " in 7 umwandeln. Werden Zeichenketten ausgewählt, bei denen es nicht um Nummern handelt kommt die Meldung NaN (Not a Number). Die Werte true und false dagegen, werden in 1 (true) und 0 (false) übersetzt. Wichtig zu wissen ist, dass bei einer Angabe wie bspw. "15z", die Zahl 15 verwendet wird. Innerhalb der Klammer von number() kann ein Element, eine Variable oder ein manueller Wert angegeben werden. Bei keiner Angabe wird der aktuelle Knoten bearbeitet.

<xsl:value-of select="number()" />

Wer mit XPath-Funktionen auf- oder abrunden möchte, für den gibt es die Funktionen floor(), ceiling() und round(). Der Aufbau der Funktionen ist immer gleich in der Klammer muss der Knoten notiert werden für welchen die Funktion angewendet werden soll. Handelt es sich noch um eine unformatierte Zahl, wird Sie erst als Nummer interpretiert, indem indirekt die Funktion number() angewendet wird. Die Funktion floor() rundet in allen Fällen die Zahl ab, das heißt egal ob die Zahl 2.34 oder 2.89 lautet: das Ergebnis ist beides Mal 2. Die Funktion ceiling() ist das genaue Gegenteil, denn hier wird in allen Fällen die Zahl aufgerundet, das heißt egal ob die Zahl 2.34 oder 2.89 lautet: das Ergebnis ist beides Mal 3. Die Funktion round() rundet kaufmännisch. Dabei ist wichtig zu wissen, dass 3,49 nicht auf 4 aufgerundet wird sondern auf 3 abgerundet wird. Der Grund dafür ist, dass nur eine Stelle nach dem Komma interessant ist. Wie Ihnen vielleicht aufgefallen ist wurden bei den Funktionen floor() und ceiling() Punkte als Komma verwendet und bei round() nicht. Dies ist für die Programmierung sehr wichtig zu wissen!

<xsl:value-of select="floor(wert)" />
<xsl:value-of select="ceiling(wert)" />
<xsl:value-of select="round(wert)" />

Mit Zahlen rechnen ist in XPath leider so gut wie nicht möglich, da es nur eine XPath-Funktion gibt. Diese XPath-Funktion heißt sum() und kann wie der Name schon sagt nur addieren. Voraussetzung für das Zusammenzählen der verschiedenen Werte ist, dass alle Werte die zusammengezählt werden sollen sich innerhalb eines Knoten-Sets befinden. Als Argument in der Klammer von sum() muss das Knoten-Set angegeben werden.

<xsl:value-of select="sum(wertliste)" />

Ein sehr interessantes Thema, ist die Formatierung von Zahlen, dafür gibt es die XPath-Funktion format-number(). In der Klammer werden 2 oder 3 Werte notiert. Der 1. Wert gibt den Pfad zum Element / Attribut an welcher formatiert werden soll. Statt der Pfadangabe darf auch eine Variable verwendet werden. Der 2. Teil ist die sogenannte Formatregel. Dazu gleich mehr ... Der 3. Wert ist nicht zwingend notwendig und wird nur verwendet, wenn im XSLT-Dokument das Element decimal-format in Kraft treten soll. Getrennt werden die Werte durch Komma. Die Formatregel gibt die Regel an, wie Zahlen dargestellt werden soll. Dazu sind viele verschiedene Zeichen möglich: 0 (Platzhalter für eine Zahl oder die Anzeige von 0), # (Platzhalter für eine Zahl - keine Anzeige von 0), . (Punkt Trennzeichen), , (Komma Trennzeichen), - (Vorzeichen Minus), % (Anzeige von Prozentwerten) und noch viele mehr. Das Format muss in einfachen Anführungszeichen gesetzt werden. Das totale Verständnis für die Format-Regeln erhält man nur durch vieles ausprobieren.

<xsl:value-of select="format-number(.,'#.##0,0')" />

Suchen und Ersetzen

Suchen und Ersetzen ist wohl eine sehr bekannte Funktion in allen möglichen Programmiersprachen. XPath bietet dafür auch eine Funktion: translate(). Die translate()-Funktion ist sehr verständlich aufgebaut. Die Funktion erwartet 3 Argument: Zeichenkette für die die Funktion gelten soll - Zeichen die durch andere ersetzt werden sollen - Zeichen die mit den anderen Zeichen ersetzt werden sollen. Das 2. und 3. Argument ist in einfachen Anführungszeichen zu notieren. Wird das dritte Argument nur '' so notiert werden die angegebene Zeichen durch nichts ersetzt, jedoch die alten Zeichen gelöscht. Bitte denken Sie daran: XPath unterscheidet zwischen Groß- und Kleinschreibung!

<xsl:value-of select="translate(.,'123', '456')" />

Zugriffsschlüssel

Um XSLT die Arbeit zu erleichtern gibt es die sogenannten Zugriffsschlüssel. Definiert werden die Zugriffsschlüssel mit dem XSLT-Element key. In dem Zugriffschlüssel werden bestimmte Daten gespeichert. Nun kann man bspw. mit einer for-each-Schleife die Inhalte wieder ausgeben. Und dort kommt nun die XPath-Funktion key() zum Einsatz. Die XPath-Funktion kann nun prüfen welchen Wert oder Inhalt das Attribut oder Element hat und nur wenn die Bedingung dazu erfüllt ist bestimmte Schritte auszuführen. In der Klammer von key() müssen 2 Dinge notiert werden: Als 1. muss der Name des im key-Elements vergebenen Namen notiert werden und als 2. Wert der Wert oder Inhalt welches das Attribut oder Element enthalten muss, dass die Bedingung erfüllt werden kann. Beide Werte müssen in einfachen Anführungszeichen notiert werden und durch Komma getrennt werden. Weitere Informationen hier.

<xsl:for-each select="key('schlüsselname', 'vorraussetzungswert')" >

Aufruf einer XML-Datei

Die letzte XPath-Funktion die wir hier vorstellen, hat die Fähigkeit ein anderes XML-Dokument in den Ergebnisbaum zu importieren. Dafür gibt es die Funktion document(). Es gibt 2 Methoden diese Funktion zu nutzen. Die 1. Methode ist, Sie geben innerhalb der Klammer einfach eine relative oder absolute Pfadangabe zu einer Datei an. Die 2. Methode ist, Sie geben mit einer XPath-Pfadangabe einen Knoten oder ein Knoten-Set an, welches mit allen seinen Unterelementen mit eingebunden werden soll. Natürlich ist es bspw. auch möglich die Pfadangabe über einen Wert eines Attributs herzuleiten.

<xsl:value-of select="document(http://www.homepage-webhilfe.de/Beispiel/baumstruktur.xml)" />
Design:
 


Logo
Benjamin Jung
Krummstr. 9/3
73054 Eislingen

E-Mail: info@homepage-webhilfe.de
Webseite: www.homepage-webhilfe.de