www.xml-xslt.de


Startseite

Das Buch

Auszeichnungssprachen

XML-Dokument

Struktur: dtd

Retrieval: XSLT
Grundbegriffe
Daten selektieren
Pfadangaben
Achsen-/Knotentest
Prädikate

9.3    Pfadangaben

9.3.1    Achsen und Knotentests

Mit Pfadangaben können die gewünschten Knoten im Knotenbaum gefunden werden. Sie orientieren sich am w3-Standard XPath.


    Grundlegende XPath-Elemente sind bereits durch die Nutzung und Nennung von Kindelementen in den vorgenannten XSLT-Dokumenten genannt worden. In den gezeigten Beispielen ist die Knotenauswahl in den Attributwerten der Attribute select und match sichtbar. Für die Auswahl der Knoten sind zwei Dinge entscheidend:

  1. Der Knotenbaum mit allen Knoten und Achsen
  2. Der Standort des Elements, in dessen select- oder match-Attribut ein Knotenaufruf mit XPath durchgeführt wird.

Knoten werden in diesen Attributwerten damit entweder relativ zum eigenen Standort (= relative Pfadangabe) oder als absolute Pfadangabe ab der Wurzel des Dokumentes (zum Unterschied zum Wurzelelements des Dokuments) ausgewählt. Die grundlegenden Auswahlmechanismen der sog. Lokalisierungspfade sind dabei:


 

XPath-Ausdruck

Kurzerklärung

.

Der aktuelle Knoten – relative Pfadangabe

Auswahl des eigenen Knotens

select=”.”

 

./autor

Der folgende Knoten – relative Pfadangabe

Vom eigenen Knoten aus gesehen das Kindelement autor

select=”./autor”

Diese Schreibweise ist vom Output gesehen identisch mit der folgenden Schreibweise:

select=”autor”

 

../

Der Vorfahrenknoten – relative Pfadangabe

/

Die Dokumentwurzel – absolute Pfadangabe

Das Element buch als Kind von buecher als Element direkt unter der Dokumentwurzel

select=”/buecher/buch”

 

//

Beliebiger Knotensprung im Dokument

Alle beschreibung-Knoten im Dokument:

select=”//beschreibung”

Alle beschreibung-Knoten im Dokument, die einen Vorfahren wort haben:

select=”//wort//beschreibung”

 

buch[autor]

Alle buch-Elemente, die ein Kindelement autor haben

@kategorie

Wählt das Attribut kategorie des aktuellen Knotens


Zur Verdeutlichung einige Beispiele, die auf folgendem Quelltext beruhen:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="books_work.xsl"?>
<buecher>
    <buch kategorie="referenzwerk">    
        <autor url="www.tidwell.com" geschlecht="m">Doug Tidwell</autor>
        <titel>XSLT. XML-Dokumente transformieren</titel>
        <preis waehrung="€">40</preis>
    </buch>
    <buch kategorie="belletristik">
        <autor url="www.dixen.com" geschlecht="w">Nicola Dixen</autor>
        <titel>Linvarna</titel>
        <preis waehrung="DKK">215,75</preis>
        <verweis>
            <buch kategorie="belletristik">
                <autor url="www.bodker.com" geschlecht="w">Cecile Bodker</autor>
                <titel>Jana</titel>
                <preis waehrung="NOK">300</preis>
            </buch>
        </verweis>
    </buch>
    <buch kategorie="belletristik">
        <autor url="www.melville.com" geschlecht="m">Herman Melville</autor>
        <titel>Moby Dick</titel>
        <preis waehrung="$">8.99</preis>
    </buch>
    <buch kategorie="belletristik">
        <autor url="www.tolkien.com" geschlecht="m">J. R. R. Tolkien</autor>
        <titel>The Lord of the Rings</titel>
        <preis waehrung="$">22.99</preis>
    </buch>
    <quelle>
        <vorname>Svend</vorname>
        <nachname>Seedorf</nachname>
        <mail>svend@seedorf.de</mail>
    </quelle>
</buecher>


Die folgende Vorlage liest für das Element autor auch den Wert des Attributs kategorie aus. Da kategorie jedoch ein Attribut des Elternelements von autor ist, ist eine Pfadangabe erforderlich:

<xsl:template match="autor">
    <a href="http://{@url}"><xsl:value-of select="."/></a>
    (<xsl:value-of select="../@kategorie"/>)
</xsl:template>


Im folgenden Fall sollen alle Autoren aufgelistet werden, auch die, die nur als Verweis geführt werden. Dazu wird für das Element autor eine Pfadangabe mit beliebiger Lokalisierung im Knotenbaum benutzt. Diese Angabe ist dabei bereits im Aufruf der Template für das Element autor enthalten.

<?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>
        <head>
            <title>Autorenverzeichnis</title>
        </head>
        <body>
            <xsl:apply-templates select="//autor"/>
        </body>
    </html>
</xsl:template>
<xsl:template match="autor">
    <a href="http://{@url}"><xsl:value-of select="."/></a>    
    (<xsl:value-of select="../@kategorie"/>)
    <br/>
</xsl:template>
</xsl:stylesheet>


In der Ausgabe sind jetzt fünf Autoren sichtbar:

Im genannten Beispiel soll jetzt hinter jeder Autorangabe auch die Quelle dieser Angabe genannt werden. Die Quelle quelle ist ein Element, das von der Vorlage für autor nicht relativ adressiert werden kann, da das Element autor an verschiedenen Hierarchietiefen vorkommen kann. Es bleibt nur die Adressierung dieses Elements im Knotenbaum durch absolute Pfadangaben:

<?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>
        <head>
            <title>Autorenverzeichnis</title>
        </head>
        <body>
            <xsl:apply-templates select="//autor"/>
        </body>
    </html>
</xsl:template>
<xsl:template match="autor">
    <a href="http://{@url}"><xsl:value-of select="."/></a>    
    (<xsl:value-of select="../@kategorie"/>)
    <br/>
    <font size="-2">
        [Quelle: <xsl:value-of select="/buecher/quelle/nachname"/>,
        <xsl:value-of select="/buecher/quelle/vorname"/>]
    </font>
    <br/><br/>
</xsl:template>
</xsl:stylesheet>



In der Ausgabe ergibt dieses Stylesheet:

Wildcards
Neben diesen Lokalisierungspfaden stehen auch Wildcards (= Jokerzeichen) zur Verfügung, mit denen Gruppen von Knoten angesprochen werden können. Wildcards ersetzen dabei Knotennamen.

XPath-Ausdruck

Kurzerklärung

*

Alle Kindelemente (keine anderen Knotentypen !)

Auswahl aller Kindelemente aller buch-Elemente, die ihrerseits ein beliebiges Elternelement haben.

match=”/*/buch/*”

Eine Verbindung  mit Namensräumen ist möglich. - Auswahl aller Elementknoten im aktuellen Kontext mit dem Namensraum lexiko:

select=”lexiko:*”

 

@*

Alle Attributknoten im aktuellen Kontext

 

node()

 

Alle Knoten im aktuellen Kontext (Elemente, Attribute, Kommentare, Text, Verarbeitungsanweisungen)

select=”node()”

 

 

Mehrere Achsangaben und / oder Knotentests können verbunden werden. Zur Verfügung steht eine ODER-Bedingung als |. Eine ODER-Verbindung testet mehrere Pfadangaben und gibt die Knoten aus, auf die eine oder mehrere Pfadangaben passen.

<?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>
        <head>
            <title>Autorenverzeichnis</title>
        </head>
        <body>
            <xsl:apply-templates select="//autor | //titel"/>
        </body>
    </html>
</xsl:template>
<xsl:template match="autor | titel">
    <xsl:value-of select="."/>
    <br/>
</xsl:template>
</xsl:stylesheet>


In der Ausgabe ergibt sich durch die Auswahl von autor und titel folgendes Bild:


 
 
 
 
 
 
 
 
 
 

Das XML/XSLT-Seminar
(zur Zeit als Buch nicht lieferbar)