XPath

Werbung
Verarbeiten von
XML-Daten
Peter Langmann
XSLT
Parsing
Eingabetext
• Parsing nennt man den Prozess der
Prüfung eines Eingabetextes
hinsichtlich seiner
Wohlgeformtheit und Gültigkeit in
Bezug auf ein Regelsystem.
• Dabei wird der Text in "Tokens"
zerlegt (lat. Pars) und in der Regel
in einen Syntaxbaum überführt,
welcher die Hierarchie der
Elemente ausdrückt.
19.10.2006
Lexikalischer Scanner
Tokens / "Wörter"
Parser
Parse-Baum
Weitere
Anwendung
2
Parser und XSLT-Prozessor
Programme, die versuchen, den Inhalt von XML-Dokumenten zu „verstehen“,
benutzen dazu Parser. Diese prüfen das Dokument auf Wohlgeformtheit und
Gültigkeit gemäß den Regeln in der DTD oder im XML-Schema (Validierung).
XSLT-Prozessoren transformieren die geparsten Information des XML-Files und
geben die aufbereiteten Daten („result tree“) an die aufrufende Anwendung
weiter.
The software responsible for transforming source trees
into result trees using an XSLT stylesheet is referred to
as the processor. This is sometimes expanded to XSLT
processor to avoid any confusion with other processors,
for example an XML processor. W3C
xml
dtd
3
0
19.10.2006
Parser
Validierung
XSLTProzessor
Anwendung
zb. Browser
3
Wohlgeformtheit / Gültigkeit
Wohlgeformt (well formed) ist ein Dokument, wenn es den allgemeinen Regeln von
XML entspricht. Es muss keine DTD (kein Schema) vorliegen, um die
Wohlgeformtheit zu prüfen. Ist ein Dokument nicht wohlgeformt, wird es vom
Parser sofort zurückgewiesen.
Gültig (valid) ist ein Dokument, wenn es wohlgeformt ist und den Regeln der DTD /
des Schemas entspricht.
Parser, die auf Gültigkeit überprüfen, nennt man „validierende Parser“.
Parser können am Client laufen (z.B. integriert in Webbrowser) oder am Server (z.B.
XSLT-Parser).
19.10.2006
4
Darstellungsmöglichkeiten von
XML-Daten in Webbrowsern
A. Darstellung eines XML-Files als Text im Browser
B. Auslieferung eines XML-Files und eines CSS-Files: Parsing und
grafische Darstellung erfolgt im Browser.
3
XML
Browser
CSS
0
0
Parser
DTD
Transforma
tionen
Grafische
Ausgabe
XSLT
Liefert Document Object Model
(optional)
CSS
Client
XSLT
Server
19.10.2006
5
Schematische Darstellung von
Transformationen am Server
C. Transformation(en) am Server (Serialisierung).
Auslieferung in verschiedensten Formaten.
Serialisierungsprozess
3
0
XML
Parser
Transforma
tionen
XML
Datenbank
HTML
Browser
Rendering
DTD
(optional)
XSLT
Liefert
Document
Object Model
Server
19.10.2006
CSS
PDF
Browser
PlugIn
Client
6
XSLT
„Extensible Stylesheet Language Transformations"
XSLT = "XSLT ist eine funktionale Programmiersprache. Ihr
Zweck ist die Transformation eines XML-Dokumentes in ein
anderes Textdokument." Dieses kann verschiedene Formate
haben, z.B. Text, HTML oder XML sein.
A transformation expressed in XSLT describes rules for transforming
zero or more source trees into one or more result trees. The
transformation is achieved by a set of template rules. (W3C)
Source
Tree
XSLTProzessor
XSLT – „rules for transforming”
XLST
Result
Tree
XSLT: Versionen
XLST 1.0 (1999) ursprünglich von James Clark entwickelt.XSL
URL: http://www.w3.org/TR/xslt
XSLT 2.0 (2007) Für die derzeitige Weiterentwicklung ist Michael Kay
verantwortlich.
URL: http://www.w3.org/TR/xslt20/
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
XSLT
XSLT: „Transformation“
XML-Dokumente werden als logischer Baum betrachtet: Die QuellBäume („source tree“) der zu transformierenden Dokumente und durch
die Transformation die entstehenden Ziel-Bäume („result tree“) der zu
erzeugenden Dokumente.
Eine Transformation (ausgedrückt in einem „stylesheet“) besteht aus
einer Reihe von einzelnen Transformationsregeln, die Templates
(deutsch "Schablonen") genannt werden. Ein Template besitzt ein auf
XPath basierendes Pattern (deutsch "Muster"), das beschreibt, für
welche Knoten es gilt, und einen Inhalt, der bestimmt, wie das Template
seinen Teil des Zielbaums erzeugt.
XSLT
XSLT: „Transformation“
XSLT
XSLT Voraussetzungen, trivial
XSLT-Prozessor: wir verwenden dazu die Prozessoren, der in Oxygen
installiert sind.
XML-Datei, die bearbeitet werden soll (*.xml), wohlgeformt, valide.
XSLT-Stylesheet, das die Transformationsanweisungen enthält. (*.xsl)
Ein Stylesheet mit Formatierungsklassen für unsere wichtigsten
Elemente und Standard-Text (*.css) [optional]
Eine DTD, optional
+ CSS
HTML
XML
Source Tree
XSLTProzessor
Result Tree
DTD
XML
TEXT
XSLT - Anweisungen
XSLT
Grundlegender Aufbau eines Stylesheets
Ein Stylesheet ist selbst ein gültiges XML-Dokument. Es besitzt folgenden
Grundaufbau:
<?xml version = "1.0" ?>
<xsl:stylesheet version = "1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- TEMPLATES, Verarbeitungsanweisungen -->
</xsl:stylesheet>
Die Tags in Stylesheets werden mit Namensraum-Angaben geschrieben.
Dieser wurde im Wurzelelement deklariert.
<xsl:template match = "/">
<xsl:apply-templates />
</xsl:template>
XLST
Über Ausgabe-Möglichkeiten
<xsl:output method = "html"
doctype-public -//W3C//DTD XHTML
1.0 Transitional//EN" />
(X)HTML
TEXT
xsl:output method = "text" />
VRML-Code
Programmcode
<xsl:output method = "xml"
indent = "yes" />
XML
SVG
PDF
XSLT
Bausteine des Stylesheets
Es gibt 37 XSLT-Elemente, davon 2 Hauptelemente, 12 Elemente der
obersten Ebene sowie 23 Anweisungselemente. Bestimmte
Elemente verwenden als Attribut Xpath-Ausdrücke.
Hauptelement
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
Element oberste
Ebene
<xsl:output method="html"/>
<xsl:template match="gruss">
<h1>
<xsl:value-of select="."/>
Xpath-Ausdruck
</h1>
</xsl:template>
Text, der in den
Ausgabestrom
geschrieben wird
Anweisungselement
XSLT
XSLT-Beispiel
XSLT-Stylesheet:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output doctype-public="-//W3C//DTD HTML 4.01//EN"
method="html" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<head></head>
<body>
<xsl:apply-templates select=„/personenliste/person" />
</body>
</html>
</xsl:template>
<xsl:template match=„person">
<h1>
<xsl:value-of select="." />
</h1>
</xsl:template>
</xsl:stylesheet>
XSLT
Analyse des Beispiels (1)
1. Das XSLT-Stylesheet wird geparst und in eine Baumstruktur
überführt.
2. Das Gleiche passiert mit dem XML-Dokument.
3. Der Prozessor startet an der Wurzel des XML-Dokuments. Dieser
ist nicht das oberste Element, sondern die "Wurzel des
Dokuments„ („root node“) (inkl. aller
Verarbeitungsanweisungen etc.). Der Wurzelknoten ist der
Startkontext.
WURZEL des Dokuments
Verarbeitungsanweisungen,
wie <?xml-stylesheet .../>
Kommentare <!-- -->
Startkontext
Wurzel-Element
<personenliste.../>
Weitere Elemente
XSLT
Analyse des Beispiels (2)
4. Prozessor: Muss ich irgendwelche Knoten verarbeiten? Ja, es
gibt weitere Knoten im Dokument. Und:
Es gibt ein "Template" (Vorlage, Schablone).
<xsl:template match = "/"> Kontext = /
5. Was soll ich tun?
<xsl:apply-templates select = "/lv-group/p" />
"Wähle die Kind-Knoten „p" und wende vorhandene Templates
auf sie an." Kontext /lv-group/p
WURZEL des Dokuments
Kontext = /
Andere Knoten
auf der ersten
Ebene ...
Wurzel-Element
<personenliste>
XSLT
Analyse des Beispiels (3)
6. Gibts ein spezielles Template für „person"?
Ja, und zwar:
<xsl:template match = „p">
7. Was muss ich jetzt tun?
Schreibe in den Ausgabestrom:
==> <h1>
Dann nimm den aktuellen Knoten
(und ggf. seine Kinderknoten) und schreibe deren "Inhalt":
==> <xsl:value-of select = "."/>
Schreibe in den Ausgabestrom:
==> </h1>
8. Gibt es weitere Knoten personenliste/person,
würde jetzt der person[2] dran kommen.
Dann kehrt der Prozessor zum aufrufenden Template zurück.
XSLT
XPath
Die XML Path Language (XPath) ist eine vom W3Konsortium entwickelte Anfragesprache, um Teile
eines XML-Dokumentes zu adressieren.
Version 1.0: http://www.w3.org/TR/xpath
Version 2.0: http://www.w3.org/TR/xpath20/
XPath
Xpath 1.0: Definition nach W3C
The primary purpose of XPath is to address parts of an XML document.
In support of this primary purpose, it also provides basic facilities for
manipulation of strings, numbers and booleans.
XPath uses a compact, non-XML syntax to facilitate use of XPath
within URIs and XML attribute values. XPath operates on the abstract,
logical structure of an XML document, rather than its surface syntax.
XPath gets its name from its use of a path notation as in URLs for
navigating through the hierarchical structure of an XML document.
XPath models an XML document as a tree of nodes. There are different
types of nodes, including element nodes, attribute nodes and text
nodes. XPath defines a way to compute a string-value for each type of
node.
XPath
XPath: Definition
XPath ist eine Nicht-XML-Sprache, die dazu dient, bestimmte Teile eines
XML-Dokuments zu identifizieren.
XPath sieht das Dokument (*.xml) als einen Baum von Knoten an. Für
jedes Dokument gibt es genau einen einen Wurzelknoten und
Wurzelelement.
• "/lv-group/p lokalisiert die Personen-Knoten
• / den Wurzelknoten selbst. Der Name des Wurzelements ist lv-group.
XSLT benötigt XPath-Ausdrücke in bestimmten Attributen, um Knoten
oder andere Teile des Dokuments auszuwählen, die verarbeitet werden
sollen.
<xsl:apply-templates select = "/lv-group/p"/>
XPath
XPath: Wurzelknoten – „root node“ (1)
XPath kennt 7 Arten von Knoten im XML-Dokument:
1. Wurzelknoten („root node“): Der Knoten, der das gesamte XMLDokument enthält. Adressierung mit /. Es enthält nicht nur das
„Wurzelelement“ des Dokuments, sondern auch alle anderen
Anweisungen davor und dahinter.
The root node is the root of the tree. A root node does not occur
except as the root of the tree.
The element node for the document element is a child of the root
node.
The root node also has as children processing instruction and
comment nodes for processing instructions and comments that
occur in the prolog and after the end of the document element.
XPath
XPath: Wurzelknoten – „root node“ (2)
Wurzelknoten („root node“) – Grafische Darstellung
WURZEL des Dokuments
Verarbeitungsanweisungen,
wie <?xml-stylesheet .../>
Kommentare <!-- -->
Startkontext
Wurzel-Element
<lv-group .../>
Weitere Elemente
XPath
XPath: Wurzelknoten – „root node“ (3)
Wurzelknoten („root node“) – Grafische Darstellung im „Baumeditor“
von Oxygen.
XPath
XPath: Elementknoten: Wurzelelement
2. Elementknoten: Enthält das adressierte Element und seine Kinder
(Element-, Text-, Kommentar-, Verarbeitungsanweisungsknoten)
Eine besondere Stellung nimmt das Element ein, welches das
Wurzelelement bildet („element node for the document element”).
Dieses Element darf ebenfalls nur einmal im Dokument vorkommen.
Es enthält alle untergeordneten Knoten des Dokuments.
XPath
XPath: Elementknoten: Beispiele
Hier Beispiele für Knotenmengen, die sich aus der Selektion eines
Elements ergeben.
XPath
XPath: Attributknoten
3. Attributknoten: Die Elementknoten, zu denen die Attribute gehören,
sind deren Elternknoten. Jedoch sind Attributknoten sind keine
Kinder ihres Elternknoten! Nach Attributen müssen Sie speziell fragen.
XPath
XPath: Textknoten
4. Textknoten: enthalten den Text aus einem Element. Entity- und
Zeichenreferenzen sowie CDATA-Abschnitte werden aufgelöst.
XLST
XPath: Weitere Knoten
5. Kommentarknoten: Text der Kommentare
6. Verarbeitungsknoten (PI-Knoten)
7. Namensraum-Knoten
XLST
XPath: Kontextknoten
Kontextknoten ist die Bezeichnung
für den gerade gewählten,
"aktuellen" Knoten. XpathAusdrücke werden von diesem
Punkt aus berechnet.
Kontextknoten beinhalten noch
weitere Informationen (Position,
Größe etc.)
XLST
XPath: Lokalisierungspfade
Ein Lokalisierungspfad bezeichnet eine Menge von Knoten in einem
gegebenen Dokument.
<xsl:template match = "/" />
wählt den Wurzelknoten (und seine Kinder!) aus.
<xsl:template match = „p" />
wählt den Elementknoten <p> (und seine Kinder) relativ zum
Kontextknoten aus. <p> muss ein Kindknoten zum Kontextknoten sein,
in dem sich der XSLT-Prozess gerade befindet.
Wieviele Knoten der XML-Datei werden damit ausgewählt?
<xsl:value-of select = "." />
wählt den gerade aktivierten Kontextknoten (und seine Kinder).
Bitte beachten Sie, dass XPath-Ausdrücke immer Knotenmengen
zurückgeben! Und dass ein Knoten mehr ist als nur sein Text, aber noch
keine Attributwerte beinhaltet.
XPath
XPath: Lokalisierungspfade: relativ
Ein relativer XPath-Adruck geht in der Adressierung immer vom
aktuellen Kontextknoten aus. Beispiele:
<xsl:template match = „p" />
setzt voraus, dass p ein Kind des Kontextknotens (z.B. lvgroup) ist.
<xsl:value-of select = "." />
wählt den gerade aktivierten Kontextknoten (und seine Kinder).
<xsl:template match = „lv-group/p" />
Damit diese Adressierung keine leere Knotenmenge zurückgibt,
muss der Kontextknoten das Wurzelelement („root node“) sein.
<xsl:value-of select = ".." />
wählt den Elternknoten des Kontextknoten. Ist der Kontextknoten
ident so wird p gewählt.
XPath
XPath: Lokalisierungspfade: absolut
Ein absoluter XPath-Ausdruck beginnt immer an der
Dokumentwurzel, d.h. mit einem /. Der Kontextkonten wird nicht
berücksichtigt.
<xsl:template match = "/" />
wählt den Wurzelknoten des Dokuments.
<xsl:template match = "/lv-grou/p/ident" />
adressiert das Element ident absolut.
XPath
XPath: Lokalisierungsschritte für Attribute
Auch Attribute sind ein Teil von XPath. Allerdings sind sie keine
Kinder eines Elementknotens und werden daher auch nicht
automatisch selektiert. Sie müssen vielmehr die Attribute explizit
ansprechen.
<xsl:value-of select = "@sex" />
wählt das Attribut "sex" des aktuellen Kontextknotens und gibt
dessen Wert aus.
<xsl: value-of select = "/lv-group/p/@sex" />
adressiert das Attribut absolut.
XPath
XPath: Nur den Text eines Knotens ausgeben
Wie Sie wissen, werden bei der Selektion eines Elementknotens alle
untergeordneten Kinderknoten (auch jene, die keine
Elementknoten, sondern etwa auch Kommentarknoten etc. sind)
mit ausgewählt. Wollen Sie nur den Textknoten eines Elements
ausgeben, verwenden Sie den "Knotentest" text()
<xsl: value-of select = "/lv-group/p/text()" />
gibt nur den Text des p-Elements aus.
XPath
XPath: Wildcards, mehrere Treffer
Wildcards sprechen unterschiedliche Element- und Knotentypen
gleichzeitig an.
* wählt alle Elementknoten aus (nicht aber: Attribute,
Textknoten, Kommentare, PIs). Z.B. wählt dc:* alle
Elementknoten des Namensraums dc aus.
@* wählt alle Attributknoten.
node() wählt alle Knoten im aktuellen Kontext.
// wählt unter allen Abkömmlingen des Kontextknotens und
dem Kontextknoten: z.B. wählt //vorname alle vornameElemente.
| undiert XPath-Ausdrücke und liefert die Vereinigungsmenge
beider Ausdrücke.
XPath
XPath: Kommentare und Text auswählen
comment()
Dieser Knotentest liefert den Inhalt des Kommentars im jeweiligen
Kontext.
text()
Liefert den Textinhalt eines Kontextknotens (nicht aber die der
Kindelemente)
XPath
Achsen
child
descendant
parent
ancestor
following-sibling
preceding-sibling
following
preceding
attribute
namespace
self
descendant-or-self
ancestor-or-self
W3C
Achsen:
http://www.w3.org/TR/xpath#axes
Lokalisierungspfade, abgekürzt:
http://www.w3.org/TR/xpath#pathabbrev
Lokalisierungspfade, absolut:
http://www.w3.org/TR/xpath#locationpaths
XPath
XPath: Prädikate, Funktionen, Zahlen
Manchmal ist es notwendig, die Treffermenge der gefundenen
Knoten weiter zu filtern. Dies kann durch "Prädikate" geschehen.
Prädikate beinhalten eine Bedingung bzw. einen Ausdruck, der
wahr oder falsch ist (Boolscher Wert). Ist der Ausdruck für einen
Knoten falsch, wird er aus der Liste gelöscht.
Beispiele:
/personenliste/person[@sex='m']
/personenliste/person[name = "Brel"]
personenliste/person[1]
Im Rahmen von Prädikaten werden häufig auch Funktionen und
Zahlenoperationen verwendet.
XPath
XPath: Funktionen
Funktionen arbeiten mit Knotenmengen oder geben
Informationen über Knotenmengen zurück. Funktionen liefern
Daten folgender Typen zurück: Boolscher Wert, Zahl,
Knotenmenge, String.
Beispiele für Funktionen:
last()
count()
position()
name()
string()
starts-with()
contains(), substring()
subsstring-before(), substring-after()
string-length()
not()
XPath
XPath: Mathematische Operatoren
In XPath-Ausdrücken kann auch gerechnet werden:
+ Addition
- Subtraktion gruss[last()-1] => vorletzter Knoten
* Multiplikation
div Division 6,5 div 3 => 2
mod Restbildung 6,5 mod 1,5 => 0,5
starts-with()
contains(), substring()
subsstring-before(), substring-after()
string-length()
not()
XPath
XSLT: Verzweigungselemente
IF-Element
<xsl:if test = "count(//wer) = 5">
[...]
</xsl:if>
CHOOSE-Element
<xsl:choose>
<xsl:when test = [Bedingung]> [...Ausgabe...]
</xsl:when> [...weitere Bedingungen...]
<xsl:otherwise>[...]
</xsl:otherwise>
</xsl:choose>
XSLT
Herunterladen