Eine kurze Einführung in XPath

Für Formeln und Ausdrücke wird in MobileTogether XPath verwendet.

Wenn Sie Formeln in einem Excel-Arbeitsblatt verwenden können, lernen Sie auch schnell, wie Sie XPath-Formeln oder -Ausdrücke in MobileTogether erstellen. Dazu müssen Sie nur einige Grundprinzipien verstehen. Genauso mühelos wie Sie in Excel mit dem Formel-Generator Formeln in Ihren Arbeitsblättern schreiben können, können Sie mit dem XPath Builder in MobileTogether XPath-Ausdrücke erstellen.

Woher kommt der Name XPath?

Das "X" in XPath hat seine Wurzeln in XML, der "eXtensible Markup Language", Path kommt daher, weil man zum Identifizieren der einzelnen Daten ein Pfadformat verwendet. Alle in MobileTogether verwendeten Datenquellen werden im MobileTogether Designer-Fenster auf der rechten Seite unter "Seitenquellen" in Form einer Baumstruktur dargestellt. Jede Baumstruktur hat eine Wurzel (root) mit einem Namen wie z.B. $XML1 oder $DB1. Unterhalb dieser Wurzel befinden sich einzelne Datenelemente - die sogenannten Elemente. Diese Elemente sind in einer logischen Baumstruktur verschachtelt. Jedes dieser Elemente kann erweitert und reduziert werden, um zu sehen, was sich unterhalb dieses Elements befindet. Das Beste an MobileTogether ist: Es spielt keine Rolle, ob die zugrunde liegenden Daten aus einer Datenbank, einem XML-Dokument, einem Webservice oder irgendeiner anderen Datenquelle stammen. Alle Daten werden auf die gleiche Weise dargestellt bzw. können auf die gleiche Art aufgerufen werden.

Mit Hilfe von XPath können Sie durch diese Baumstrukturen navigieren, um Datenelemente mit Objekten auf der Benutzeroberfläche Ihres Mobilgeräts zu verknüpfen. Dabei navigieren Sie ähnlich wie in einer Verzeichnisstruktur im Dateisystem Ihres Computers. Egal, ob Sie normalerweise mit Windows, Linux- oder MacOS arbeiten, Dateien auf Ihrem Computer werden immer über einen Pfad wie den folgenden aufgerufen:

C:\Benutzer\Spock\Dokumente\WissenschaftlicheDaten (Windows)
/Benutzer/Kirk/Dokumente/SchöneAlienFrauen (Linux/Mac)

Sehen wir uns einen XPath-Beispielausdruck zum Vergleich an:

$DB1/salesdata/region/month/gadgets

Wie Sie sehen, ist die Idee genau die gleiche. Mit Hilfe von XPath-Ausdrücken können Sie auf genau die gleiche Art durch Datenstrukturen navigieren, wie Sie mit Hilfe eines Pfads durch das Dateisystem Ihres Computers navigieren. Zur Trennung der einzelnen Elemente im Pfad wird in XPath der Schrägstrich / verwendet, genau wie in Linux und Mac, wo Verzeichnisse durch einen Schrägstrich getrennt werden.

Interessanterweise gilt diese Analogie auch für zwei gebräuchliche Abkürzungen in XPath. Wie ein einzelner Punkt . in einem Dateisystem für das aktuelle Verzeichnis steht, so steht der . auch in XPath für das aktuelle Element, während der doppelte Punkt .., der in einem Dateisystem für das übergeordnete Verzeichnis steht, in XPath für das übergeordnete Element steht.

Attribute

Wenn es sich bei Ihrer Datenquelle um ein XML-Dokument handelt oder um XML-Daten, die aus einem Webservice stammen, so gibt es in dieser Baumstruktur zwei verschiedene Datenvarianten: Elemente und Attribute. Elemente bilden in XML die wichtigsten Datenelemente. Sie können verschachtelt werden, sodass ein Element Child-Elemente enthalten kann. Attribute dagegen sind einfache Datenwerte, die an Elemente angehängt werden. Unter "Seitenquellen" sehen Sie in den Baumstrukturen, dass Attribute durch ein = (Gleichheitszeichen) vor ihrem Namen gekennzeichnet sind. Das kommt daher, dass Attribute in einem XML-Dokument z.B. als Farbe="grün" geschrieben werden.

Wenn Sie Attribute in einem XPath-Ausdruck referenzieren möchten, müssen Sie ihrem Namen ein @ (at-Zeichen) voranstellen:

$XML1/salesdata/region/@name

Ansonsten können Sie Elemente und Attribute gleich behandeln, d.h. Sie können beide in Berechnungen verwenden, ihre Werte in Diagrammen darstellen und beide in einem MobileTogether Design Objekten der Benutzeroberfläche zuweisen.

Prädikate

Manchmal genügt es nicht, nur einen Pfad zu einem Element in Ihren Daten zu definieren, da Sie nur einige Daten, die bestimmten Kriterien entsprechen, auswählen möchten, um diese z.B. in einem Diagramm darzustellen oder dem Benutzer in einer Tabelle zu präsentieren.

Wenn Sie schon einmal mit relationalen Datenbanken gearbeitet haben, würde dies einer WHERE-Klausel in einer SQL-Anweisung entsprechen. Sie können damit die Daten aus Ihrer Datenbank auswählen, die einem bestimmten Kriterium entsprechen.

Das Äquivalent dazu in XPath nennt man "Prädikate". Mit Hilfe eines XPath-Prädikats können Sie Auswahlkriterien definieren, mit denen nur bestimmte Elemente, die diesen Kriterien entsprechen, ausgewählt werden. Prädikate werden innerhalb von [] (eckigen Klammern) in Form eines logischen Tests eingegeben. Beispiel:

$XML1/salesdata/region[@name=”East”]/Month

Diese Anweisung wird folgendermaßen interpretiert: Gehe im der Datenquelle $XML1 zum Element "salesdata", anschließend zu dessen Child-Element "region", wähle nur die Regionen aus, in denen der Attributname "East" ist und wähle anschließend das jeweilige Child-Element "Month" aus.

Operatoren

Am Anfang haben wir XPath als vollständige Ausdruckssprache bezeichnet. D.h. Sie können damit nicht einfach nur bestimmte Datenelemente auswählen, sondern Sie können damit alle normalen mathematischen Operationen an den Daten ausführen, um neue Werte zu berechnen. Wie bei Formeln in Excel können Sie mittels XPath-Ausdrücken in MobileTogether anhand Ihrer vorhandenen Daten neue Werte berechnen.

Angenommen, Sie möchten eine mobile Lösung zur Erstellung von Rechnungen erstellen und den Gesamtbetrag für einen Rechnungsposten in Ihrem mobilen Formular anzeigen:

$DB1/sales/invoice/item/quantity * $DB1/sales/invoice/item/price

Angenommen Ihre Datenstruktur enthält separate Elemente für "quantity" und "price" (das vom Benutzer bearbeitet werden kann), dann können Sie den Gesamtbetrag für diesen Posten einfach mit Hilfe der obigen Multiplikation unter Verwendung des * (Sternchens) berechnen.

In XPath sparen Sie sich noch dazu einem Menge Tipperei, indem Sie die Multiplikation in XPath an der richtigen Stelle im Pfad in Klammern setzen. Die folgende Kurzvariante ergibt dasselbe Ergebnis wie der Ausdruck oben:

$DB1/sales/invoice/item/(quantity * price)

Auf ähnliche Art können Sie auch + (plus) und - (minus) als mathematische Operatoren verwenden. Für die Division müssen Sie allerdings ein anderes Symbol verwenden. Da wir den Schrägstrich / bereits zum Trennen einzelner Elemente in einem Pfad verwenden, steht das Zeichen für die Division nicht zur Verfügung. Als Operator für eine Division in XPath wird stattdessen das Wort "div" für eine reelle Zahl und '"idiv" für eine Ganzzahldivision (d.h. wenn das Resultat eine Ganzzahl anstatt einer reellen Zahl sein soll) verwendet.

Außerdem empfiehlt es sich - und ist manchmal unbedingt notwendig - dass Sie Ihre Operatoren innerhalb von Leerzeichen setzen, damit diese nicht als Teil eines Element- oder Attributnamens interpretiert werden. Dies gilt v.a. für den Operator - (minus).

Sequenzen

Ein wichtiger Unterschied zwischen XPath und Verzeichnispfaden besteht darin, dass ein Verzeichnispfad normalerweise nur auf eine bestimmte Datei oder ein Verzeichnis verweist, während Sie mit einem XPath-Ausdruck mehr als einen Daten-Node (d.h. ein Element oder ein Attribut) referenzieren können. Tatsächlich ist das Resultat eines jeden XPath-Ausdrucks immer eine Sequenz von Nodes.

Am einfachsten wird das verständlich, wenn Sie sich vorstellen, dass die meisten Datenbanken Zeilen mit Daten ähnlicher Struktur enthalten, so wie die meisten XML-Dokumente eine Reihe von Elementen enthalten, die denselben Namen und eine ähnliche Struktur haben. XPath wurde im Hinblick auf die Arbeit mit solchen Datenbeständen entwickelt. Das Referenzieren einer ganzen Gruppe von Nodes auf einmal hat enorme Vorteile, wie wir in den nächsten Kapiteln sehen werden.

Gleichzeitig müssen manchmal Sequenzen in einem XPath-Ausdruck explizit definiert werden. Dazu werden die Werte in der folgenden Form aufgelistet:

(1, 2, 3, 4, 5)

Sequenzen sind geordnet, dadurch unterscheidet sich die obige Sequenz klar von der Sequenz (3, 5, 2, 4, 1). Sequenzen können Nodes aus Ihren Daten sowie konstante numerische Werte oder konstante String-Werte enthalten.

Eine Beispiel für eine String-Sequenz wäre die folgende:

("a", "b", "c", "d", "e")

Und nicht zuletzt können Sie geordnete Sequenzen aus numerischen Werten mit dem Bereichsoperator "to" definieren:

(1 to 5)

Dies würde der Sequenz (1, 2, 3, 4, 5) entsprechen. Wie Sie sehen, können Sie mit Hilfe dieses Operators schnell Sequenzen aus numerischen Werten erstellen, bei denen ein händisches Auflisten bei großen Zahlen viel zu mühsam würde.

Der for-Ausdruck

Wenn Sie bereits mit anderen Programmiersprachen gearbeitet haben, werden Sie die for-Schleife als in modernen Programmiersprachen häufig eingesetztes Werkzeug kennen. Sie bildet auch einen wichtigen Bestandteil der XPath-Sprache.

In der einfachsten Form können Sie mit einem for-Ausdruck mit Hilfe einer direkt im for-Ausdruck definierten temporären Schleifenvariablen über eine Sequenz von Werten oder Nodes iterieren. Mit dem Ausdruck

for $i in (1 to 10) return 2 * $i

erhalten Sie z.B. durch Iterieren über die Originalsequenz (1 to 10) mit der Variablen $i und anschließende Berechnung von 2 * $i für jeden Datenpunkt in der Sequenz die numerischen Sequenz (2, 4, 6, 8, 10, 12, 14, 16, 18, 20).

Jetzt, da wir wissen, dass das Ergebnis eines jeden XPath-Ausdrucks eine Sequenz von Nodes ist, können wir mit dem for-Ausdruck über diese Nodes iterieren und einige mathematische Operationen durchführen. Um z.B. über alle Posten in einer Rechnung zu iterieren und den entsprechenden Betrag dafür zu berechnen, könnten wir diesen Ausdruck verwenden:

for $x in $DB1/sales/invoice/item return $x/price * $x/quantity

In diesem Fall ist $x unsere Schleifenvariable, die über die einzelnen item-Elemente iteriert. Das Ergebnis dieses Ausdrucks ist eine Sequenz, die den Rechnungsbetrag für die einzelnen Posten enthält. Angenommen, wir haben in den Quelldaten für unsere Rechnung die folgenden zwei item-Elemente:

<item>
<quantity>5</quantity>
<price>12,50</price>
</item>
<item>
<quantity>3</quantity>
<price>27,85</price>
</item>

In diesem Fall erhalten wir mit dem vorherigen XPath-Ausdruck die Sequenz (62,5 83,55), also den jeweiligen Gesamtbetrag für die einzelnen Rechnungsposten.

Funktionen

Funktionen in XPath funktionieren genau gleich wie Funktionen in einer Excel-Formel oder in den meisten anderen Programmiersprachen: Sie rufen eine Funktion mit ihrem Namen auf und übergeben eine Gruppe von Funktionsparametern in Klammern (). Um z.B. die Sequenz (3, 9, 14) zu summieren, würde der XPath-Ausdruck folgendermaßen lauten:

sum( (3, 9, 14) )

Damit würden wir das Ergebnis 26 erhalten. Beachten Sie bitte, dass die äußere Klammer in diesem Fall Teil des Funktionsaufrufs der Funktion sum() ist, während die innere Klammer Teil der Sequenz ist, die wir als einen einzigen Parameter an die Funktion übergeben.

Auf ähnliche Weise können wir nun durch Addieren aller Rechnungsposten den Gesamtbetrag für das vorherige Beispiel berechnen:

sum( for $x in $DB1/sales/invoice/item
return $x/price * $x/quantity )

Dies kann sich z.B. bei der Erstellung interaktiver Formulare in einer mobilen Lösung, in der Sie Datenwerte für Gesamtbeträge anzeigen können, die sich bei Eingabe von Daten in das Formular dynamisch ändern, als sehr nützlich erweisen.

XPath enthält zahlreiche vordefinierte Funktionen für numerische Werte (z.B. round, abs, floor, usw.), String-Bearbeitungen (z.B. concat, lower-case, contains, replace), Zeiträume, Datum und Uhrzeit sowie Aggregationsoperation an Sequenzen (z.B. count, sum, avg, min, max). Mit dem XPath Builder in MobileTogether können Sie mühelos XPath-Ausdrücke unter Verwendung dieser Funktionen erstellen, da das Tool ein praktisches Verzeichnis aller verfügbaren Funktionen mit einer kurzen Beschreibung und Informationen zu den erforderlichen Parametern enthält. Damit Sie die geeignete Funktion schneller finden, werden die Funktionen in logischen Gruppen angezeigt.

Der if-Ausdruck

Oft muss in Programmiersprachen - und ebenso in Ausdruckssprachen - eine unterschiedliche Methode zur Berechnung eines bestimmten Ergebnisses gewählt werden, je nachdem, ob bestimmte Kriterien zutreffen oder nicht. Für diesen Zweck gibt es die if-Anweisung. Mit der if-Anweisung können Sie je nachdem, ob die definierten Testkriterien zutreffen oder nicht, unterschiedliche Ergebnisse definieren.

In XPath hat die if-Anweisung die folgende Form:

if ( test-expression ) then expression else expression

wobei test-expression ein logischer XPath-Ausdruck ist, der "true" oder "false" zurückgibt.

So können wir z.B. im MobileTogether mit Hilfe einer solchen Anweisung die Textfarbe einer Beschriftung oder eines Bearbeitungsfelds abhängig von dem in den Daten enthaltenen numerischen Wert machen. Angenommen, wir haben ein Element aus unserer Datenquelle, das mit einem Bearbeitungsfeld verknüpft ist. Wir können dieses Bearbeitungsfeld auswählen und zum Register "Eigenschaften" gehen, wo wir die Textfarbe auswählen können. Anstatt aber die Farbe über die Farbauswahl zu definieren, können wir auf das XPath-Symbol in der Symbolleiste klicken und die Textfarbe dieses Eingabefelds mit Hilfe eines XPath-Ausdrucks definieren:

if ( $MT_ControlValue >= 0 ) then "green" else "red"

Wir verwenden hier eine der vordefinierten MobileTogether-Variablen, um das aktuelle Steuerelement zu referenzieren und überprüfen, ob der Wert größer oder gleich Null ist.

Je nach Ergebnis wird das Ergebnis entweder "green" oder "red" und unsere Textfarbe ändert sich auf Basis der Eingabe des Benutzers dynamisch.

Es gibt viele weitere vordefinierte Variablen, die alle mit $MT_ beginnen, mit Hilfe derer Sie auf Basis der Display-Größe des Gerätes, des Betriebssystems, der Sprache und vieler anderer Faktoren Entscheidungen treffen können. All diese vordefinierten globalen Variablen stehen in MobileTogether Designer im Menü "Projekt" im Dialogfeld "Globale Variablen" zur Verfügung.

XQuery

Bisher haben wir aus historischen Gründen hauptsächlich über XPath gesprochen, da XPath die bekanntere XML-basierte Ausdruckssprache ist und bereits seit 15 Jahren verwendet wird. Zusätzlich zu XPath verwendet MobileTogether aber auch die mächtigere Sprache XQuery. XQuery ist eine Übermenge von XPath, d.h. jeder gültige XPath-Ausdruck ist auch ein gültiger XQuery-Ausdruck. In XQuery gibt es allerdings noch einige zusätzliche Konstrukte, mit denen Sie viel mehr Möglichkeiten haben und ganze XML-Dokumente on-the-fly bearbeiten oder erstellen können.

FLWOR-Ausdruck

Der wichtigste XQuery-Ausdruck wird auch als FLWOR-Ausdruck bezeichnet. FLWOR ist ein Akronym und steht für “For-Let-Where-Order-Return” und wird normalerweise wie das englische Wort "flower" ausgesprochen. Die Funktionalitäten ähneln denen der SQL-SELECT-Anweisung, die ähnliche Klauseln wie z.B. FROM, WHERE, ORDER BY, usw. hat. Mit Hilfe von FLWOR-Ausdrücken, einem Eckpfeiler von XQuery, können XML- und Datenbankdaten viel besser und effizienter als mit einfachen XPath-Ausdrücken abgefragt werden.

Den for-Teil des FLWOR-Ausdrucks haben wir bereits in unserer vorherigen Erläuterung von XPath behandelt, damit haben wir bereits den Einstieg geschafft. Ebenso haben wir im selben oben beschriebenen for-Ausdruck die Return-Klausel gesehen. Dadurch, dass Sie in XQuery mit Hilfe von Konstruktoren ganze XML-Strukturen völlig neu erstellen können, wird jedoch die Flexibilität der Return-Klausel enorm erweitert. Im Prinzip wird die Return-Klausel wie zuvor für jedes Datenelement in der Schleife ausgewertet. Doch anstatt in einer Sequenz nur einen Wert zu erzeugen, können Sie nun eine ganze XML-Substruktur erstellen, wie in einigen der Beispiele unten gezeigt wird.

Mit Hilfe der let-Klausel eines FLWOR-Ausdrucks können wir zusätzliche Variablen definieren, die wir später zum Erzeugen des Ergebnisses verwenden können. Dieses könnte aus derselben Datenquelle oder sogar aus einer anderen Datenquelle stammen, aber z.B. die Schleifenvariable verwenden, um bestimmte Elemente aus der anderen Quelle auszuwählen.

Angenommen, eine Datenquelle enthält Informationen über Abteilungen in einem Unternehmen und eine andere Datenquelle enthält Informationen über Angestellte: Dann könnte ein FLWOR-Ausdruck, der Angestellte aus einer bestimmten Gruppe von Abteilungen auswählt, folgendermaßen beginnen:

for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]

Mit Hilfe der where-Klausel können wir die Daten anhand bestimmter Kriterien filtern - ähnlich wie weiter oben mit den Prädikaten in reinen XPath-Ausdrücken. So können wir damit z.B. Abteilungen anhand der Anzahl ihrer Angestellten filtern:

for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
where count($e) >= 10

Schließlich können wir die Ergebnisse mit Hilfe der order by-Klausel nach den gewünschten Kriterien sortieren. Dies erweist sich v.a. beim Erstellen neuer XML-Ergebnisdokumente als nützlich.

Setzen wir nun also den gesamten FLWOR-Ausdruck unter Verwendung der vorher erwähnten Datenquellen zu Abteilungen und Angestellten zusammen. So könnten wir z.B. eine neue Datentabelle für eine mobile Lösung generieren, die aggregierte Informationen über die Anzahl der Angestellten und das Durchschnittsgehalt für jene Abteilungen mit mehr als 10 Angestellten enthält:

for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
where count($e) >= 10
order by avg($e/salary) descending
return
<big-dept>
{ $d,
<headcount>{count($e)}</headcount>,
<avgsal>{avg($e/salary)}</avgsal>
}
</big-dept>

In einem anderen Beispiel können wir die vorherigen Daten zu mobilen Rechnungen mit Rechnungsposten verwenden und dieses Beispiel nun erweitern, indem wir eine Schleife über mehrere nach einem bestimmten Datum erstellte Rechnungen bilden, um die Gesamtsumme zu berechnen und anschließend eine Tabelle mit absteigend nach Rechnungsbetrag geordneten Ergebnissen zu erstellen:

for $inv in $DB1/sales/invoice
let $total := sum (for $x in item return $x/price * $x/quantity)
where $inv/date >= "2014-01-01"
order by $total descending
return <invtotal>{ $total }</invtotal>

Wie Sie sehen, bieten XQuery-Ausdrücke viel mehr Möglichkeiten als XPath-Ausdrücke. Je mehr Flexibilität und Möglichkeiten, desto komplexer wird die Sache allerdings. Es kann daher eine Weile dauern, bis Sie XQuery komplett beherrschen.

Gleichzeitig helfen Ihnen die integrierten MobileTogether Funktionen zum Erstellen und Auswerten von XPath & XQuery sehr bei der Erstellung Ihrer Ausdrücke und beim Testen dieser Ausdrücke anhand Ihrer Daten. Zusammen mit dem leistungsstarken Simulator, mit dem Sie Ihre mobilen Apps direkt im MobileTogether Designer ausführen können, können Sie Ihre Datenauswahl mittels XPath und XQuery einfach testen und dadurch im Handumdrehen leistungsstarke mobile Apps entwickeln.

Zusammenfassung

In diesem Dokument haben wir Ihnen eine kurze Einführung in die wichtigsten Konzepte von XPath und XQuery gegeben, um Ihnen den Einstieg beim Arbeiten mit Daten in MobileTogether zu erleichtern. Wir haben die Grundlagen von XPath-Ausdrücken und einige der umfangreicheren XQuery-Funktionen kurz erläutert. Sie sollten jetzt in der Lage sein, komplexe Datenauswahlfunktionen in Ihrem mobilen Workflow und exakte Diagramme zu Ihren Daten zu erstellen und die Benutzeroberfläche Ihrer mobilen Lösungen je Bedarf anhand bestimmter Datenelemente zu konfigurieren.

Dieses Dokument bildet jedoch nur eine Ausgangsbasis und ist nicht als komplette Anleitung gedacht, in der alle Aspekte dieser Sprachen behandelt werden. Mehr erfahren Sie in unserem umfassenden kostenlosen XPath-Online-Kurs, der sich sowohl für Anfänger als auch Fortgeschrittene eignet.

MobileTogether unterstützt XPath 3.0 und XQuery 3.0 vollständig. Der Vorteil bei der Verwendung eines internationalen Standards wie XPath und XQuery ist, dass viele Entwickler bereits im Rahmen von XML; XSLT oder XML Schema mit XPath gearbeitet haben. Als großes Plus können sie dieses Wissen nun auch in MobileTogether anwenden. Ihre XPath 1.0 oder 2.0-Kenntnis auf den neuesten Stand von XPath 3.0 zu bringen, kostet nicht viel Mühe.

Außerdem handelt es sich bei XPath und XQuery um Standards, die vom W3C entwickelt wurden, und nicht um eine proprietäre, unternehmenseigene Sprache. Dadurch kann die Kenntnis dieser Standards oft auch in einem anderen Zusammenhang hilfreich sein.

Die komplette Spezifikation von XPath 3.0 und XQuery 3.0 finden Sie in den folgenden technischen Spezifikationen:

Dadurch, dass XPath und XQuery in MobileTogether verwendet werden, bedeutet dies auch, dass Sie in speziellen Fällen komplexere XPath- und XQuery-Ausdrücke auch zuerst in XMLSpy erstellen, entwickeln und debuggen können. XMLSpy enthält Funktionen zur Auswertung und zum Debuggen von XPath und XQuery-Ausdrücken sowie einen Profiler zur Leistungsoptimierung.

Mehr über XPath 3.0 und XQuery 3.0 finden Sie im Altova Online Training und in der Dokumentation. Außerdem haben wir eine XPath-Referenz mit einer Erläuterung aller XPath-Operatoren und -Funktionen sowie Beispielen zu deren Verwendung erstellt. Außerdem steht Ihnen für Fragen zu XPath und XQuery das MobileTogether Support-Forum unter https://support.mobiletogether.com/ zur Verfügung.