XPath, XSLT - xlerb.de · XPath XML Path ist eine umfangreiche Sprache, um Teile von XML-Dokumenten...

Post on 10-Sep-2019

10 views 0 download

Transcript of XPath, XSLT - xlerb.de · XPath XML Path ist eine umfangreiche Sprache, um Teile von XML-Dokumenten...

XPath, XSLT

Ulrich Hoffmann <Ulrich.E.Hoffmann@gmx.de>

1

Übersicht

XPath

XSLT

2

XPathXML Path ist eine umfangreiche Sprache, um Teile von XML-Dokumenten zu adressieren

Keine XML-Syntax sondern URI-artige-Syntax (Pfadnamen)

abgekürzte und ausführliche Schreibweise

W3C Recomendations seit 1999 XPath 1.0, 3. 11. 2005 XPath 2.0http://www.w3.org/TR/xpath xpath20

3

Syntax: Ortsbestimmungs-Pfade

Durch / getrennte Liste von Ortsbestimmungs-Schritten: (location path, location step)

Element-Namen name Attributnamen @nameWildcards * . .. Bedingungen [ XPath-Ausdruck ]Aufruf vordefinierter XPath-Funktionen fun( )absolute Pfade beginnen mit /

4

Beispiel/*/greet[@lang='de']/text()

<?xml version=”1.0” encoding=”UTF-8”?><greetings>! Dieses XML-Dokument enthält Grußtexte ! <greet lang=”de”>Guten Tag!</greet>! <greet lang=”fr”>Bon Jour!</greet></greetings>

5

Beispiel/*/greet[@lang='de']/text()

<?xml version=”1.0” encoding=”UTF-8”?><greetings>! Dieses XML-Dokument enthält Grußtexte ! <greet lang=”de”>Guten Tag!</greet>! <greet lang=”fr”>Bon Jour!</greet></greetings>

6

Beispiel/*/greet[@lang='de']/text()

<?xml version=”1.0” encoding=”UTF-8”?><greetings>! Dieses XML-Dokument enthält Grußtexte ! <greet lang=”de”>Guten Tag!</greet>! <greet lang=”fr”>Bon Jour!</greet></greetings>

7

Beispiel/*/greet[@lang='de']/text()

<?xml version=”1.0” encoding=”UTF-8”?><greetings>! Dieses XML-Dokument enthält Grußtexte ! <greet lang=”de”>Guten Tag!</greet>! <greet lang=”fr”>Bon Jour!</greet></greetings>

8

Beispiel/*/greet[@lang='de']/text()

<?xml version=”1.0” encoding=”UTF-8”?><greetings>! Dieses XML-Dokument enthält Grußtexte ! <greet lang=”de”>Guten Tag!</greet>! <greet lang=”fr”>Bon Jour!</greet></greetings>

9

Beispiel/*/greet[@lang='de']/text()

<?xml version=”1.0” encoding=”UTF-8”?><greetings>! Dieses XML-Dokument enthält Grußtexte ! <greet lang=”de”>Guten Tag!</greet>! <greet lang=”fr”>Bon Jour!</greet></greetings>

Guten Tag!

10

Werte von Ausdrücken

Ergebniss von XPath-Ausdrücken sind

Knotenmengen (Node-Sets)

Strings

Zahlen

boolesche Werte

11

Relative Pfade

beginnen nicht mit /

sind relativ zum aktuellen Knotenbestimmt durch:

verschachtelt XPath-Ausdrücke z.B. bei [ Bedingungen ]

12

erweiterte Syntax

Ortsbestimmungs-Schritte haben die allgemeine Form:

Achse:: Knoten-Test[Prädikat]

z.B. child::greet[attribute::lang='de']

13

XPath-AchsenBestimmen die “Richtung” in der Knoten ermittelt werden

self im aktuellen Knoten selbst

parent im Elternknoten

child in den direkten Kindknoten (default)

attribute in den Attributen des aktuellen Knotens (abgekürzt durch @)

14

mehr XPath-Achsenancestor in direkten und indirekten Elternknoten

descendant in direkten und indirekten Kind-Knoten

ancestor-or-self

descendant-or-self

15

mehr XPath-Achsenfollowing-sibling, preceding-sibling dem aktuellen Knoten folgende bzw. vorangehende Knoten mit gleichem Elternelement

following, preceeding im Dokument folgende bzw. vorangehende Knoten

namespace

16

Beispiel/*/child::greet[attribute::lang='de']/text()

<?xml version=”1.0” encoding=”UTF-8”?><greetings>! Dieses XML-Dokument enthält Grußtexte ! <greet lang=”de”>Guten Tag!</greet>! <greet lang=”fr”>Bon Jour!</greet></greetings>

17

Knoten-TestElementName selektiert Subelemente mit gegebenem Namen* selektiert Elemente mit beliebigem Namen /*comment() text() processing-instruction() node()// steht für descendent-or-self::node(). steht für self::node().. steht für parent::node()

18

PrädikateXPath-Ausdrücke mit booleschem Ergebnis

aktueller Knotenmenge ist die durch vorhergehende Ortsbestimmungs-Schritte bestimmt

selektiert alle Knoten, für die das Prädikat wahr ist.

[ i ] steht für [position() = i]

19

XPath Ausdrücke

logische und arithmetische Ausdrücke

= != > < >= <= Achtung mit < -> &lt;

and or + - * div mod

name, count, last, position, sum

Stringfunktionen

20

XPath Variablen

Xpath hat Variablen $var

Werte werden durch äußeren Kontext gegeben, z.B. XSLT

21

Beispiel: Navigieren

<?xml version="1.0"?><purchaseOrder orderDate="1999-10-20"> <shipTo country="US"> <name>Alice Smith</name> <street>123 Maple Street</street> <city>Mill Valley</city> <state>CA</state><zip>90952</zip> </shipTo> <billTo country="US"> <name>Robert Smith</name> <street>8 Oak Avenue</street> <city>Old Town</city> <state>PA</state><zip>95819</zip> </billTo> <comment>Hurry, my lawn is going wild!</comment> <items> <item partNum="872-AA"> <productName>Lawnmower</productName> <quantity>1</quantity> <USPrice>148.95</USPrice> <comment>Confirm this is electric</comment> </item> <item partNum="926-AA"> <productName>Baby Monitor</productName> <quantity>1</quantity> <USPrice>39.98</USPrice> <shipDate>1999-05-21</shipDate> </item> </items></purchaseOrder>

sum(/purchaseOrder/items/item/USPrice)

188.93

/purchaseOrder/items/item/@partNum

partNum=”872-AA”partNum=”926-AA”

22

XPath-ExplorerInteraktiver Editor für XPath Ausdrückehttp://xpe.sourceforge.net/

23

XPath ist mehrXPath 2.0 Erweiterungen

reguläre Ausdrücke

Sequenzen

Variablen mit Typen (aus XML-Schema)

24

XSLTXML mit XML transformieren

25

XSLTWas ist XSLT?

Wie transformiert XSLT die XML-Daten?

Wie arbeiten XPath und XSLT zusammen?

W3C-Recommendation:

XSLT 1.0 16. Nov 1999 http://www.w3.org/TR/xslt

XSLT 2.0 3. Nov 2005 http://www.w3.org/TR/xslt20/

26

Was ist XSLT?eXtensible Stylesheet Language for TransformationsRegelbasierte Programmiersprache zum Transformieren von XML-Dokumenten

XML XSLT Prozessor

HTML

Text

Java

PDF

XML

PythonC++JavaScript...

SVGXHTMLVRMLXSLT...

XSLT

Script

27

Beispiel: Wetterlage<?xml version="1.0" encoding="ISO8859-1" ?>

<wetter datum="2005-03-27" region="Schleswig-Holstein">

<ort name="Flensburg" temp="4">Regenschauer</ort>

<ort name="Fehmarn" temp="3">bedeckt</ort>

<ort name="Heide" temp="9">wolkig</ort>

<ort name="Itzehoe" temp="8">bedeckt</ort>

<ort name="Kiel" temp="4">bedeckt</ort>

<ort name="List auf Sylt" temp="5">bedeckt</ort>

<ort name="Lübeck" temp="7">bedeckt</ort>

<ort name="Rendsburg" temp="5">bedeckt</ort>

<ort name="Schleswig" temp="4">Regen</ort>

<ort name="St.Peter" temp="6">bedeckt</ort>

</wetter>

28

Ausgabe einer HTML-Tabelle

Wetter in Schleswig-Holstein am 27. 3. 2005

Ort Temperatur Wetterlage

Flensburg 4 °C Regenschauer

Fehmarn 3 °C bedeckt

Heide 9 °C wolkig

Itzehoe 8 °C bedeckt

Kiel 4 °C bedeckt

List auf Sylt 5 °C bedeckt

Lübeck 7 °C bedeckt

Rendsburg 5 °C bedeckt

Schleswig 4 °C Regen

St.Peter 6 °C bedeckt

Durchschnittstemperatur = 5.5 °C

29

Ausgabe eines Balkendiagramms (SVG)

30

Wozu XSLT?Darstellung von XML-Daten- Präsentation im Web- gedruckte Dokumente- Daten darstellungs-unabhängig in XML- XSLT bereitet Darstellung auf

Anpassung und Konvertierung zwischen XML-Formaten (z.B. für Datenmigration)

Allgemeine Verarbeitung von XML

31

Wie sieht ein XSLT-Script aus?XSLT-Programme (Stylesheets) haben XML-Syntax

Sie enthalten Sammlung von Regeln, die angeben, wie XML-Knoten transformiert werden sollen.

Beispiel: Erzeugen von HTML

<?xml version="1.0"?><greetings> <greet>Guten Tag!</greet> <greet>Bon Jour!</greet></greetings>

<html> <body> <h1>Guten Tag!</h1> <h1>Bon Jour!</h1> </body></html>

XSLT

32

Beispiel XSLT-Script<xsl:stylesheet

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:output method="html"/>

<xsl:template match="/"><html>

<body><xsl:apply-templates select="greetings/greet"/>

</body></html>

</xsl:template>

<xsl:template match="greet"><h1><xsl:value-of select="."/></h1>

</xsl:template>

</xsl:stylesheet>

33

<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:output method="html"/>

<xsl:template match="/"><html>

<body><xsl:apply-templates select="greetings/greet"/>

</body></html>

</xsl:template>

<xsl:template match="greet"><h1><xsl:value-of select="."/></h1>

</xsl:template>

</xsl:stylesheet>

Beispiel XSLT-ScriptProgrammrahmen

34

<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:output method="html"/>

<xsl:template match="/"><html>

<body><xsl:apply-templates select="greetings/greet"/>

</body></html>

</xsl:template>

<xsl:template match="greet"><h1><xsl:value-of select="."/></h1>

</xsl:template>

</xsl:stylesheet>

Beispiel XSLT-ScriptAusgabe-Spezifikation

35

<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:output method="html"/>

<xsl:template match="/"><html>

<body><xsl:apply-templates select="greetings/greet"/>

</body></html>

</xsl:template>

<xsl:template match="greet"><h1><xsl:value-of select="."/></h1>

</xsl:template>

</xsl:stylesheet>

Beispiel XSLT-ScriptTransformations-regeln

36

Demo

37

Warum “Stylesheet”-Language

Cascading Stylesheets (.css)

Legt Darstellung von HTML-Elementen fest

Z.B. Hyper-Links in blau, Überschriften fett und rot, ...

Ursprüngliche Aufgabe für XSLT

CSS und XSLT ergänzen sich

38

<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:output method="html"/>

<xsl:template match="/"><html>

<body><xsl:apply-templates select="greetings/greet"/>

</body></html>

</xsl:template>

<xsl:template match="greet"><h1><xsl:value-of select="."/></h1>

</xsl:template>

</xsl:stylesheet>

Beispiel XSLT-Script

39

Wie arbeitet ein XSLT-Prozessor?Vorbereitung• Einlesen und Verarbeiten des XSLT-Scripts• Festlegen des Ausgabeformats• Einlesen der XML-Eingabe in eine Baumstruktur

<?xml version="1.0"?><greetings> <greet>Guten Tag!</greet> <greet>Bon Jour!</greet></greetings>

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

40

XSLT-KontextKontext-KnotenlisteListe der zu bearbeitenden Knoten

Kontext-Knotenaktuell zu bearbeitender Knoten

(Variablenbindungen, Funktionsbibliothek, Namensräume, ...)

41

Kontext-InitialisierungKontext-Knotenliste: nur WurzelknotenKontext-Knoten: Wurzel-Knoten

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

42

Wie arbeitet ein XSLT-Prozessor?

Wiederhole

Wende eine passende Regel auf den Kontext-Knoten an.

Wähle den nächsten Knoten aus der Kontext-Knotenliste.

bis Kontext-Knotenliste vollständig abgearbeitet

43

RegelanwendungIn Frage kommende Regeln

xsl:template-Definitionen im Scriptvordefinierte RegelnRekursives Anwenden von Regeln auf Elemente und TexteAusgabe von Werten für Attribute und TexteIgnorieren von Verarbeitungs-Anweisungen/Kommentaren

Wenn mehrere Regeln in Frage kommendie speziellste Regel wird angewendet

44

Vordefinierte RegelnAuf jedes Knoten (rekursiv) die passenden Regeln anwenden:<xsl:template match="*|/">

<xsl:apply-templates/></xsl:template>

Auf jeden Knoten die passenden Regeln des jeweiligen Modes anwenden:<xsl:template match="*|/" mode="x">

<xsl:apply-templates mode="x"/></xsl:template>

45

Vordefinierte Regeln

Text und Attribut-Werte ausgeben<xsl:template match="text()|@*">

<xsl:value-of select="."/></xsl:template>

Kommentare und Verarbeitungsanweisungen überspringen<xsl:template match="comment()|processing-instruction()"/>

Namespace-Definitionen überspringen<xsl:template match="namespace()"/>

46

<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0">

<xsl:output method="html"/>

<xsl:template match="/"><html>

<body><xsl:apply-templates select="greetings/greet"/>

</body></html>

</xsl:template>

<xsl:template match="greet"><h1><xsl:value-of select="."/></h1>

</xsl:template></xsl:stylesheet>

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

47

Ausgewählte Regel:

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

<xsl:template match="/"> <html> <body> <xsl:apply-templates select="greetings/greet"/> </body> </html></xsl:template>

48

<xsl:template match="/"> <html> <body> <xsl:apply-templates select="greetings/greet"/> </body> </html></xsl:template>

Ausgewählte Regel:

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

Ausgabe: <html><body>

49

<xsl:template match="/"> <html> <body> <xsl:apply-templates select="greetings/greet"/> </body> </html></xsl:template>

Ausgabe: <html><body>

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

Ausgewählte Regel:

Regeln auf neue

Kontext-Knotenliste

anwenden

50

<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0">

<xsl:output method="html"/>

<xsl:template match="/"><html>

<body><xsl:apply-templates select="greetings/greet"/>

</body></html>

</xsl:template>

<xsl:template match="greet"><h1><xsl:value-of select="."/></h1>

</xsl:template></xsl:stylesheet>

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

Ausgabe: <html><body>

51

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

Ausgewählte Regel:<xsl:template match="greet"> <h1><xsl:value-of select="."/></h1></xsl:template>

Ausgabe: <html><body>

52

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

Ausgewählte Regel:<xsl:template match="greet"> <h1><xsl:value-of select="."/></h1></xsl:template>

Ausgabe: <html><body> <h1>Guten Tag!</h1>

53

<xsl:template match="greet"> <h1><xsl:value-of select="."/></h1></xsl:template>

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

Ausgewählte Regel:

Ausgabe: <html><body> <h1>Guten Tag!</h1>

54

<xsl:template match="greet"> <h1><xsl:value-of select="."/></h1></xsl:template>

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

Ausgewählte Regel:

Ausgabe: <html><body> <h1>Guten Tag!</h1> <h1>Bon Jour!</h1>

55

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

Ausgabe: <html><body> <h1>Guten Tag!</h1> <h1>Bon Jour!</h1>

Keine weiteren Knoten in der Kontext-Knotenliste:Zum vorhergehenden Kontext zurückkehren

56

Ausgewählte Regel:

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

<xsl:template match="/"> <html> <body> <xsl:apply-templates select="greetings/greet"/> </body> </html></xsl:template>

Ausgabe: <html><body> <h1>Guten Tag!</h1> <h1>Bon Jour!</h1>

57

<xsl:template match="/"> <html> <body> <xsl:apply-templates select="greetings/greet"/> </body> </html></xsl:template>

Ausgewählte Regel:

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

Ausgabe: <html><body> <h1>Guten Tag!</h1> <h1>Bon Jour!</h1> </body></html>

58

Keine weiteren Knoten in der Kontext-Knotenliste: Ende der Transformation

Wurzel-Knoten /

Verarbeitungs-

Anweisung

<?xml ... ?>

Dokument-Element

<greetings>...</greetings>

Guten Tag! Bon Jour!

Sub-Element

<greet>...</greet>

Sub-Element

<greet>...</greet>

Ausgabe: <html><body> <h1>Guten Tag!</h1> <h1>Bon Jour!</h1> </body></html>

59

<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:output method="html"/>

<xsl:template match="/"><html>

<body><xsl:apply-templates select="greetings/greet"/>

</body></html>

</xsl:template>

<xsl:template match="greet"><h1><xsl:value-of select="."/></h1>

</xsl:template>

</xsl:stylesheet>

Zugriff auf das XML-Dokument

Beispiel XSLT-Script

60

<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:output method="html"/>

<xsl:template match="/"><html>

<body><xsl:apply-templates select="greetings/greet"/>

</body></html>

</xsl:template>

<xsl:template match="greet"><h1><xsl:value-of select="."/></h1>

</xsl:template>

</xsl:stylesheet>

Beispiel XSLT-Script

Zugriff auf das XML-Dokument

61

XPath und XSLT

Bestimmung von Knotenmengen in xsl:apply-templates

Berechnung von Zahlen und Strings in xsl:value-of

Boolesche Bedingungen in xsl:template

62

Ausgabe einer HTML-Tabelle

Wetter in Schleswig-Holstein am 27. 3. 2005

Ort Temperatur Wetterlage

Flensburg 4 °C Regenschauer

Fehmarn 3 °C bedeckt

Heide 9 °C wolkig

Itzehoe 8 °C bedeckt

Kiel 4 °C bedeckt

List auf Sylt 5 °C bedeckt

Lübeck 7 °C bedeckt

Rendsburg 5 °C bedeckt

Schleswig 4 °C Regen

St.Peter 6 °C bedeckt

Durchschnittstemperatur = 5.5 °C

63

Beispiel: Wetterlage<?xml version="1.0" encoding="ISO8859-1" ?>

<wetter datum="2005-03-27" region="Schleswig-Holstein">

<ort name="Flensburg" temp="4">Regenschauer</ort>

<ort name="Fehmarn" temp="3">bedeckt</ort>

<ort name="Heide" temp="9">wolkig</ort>

<ort name="Itzehoe" temp="8">bedeckt</ort>

<ort name="Kiel" temp="4">bedeckt</ort>

<ort name="List auf Sylt" temp="5">bedeckt</ort>

<ort name="Lübeck" temp="7">bedeckt</ort>

<ort name="Rendsburg" temp="5">bedeckt</ort>

<ort name="Schleswig" temp="4">Regen</ort>

<ort name="St.Peter" temp="6">bedeckt</ort>

</wetter>

64

XSLT-Script

Demo XSLT-Script für HTML-Generierung

65

Ausgabe eines Balkendiagramms (SVG)

66

XSLT-Script

Demo XSLT-Script für SVG-Generierung

67

XSLT ist mehrBedingungenErzeugen von PDF, Text, XML, Programmenerweiterte FallunterscheidungenIterieren über KnotenmengenInclude und ImportModesTemplate-Aufruf mit ParameternVariablenRekursionSortieren, AuswählenLinken xsl:id, xsl:keyDokumentenzugriff xsl:documentErweiterungsmöglichkeiten

68

Zusammenfassung

XML trennt Daten und Darstellung

XSLT ist eine regelbasierte Programmiersprache zum Transformieren von XML-Dokumenten

Zum Selektieren von XML-Teilen wird XPath verwendet

69