www.xml-xslt.de


Startseite

Das Buch

Auszeichnungssprachen

XML-Dokument

Struktur: dtd

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

9.3.2    Pfadangaben: Prädikate

Prädikate sind Bedingungen, die für die Auffindung eines Knotens im Knotenbaum gemeinsam mit Pfaden genutzt werden können. Sie bestehen aus XPath-Ausdrücken und werden mit einem Operator in der Syntax [……….] eingeschlossen. Mit Prädikaten lassen sich weitere Tests bezogen auf Knoten durchführen:

  • Attributwert auf Übereinstimmung mit einer Zeichenkette testen.
  • Elementinhalt auf Übereinstimmung mit einer Zeichenkette testen.
  • Test, ob Element ein (bestimmtes) Kindelement oder Attribut enthält.
  • Test von Positionen im Knotenbaum.


In den Beispielen zu Prädikaten wird folgendes Quelldokument zu Grunde gelegt:

<?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 Übereinstimmung von Attributwerten mit einer Zeichenkette zeigt das folgende Beispiel, indem nur Autoren angezeigt werden sollen, bei denen der Attributwert des übergordneten Elements für das Attribut kategorie den Wert belletristik enthält (=Autoren von Belletristik).

<?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>
        <xsl:apply-templates/>
    </html>
</xsl:template>
<xsl:template match="buecher">
    <body>
        <h2>Das Autorenverzeichnis der Website</h2>
            <xsl:apply-templates  select="buch"/>
    </body>
</xsl:template>
<xsl:template match="buch">
    <p>
    <xsl:apply-templates select="autor[../@kategorie='belletristik']"/>
     </p>
</xsl:template>
<xsl:template match="autor">
    <a href="http://{@url}"><xsl:value-of select="."/></a>
    (<xsl:value-of select="../@kategorie"/>)
</xsl:template>
</xsl:stylesheet>



Als Ausgabe ergibt sich im Browser:

Im folgenden Beispiel wird der Inhalt eines Elements (genauer gesagt sein Textknoten) mit einem Wert verglichen. Nur wenn der Autor Herman Melville ist, wird sein Name ausgegeben.

<?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>
        <xsl:apply-templates/>
    </html>
</xsl:template>
<xsl:template match="buecher">
    <body>
        <h2>Das Autorenverzeichnis der Website</h2>
            <xsl:apply-templates  select="buch"/>
    </body>
</xsl:template>
<xsl:template match="buch">
    <p>
    <xsl:apply-templates select="autor[text()='Herman Melville']"/>
     </p>
</xsl:template>
<xsl:template match="autor">
    <a href="http://{@url}"><xsl:value-of select="."/></a>
    (<xsl:value-of select="../@kategorie"/>)
</xsl:template>
</xsl:stylesheet>


Die Konstruktion <xsl:apply-templates select="autor[text()='Herman Melville']"/> enthält mit dem sog. Knotentest text() einen Verweis auf den Inhalt des Textknotens des aktuellen Knotens – damit also den Inhalt des Elements autor.

Im nächsten Beispiel sollen nur Bücher angezeigt werden, die der Katagorie Belletristik zugeordnet sind und die einen Verweis 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>
        <xsl:apply-templates/>
    </html>
</xsl:template>
<xsl:template match="buecher">
    <body>
        <h2>Das Autorenverzeichnis der Website</h2>
            <xsl:apply-templates  select="buch[verweis]"/>
    </body>
</xsl:template>
<xsl:template match="buch">
    <p>
    <xsl:apply-templates select="autor[../@kategorie='belletristik']"/>
     </p>
</xsl:template>
<xsl:template match="autor">
    <a href="http://{@url}"><xsl:value-of select="."/></a>    
    (<xsl:value-of select="../@kategorie"/>)
</xsl:template>
</xsl:stylesheet>



Die Ausgabe dieses XSLT-Dokuments ist dabei:

Aussagen in Prädikaten können verneint werden. Dies geschieht durch die Funktion not() (mehr zu Funktionen später). Die Aussage buch[not(verweis)] besagt dabei, dass das Element keine Kindelemente mit dem Namen verweis enthalten darf.


    Im folgenden Beispiel werden damit alle Autoren angezeigt, die keine Verweisinformation enthalten und Belletristik schreiben:

<?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>
        <xsl:apply-templates/>
    </html>
</xsl:template>
<xsl:template match="buecher">
    <body>
        <h2>Das Autorenverzeichnis der Website</h2>
            <xsl:apply-templates  select="buch[not(verweis)]"/>
    </body>
</xsl:template>
<xsl:template match="buch">
    <p>
    <xsl:apply-templates select="autor[../@kategorie='belletristik']"/>
     </p>
</xsl:template>
<xsl:template match="autor">
    <a href="http://{@url}"><xsl:value-of select="."/></a>    
    (<xsl:value-of select="../@kategorie"/>)
</xsl:template>
</xsl:stylesheet>



Es ergibt sich in der Ausgabe:

In Prädikaten kann auch die Position innerhalb einer Knotenmenge bestimmt werden. Zu diesem Zweck steht die Funktion position() = zur Verfügung. Die Funktion last() besagt dabei, dass es sich um den letzten Knoten in einer Knotenmenge handelt. Der Ausdruck [position()=last()] bedeutet damit, dass es sich um den letzten Knoten in einer Knotenmenge handelt.


    So gibt das folgende Beispiel aus allen buch-Elementen nur das letzte Element aus. Dabei wird dieses Prädikat mit einem bereits bestehenden verbunden, in dem die beiden Prädikate hintereinander geschrieben werden. Bei der Bearbeitung durch die Software wird zunächst eine Menge von Konten gebildet, die dem ersten Prädikat entsprechen. Dann werden aus dieser Menge die Knoten bestimmt, die auch dem zweiten Prädikat entsprechen.  Dies kommt einer logischen UND-Verbindung gleich, d.h. beide Prädikate müssen erfüllt sein, damit die Resultat-Knotenmenge ausgewählt wird:
Als Quelltext wird angesetzt:

<?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>


Das genannte Stylesheet ist dabei:

<?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>
        <xsl:apply-templates/>
    </html>
</xsl:template>
<xsl:template match="buecher">
    <body>
        <h2>Das Autorenverzeichnis der Website</h2>
            <xsl:apply-templates  select="buch[not(verweis)][position()=last()]"/>
    </body>
</xsl:template>
<xsl:template match="buch">
    <p>
    <xsl:apply-templates select="autor[../@kategorie='belletristik']"/>
     </p>
</xsl:template>
<xsl:template match="autor">
    <a href="http://{@url}"><xsl:value-of select="."/></a>
    (<xsl:value-of select="../@kategorie"/>)
</xsl:template>
</xsl:stylesheet>


Tansformiert mit SAXON ergibt sich daraus folgende HTML-Quelldatei:

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
      <title>Autorenverzeichnis</title>
   </head>
   <body>
      <h2>Das Autorenverzeichnis der Website</h2>
      <p><a href="http://www.tolkien.com">J. R. R. Tolkien</a>(belletristik)       
      </p>
   </body>
</html>


Die vorletzte Position (damit der vorletzte Autor, der keine Verweisinformationen hat, und der aus der Kategorie Belletristik stammt) ergibt sich dann aus folgendem Prädikat, in dem die letzte Position minus einer Position (=vorletzte Position) der Knotenmenge gefunden wird:

            <xsl:apply-templates  select="buch[not(verweis)][position()=last()-1]"/>

Die Position lässt sich auch durch feste Zahlen bestimmen. So findet das folgende Beispiel den dritten Knoten der gewünschten Knotenmenge

            <xsl:apply-templates  select="buch[not(verweis)][position()=3]"/>

In diesen Prädikaten können auch boolsche Werte benutzt werden (einige sind bereits eingeführt durch die og. Beispiele):

    !=            ist ungleich
    <            kleiner als (geschrieben in XML: &lt;);
    <=        kleiner gleich (Schreibweise wie oben)
    >             größer als (geschrieben in XML: &gt;)
    >=        größer gleich (Schreibweise wie oben)
    =            ist gleich

Damit können durch das folgende Prädikat alle Knoten ausgewählt werden, in die aus den die ersten beiden Positionen der Knotenmenge einnehmen:

            <xsl:apply-templates  select="buch[not(verweis)][position()&lt;=2]"/>

In das og. Stylesheet eingefügt ergibt sich folgendes Stylesheet:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet   version="1.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="ISO-8859-1"/>
<xsl:template match="/">
    <html>
        <head>
            <title>Autorenverzeichnis</title>
        </head>
        <xsl:apply-templates/>
    </html>
</xsl:template>
<xsl:template match="buecher">
    <body>
        <h2>Das Autorenverzeichnis der Website</h2>
            <xsl:apply-templates  select="buch[not(verweis)][position()&lt;=2]"/>
    </body>
</xsl:template>
<xsl:template match="buch">
    <p>
    <xsl:apply-templates select="autor[../@kategorie='belletristik']"/>
     </p>
</xsl:template>
<xsl:template match="autor">
    <a href="http://{@url}"><xsl:value-of select="."/></a>
    (<xsl:value-of select="../@kategorie"/>)
</xsl:template>
</xsl:stylesheet>


In der Bildschirmausgabe ergibt dieses Stylesheet folgendes Bild:

Der von SAXON produzierte Quellkode in HTML ist dabei:

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
   
      <title>Autorenverzeichnis</title>
   </head>
   <body>
      <h2>Das Autorenverzeichnis der Website</h2>
      <p></p>
      <p><a href="http://www.melville.com">Herman Melville</a>(belletristik)
         
      </p>
   </body>
</html>


Die Ausgabe nur eines Autors ist korrekt, denn das Prädikat buch[not(verweis)][position()&lt;=2 bedeutet, dass die Vorlage für alle buch-Elemente aufgerufen wird, die kein verweis-Element enthalten und die maximal das zweite buch-Element sind (nicht etwa das zweite buch-Element, das kein verweis-Element enthält)! Zu beachten ist bei diesem Beispiel, dass vor Anwendung des Prädikats in der Elternvorlage bereits eine Einschränkung auf buch-Elemente mit dem Attrbutwert belletristik erstellt wurde. Daher ist Melville der Autor des dritten Buchs in der XML-Quelldatei, des zweiten Buchs der Belletristik und des einzigen Buchs der ersten beiden aus der Belletristik ohne verweis-Kindelement.


    Es folgt hier eine Zusammenfassung wichtiger Aspekte für die Konstruktion von Prädikaten.

 

Prädikat

Kurzerklärung

 

autor[@kategorie]

 

autor-Elemente, die ein kategorie-Attribut haben

 

autor[kategorie=belletristik]

 

autor-Elemente, die ein kategorie-Attribut mit dem Wert belletristik haben

 

buch[verweis]

 

buch-Elemente, die ein verweise-Element als Kind haben

 

not()

 

not() ist eine Funktion; sie dient zur Verneinung von Aussagen in Prädikaten.

 

position()

 

Position des Elements in der Knotenmenge

 

last()

 

Das letzte Element in der Knotenmenge

Boolsche Operatoren

!=        

<=

>=

=

 

ist ungleich

kleiner als (geschrieben in XML: &lt;);

kleiner gleich (Schreibweise wie oben)

größer als (geschrieben in XML: &gt;)

größer gleich (Schreibweise wie oben)

ist gleich


 
 
 
 
 
 
 
 
 
 

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