XPath-Funktionen

(Auszug aus "Python & XML" von Christopher A. Jones & Fred L. Drake, Jr.)

XPath bietet zahlreiche Funktionen zur Behandlung von Zahlen und Strings und ermöglicht es Ihnen, Transformationen zu vollenden und XML-Daten zu durchsuchen, ohne ständig die Brücke zu anderen APIs oder Technologien schlagen zu müssen, um einfache String- und arithmetische Operationen auszuführen. Die Addition, einfache Division, Multiplikation und String-Suche sind als eingebaute Funktionen in XPath verfügbar.

Arbeiten mit Zahlen

Es stehen Ihnen mehrere XPath-Funktionen zur Verfügung. Im Beispiel products.xsl wird mit einer Multiplikation ein 20-prozentiger Nachlaß auf Produkte gewährt. Wenn Sie eine Summe über die gesamte Produktliste benötigen, können Sie die Funktion sum benutzen und anschließend mit den gleichen Produktdaten weiterarbeiten:

<?xml version="1.0" encoding="UTF-8"?>
<products>
  <item name="Schale" price="19.95"/>
  <item name="Spaten" price="4.95"/>
  <item name="Kraftmixer" price="149.95"/>
  <item name="Kochhut" price="39.95"/>
</products>

Im folgenden Beispiel können Sie diesmal einen einzigen XPath-Ausdruck benutzen, um eine Gesamtsumme zu berechnen. Der Ausdruck sum(//@price) gibt die Summe der Werte aller price-Elemente im Produktdokument zurück. Gehen Sie nun zurück und modifizieren Sie das Stylesheet, das Sie erzeugt haben, um Rabatte auf die Produkte zu gewähren, aber diesmal fügen Sie ein Element xsl:value-of ein, um eine Gesamtsumme zu berechnen.

Beispiel: products-2.xsl

<?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="/">
    <html>
      <body>
        <table>
          <xsl:apply-templates/>
        </table>
        <p>Gesamtsumme: <xsl:value-of select="sum(//@price)"/></p>
      </body>
    </html>
  </xsl:template>  
  <xsl:template match="item">
    <tr><td><b>Artikel:</b> <xsl:value-of select="@name"/></td><td><b>Preis:</b> <xsl:value-of select="@price"/></td></tr>
  </xsl:template>  
</xsl:stylesheet>

Die folgende Abbildung zeigt das Ergebnis der Transformation (das HTML) in einem Browser.

Verwenden der XPath-Funktion sum( )

Abbildung: Verwenden der XPath-Funktion sum( )

Zusätzlich zu sum gibt es mehrere andere Funktionen für die Behandlung von Zahlen. Die Funktion floor gibt die größte Ganzzahl zurück, die nicht größer als ihr Argument ist. Mit anderen Worten: floor(3.4) gibt die Zahl 3 zurück. Die Funktion ceiling, das Gegenstück von floor, liefert die kleinste Ganzzahl zurück, die größer als das Argument ist, z. B. gibt ceiling(3.4) die Zahl 4 zurück. Die Funktion round tut genau das, was Sie von ihr erwarten: Ihre Dezimalzahl zur nächsten Ganzzahl zu runden. Das hießt, round(3.4) gibt den Wert 3 zurück, während round(3.8) eine 4 liefert.

Arbeiten mit Strings

Außer Funktionen für Zahlen unterstützt XPath auch Funktionen zur Bearbeitung von Text. Die meisten davon sind beim Testen von Bedingungen wertvoll. Zuvor haben Sie bereits Zeichendaten von Kindattributen mit einer solchen Syntax geprüft:

 ship[class="Intrepid"] 

Dieser Ausdruck liefert alle ship-Elemente mit einem class-Element darunter, das die Zeichendaten Intrepid enthält. Dies ist ein guter Ansatz für exakte Textvergleiche, aber manchmal möchte man eine feinere Kontrolle.

Die Funktion starts-with z. B. erwartet zwei Argumente. Das erste ist das, wonach Sie suchen: die Buchstaben, mit denen der String beginnen soll. Das zweite Argument ist der auszuwertende Knoten. Die Funktion gibt true oder false zurück. Um z. B. ein true oder false (in XSL) zu erhalten – bezüglich der Tatsache, ob ein ship-Element einen Registrierungscode hat, der mit NCC beginnt –, können Sie folgenden Ausdruck ausprobieren:

 <xsl:value-of select="starts-with('NCC', ./registry-code/text())"/> 

Dieser Ausdruck gibt bei jedem ship in der Datei ships.xml true zurück. Diese Art von Booleschen Rückgabewerten mag in XSLT die größten Vorteile haben, wo Sie dessen if-then-else-Anweisungen zur Bearbeitung von Bedingungen benutzen können. Eine Variation dieses Themas ist die Funktion contains, die dann true zurückgibt, wenn das zweite Argument das erste Argument enthält.

Wenn Sie wissen, daß Sie den gesuchten String haben, und ihn zerpflücken möchten, kommen Ihnen die Funktionen substring und string-length gelegen. Die Funktion substring erwartet bis zu drei Argumente. Das erste Argument ist der zu bearbeitende String, das zweite ist der Startindex im String, und das dritte ist der Endindex. Wenn das dritte Argument weggelassen wird, wird angenommen, es handelt sich um das Ende des Strings. Die Funktion string-length ist einfach und liefert die Gesamtlänge des Strings als Zahl.

Die Funktion translate nimmt einen String-Parameter und eine Liste von Zeichen, die ersetzt werden sollen, sowie eine Liste von entsprechenden Ersetzungszeichen. Jedes Zeichen im zweiten Argument wird ersetzt durch das entsprechende Zeichen an der gleichen Stelle im dritten Argument. Der Ausdruck translate("Wee Willy Winky", "eily", "oaps") liefert zum Beispiel den String Woo Wapps Wanks. Die Funktion concat gibt die Verkettung ihrer beiden Argumente zurück.

Arbeiten mit Knoten

Einige Funktionen in XPath sind für die Behandlung von Elementen und zum Traversieren von Elementen gedacht. Diese Funktionen liefern Informationen hinsichtlich der aktuellen XPath-Position und andere positionsbezogene Informationen, etwa das erste und das letzte übereinstimmende Element. Knotenfunktionen sind ziemlich einfach zu verstehen.

Die Funktion position gibt eine Zahl zurück, die der Kontextposition im Auswertungskontext des Ausdrucks entspricht. Um z. B. eine numerierte Liste für die Schiffe in ships.xml zu erstellen, könnten Sie die Funktion position wie im folgenden Stylesheet benutzen:

<?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="shiptypes">
    <html>
      <body>
        <xsl:apply-templates select="ship"/>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="ship">
    <p>
      <xsl:value-of select="position( )"/>.
      <xsl:value-of select="@name"/>
    </p>
  </xsl:template>
</xsl:stylesheet>

Dieser Code erzeugt folgende HTML-Ausgabe:

<html>
  <body>
    <p>1.
      USS Enterprise</p>
    <p>2.
      USS Voyager</p>
    <p>3.
      USS Enterprise</p>
    <p>4.
      USS Enterprise</p>
    <p>5.
      USS Sao Paulo</p>
  </body>
</html>

Die Funktion count gibt die Anzahl der Knoten in einer Knotenmenge zurück, auf die das Argument paßt. Das heißt, count(//@name) liefert die Anzahl von name-Attributen im Dokument zurück. Die Funktion last gibt die Kontextgröße (die Anzahl der Knoten) im aktuellen Ausdruck zurück.

Die Funktion id gibt einen Knoten mit einer bestimmten id zurück. Wenn Sie das Element <name id="a345">Chris Jones</name> erzeugen und dann in Ihrem Ausdruck id('a345') verwenden, erhalten Sie diesen Knoten. Die Funktionen localname und name geben jeweils den lokalen und qualifizierten Namen des Knotens in der aktuellen Knotenmenge zurück, der zuerst in der Reihenfolge des Dokuments vorkommt.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Python & XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2002 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Python & XML" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de