mögliches Vorgehen Beispiel XML-Inhalt → XML

Werbung
5/24/2004
Heutiges Tutorium
Übungsblatt 3: mögliches Vorgehen
1. XSLT-Stylesheet für Instanz der Übung 2
ƒ Übungsblatt 3
2. Mit XMLSpy (Enterprise Edition) aus XML-Schema
eine Instanz generieren und damit testen:
ƒ Beispiel eines XSLT-Stylesheet
ƒ aus Hunter et al., Beginning XML, 2001
ƒ XML-Inhalt ÎXML-Inhalt
ƒ XSLT und Namensräume
3. Aus XML-Schema eine minimale Instanz generieren
und XSLT-Stylesheet damit testen:
© Klaus Schild 2004
1
Beispiel
Kundenauftrag
Zulieferer
Zulieferauftrag
Zulieferauftrag
Datum
ƒƒ Datum
Produktbezeichnungaus
aus
ƒƒ Produktbezeichnung
Zuliefererkatalog
Zuliefererkatalog
Anzahl
ƒƒ Anzahl
Auftraggeber
ƒƒ Auftraggeber
© Klaus Schild 2004
3
Das Stylesheet für das Beispiel
© Klaus Schild 2004
4
Kundenauftrag
<?xmlversion="1.0"?>
version="1.0"?>
<?xml
<order>
<order>
<salesperson>John
Doe</salesperson>
<salesperson>John Doe</salesperson>
<item>Production-ClassWidget</item>
Widget</item>
<item>Production-Class
<quantity>16</quantity>
<quantity>16</quantity>
<date>
<date>
Zulieferauftrag
<month>1</month>
<month>1</month>
<day>13</day>
<day>13</day>
<?xml
version="1.0"
encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<year>2000</year>
<year>2000</year>
<order>
<order>
</date>
</date>
<date>2000/1/13</date>
<date>2000/1/13</date>
<customer>SallyFinkelstein</customer>
Finkelstein</customer>
<customer>Sally
<customer>CompanyA</customer>
A</customer>
<customer>Company
</order>
</order>
<item>
<item>
<part-number>E16-25A</part-number>
<part-number>E16-25A</part-number>
<description>Production-ClassWidget</description>
Widget</description>
<description>Production-Class
<quantity>16</quantity>
<quantity>16</quantity>
</item>
</item>
</order>
</order>
<xsl:templatematch="/">
match="/">
<xsl:template
…
…
</xsl:template>
</xsl:template>
<xsl:templatematch="item">
match="item">
<xsl:template
…
…
</xsl:template>
</xsl:template>
</xsl:stylesheet>
</xsl:stylesheet>
ƒ method="xml": XML-Deklaration wird erzeugt,
Wohlgeformtheit wird aber nicht garantiert.
ƒ indent="yes": Prozessor darf Kind-Elemente einrücken.
Name, Abteilung
<?xmlversion="1.0"?>
version="1.0"?>
<?xml
<order>
<order>
<salesperson>JohnDoe</salesperson>
Doe</salesperson>
<salesperson>John
<item>Production-ClassWidget</item>
Widget</item>
<item>Production-Class
XSLT
<quantity>16</quantity>
<quantity>16</quantity>
<date>
<date>
Zulieferauftrag
<month>1</month>
<month>1</month>
<day>13</day>
<?xmlversion="1.0"
version="1.0"encoding="UTF-8"?>
encoding="UTF-8"?>
<day>13</day>
<?xml
<year>2000</year>
<order>
<year>2000</year>
<order>
</date>
<date>2000/1/13</date>
</date>
<date>2000/1/13</date>
<customer>SallyFinkelstein</customer>
Finkelstein</customer><customer>Company A</customer>
<customer>Sally
<customer>Company A</customer>
</order>
<item>
</order>
<item>
<part-number>E16-25A</part-number>
<part-number>E16-25A</part-number>
<description>Production-ClassWidget</description>
Widget</description>
<description>Production-Class
<quantity>16</quantity>
<quantity>16</quantity>
</item>
</item>
</order>
</order>
Datum transformieren
<?xmlversion="1.0"?>
version="1.0"?>
<?xml
<xsl:stylesheetversion="1.0"
version="1.0"
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:outputmethod="xml"
method="xml"indent="yes"
indent="yes"encoding="UTF-8"/>
encoding="UTF-8"/>
<xsl:output
© Klaus Schild 2004
2
XMLXML-Inhalt Î XMLXML-Inhalt
Großhandel
Kundenauftrag
Kundenauftrag
Namedes
desVerkäufers
Verkäufers
ƒƒ Name
Datum
ƒƒ Datum
Produktbezeichnungaus
aus an
ƒƒ Produktbezeichnung
passen
Großhandelskatalog
Großhandelskatalog
ƒ
Anzahl
übernehmen
ƒ Anzahl
Namedes
desKunden
Kunden
ƒƒ Name
© Klaus Schild 2004
5
© Klaus Schild 2004
6
1
5/24/2004
Datum transformieren
KundenKunden-Element erzeugen
<xsl:templatematch="/">
match="/">
<xsl:template
<order>
<order>
<date>
<date>
<xsl:value-ofselect="order/date/year"/>
select="order/date/year"/>//
<xsl:value-of
<xsl:value-ofselect="order/date/month"/>
select="order/date/month"/>//
<xsl:value-of
<xsl:value-ofselect="order/date/day"/>
select="order/date/day"/>
<xsl:value-of
</date>
</date>
…
…
</order>
</order>
Ergebnis
Ergebnis
</xsl:template>
</xsl:template>
<?xmlversion="1.0"
version="1.0"encoding="UTF-8"?>
encoding="UTF-8"?>
<?xml
<order>
<order>
<date>2000/1/13</date>
<date>2000/1/13</date>
…
…
</order>
</order>
© Klaus Schild 2004
Kundenauftrag
<?xmlversion="1.0"?>
version="1.0"?>
<?xml
<order>
<order>
<salesperson>John
Doe</salesperson>
<salesperson>John Doe</salesperson>
<item>Production-ClassWidget</item>
Widget</item>
<item>Production-Class
<quantity>16</quantity>
<quantity>16</quantity>
<date>
<date>
Zulieferauftrag
<month>1</month>
<month>1</month>
<day>13</day>
<?xml
version="1.0"
encoding="UTF-8"?>
<day>13</day>
<?xml version="1.0" encoding="UTF-8"?>
<year>2000</year>
<order>
<year>2000</year>
<order>
</date>
<date>2000/1/13</date>
</date>
<date>2000/1/13</date>
<customer>SallyFinkelstein</customer>
Finkelstein</customer><customer>Company A</customer>
<customer>Sally
<customer>Company A</customer>
</order>
<item>
</order>
<item>
<part-number>E16-25A</part-number>
<part-number>E16-25A</part-number>
<description>Production-ClassWidget</description>
Widget</description>
<description>Production-Class
<quantity>16</quantity>
<quantity>16</quantity>
</item>
</item>
</order>
</order>
7
KundenKunden-Element erzeugen
Kundenauftrag
<?xmlversion="1.0"?>
version="1.0"?>
<?xml
<order>
<order>
<salesperson>JohnDoe</salesperson>
Doe</salesperson>
<salesperson>John
<item>Production-ClassWidget</item>
Widget</item>
<item>Production-Class
<quantity>16</quantity>
<quantity>16</quantity>
<date>
<date>
Zulieferauftrag
<month>1</month>
<month>1</month>
<day>13</day>
<day>13</day>
<?xmlversion="1.0"
version="1.0"encoding="UTF-8"?>
encoding="UTF-8"?>
<?xml
<year>2000</year>
<year>2000</year>
<order>
<order>
</date>
</date>
<date>2000/1/13</date>
<date>2000/1/13</date>
<customer>SallyFinkelstein</customer>
Finkelstein</customer><customer>Company A</customer>
<customer>Sally
<customer>Company A</customer>
</order>
</order>
<item>
<item>
<part-number>E16-25A</part-number>
<part-number>E16-25A</part-number>
<description>Production-ClassWidget</description>
Widget</description>
<description>Production-Class
<quantity>16</quantity>
<quantity>16</quantity>
</item>
</item>
</order>
</order>
9
Anzahl übernehmen
10
Kundenauftrag
<?xmlversion="1.0"?>
version="1.0"?>
<?xml
<order>
<order>
<salesperson>JohnDoe</salesperson>
Doe</salesperson>
<salesperson>John
<item>Production-ClassWidget</item>
Widget</item>
<item>Production-Class
<quantity>16</quantity>
<quantity>16</quantity>
<date>
<date>
Zulieferauftrag
<month>1</month>
<month>1</month>
<day>13</day>
<day>13</day>
<?xml
version="1.0"
encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<year>2000</year>
<year>2000</year>
<order>
<order>
</date>
</date>
<date>2000/1/13</date>
<date>2000/1/13</date>
<customer>Sally
Finkelstein</customer>
<customer>Sally Finkelstein</customer> <customer>Company A</customer>
<customer>Company A</customer>
</order>
</order>
<item>
<item>
<part-number>E16-25A</part-number>
<part-number>E16-25A</part-number>
<description>Production-ClassWidget</description>
Widget</description>
<description>Production-Class
<quantity>16</quantity>
<quantity>16</quantity>
</item>
</item>
</order>
</order>
<customer>Company A</customer>
<item>…
…
<item>
<quantity>16</quantity>
<quantity>16</quantity>
</item>
</item>
</order>
</order>
Name, Abteilung
© Klaus Schild 2004
Artikelnummer erstellen
<xsl:templatematch="/">
match="/">
<xsl:template
<order>
<order>
<date>…</date>
<date>…</date>
<customer>CompanyA</customer>
A</customer>
<customer>Company
<item>
<item>
…
…
<quantity>
<quantity>
<xsl:value-ofselect="order/quantity"/>
select="order/quantity"/>
<xsl:value-of
Ergebnis
Ergebnis
</quantity>
</quantity>
<?xmlversion="1.0"
version="1.0"encoding="UTF-8"?>
encoding="UTF-8"?>
<?xml
</item>
</item>
<order>
<order>
</order>
</order>
<date>2000/1/13</date>
<date>2000/1/13</date>
</xsl:template>
</xsl:template>
<customer>Company A</customer>
© Klaus Schild 2004
8
Anzahl übernehmen
<xsl:templatematch="/">
match="/">
<xsl:template
<order>
<order>
<date>
<date>
<xsl:value-ofselect="order/date/year"/>/
select="order/date/year"/>/
<xsl:value-of
<xsl:value-ofselect="order/date/month"/>/
select="order/date/month"/>/
<xsl:value-of
<xsl:value-ofselect="order/date/day"/>
select="order/date/day"/>
<xsl:value-of
</date>
</date>
<customer>CompanyA</customer>
A</customer>
<customer>Company
…
…
Ergebnis
</order>
Ergebnis
</order>
<?xmlversion="1.0"
version="1.0"encoding="UTF-8"?>
encoding="UTF-8"?>
</xsl:template>
<?xml
</xsl:template>
<order>
<order>
<date>2000/1/13</date>
<date>2000/1/13</date>
<customer>CompanyA</customer>
A</customer>
<customer>Company
…
…
</order>
</order>
© Klaus Schild 2004
© Klaus Schild 2004
11
© Klaus Schild 2004
12
2
5/24/2004
Artikelnummer erstellen
Artikelnummer erstellen
<xsl:templatematch="/">
match="/">
<xsl:template
<order>
<order>
<date>…</date>
<date>…</date>
<customer>CompanyA</customer>
A</customer>
<customer>Company
<item>
<item>
<xsl:apply-templatesselect="order/item"/>
select="order/item"/>
<xsl:apply-templates
<quantity>
<quantity>
<xsl:value-ofselect="order/quantity"/>
select="order/quantity"/>
<xsl:value-of
</quantity>
</quantity>
</item>
</item>
</order>
</order>
</xsl:template>
</xsl:template>
<xsl:templatematch="item">
match="item">
<xsl:template
<part-number>
<part-number>
<xsl:choose>
<xsl:choose>
<xsl:whentest=".
test=".=='Production-Class
'Production-ClassWidget'">E16-25A</xsl:when>
Widget'">E16-25A</xsl:when>
<xsl:when
<xsl:whentest=".
test=".=='Economy-Class
'Economy-ClassWidget'">E16-25B</xsl:when>
Widget'">E16-25B</xsl:when>
<xsl:when
<xsl:otherwise>00</xsl:otherwise>
<xsl:otherwise>00</xsl:otherwise>
Ergebnis
Ergebnis
</xsl:choose>
</xsl:choose>
<?xmlversion="1.0"
version="1.0"encoding="UTF-8"?>
encoding="UTF-8"?>
<?xml
</part-number>
</part-number>
<order>
<order>
…
…
<date>2000/1/13</date>
<date>2000/1/13</date>
</xsl:template>
</xsl:template>
<customer>CompanyA</customer>
A</customer>
<customer>Company
<item>
<item>
<part-number>E16-25A</part-number>
<part-number>E16-25A</part-number>
…
…
<quantity>16</quantity>
<quantity>16</quantity>
</item>
</item>
</order>
</order>
© Klaus Schild 2004
13
Zugriff auf externe Datenbanken
Kundenauftrag
ƒ Kein direkter Zugriff auf eine Datenbank möglich.
ƒ xsl:import erlaubt jedoch importieren externer Templates.
ƒ Lösung: Datenbank Î Templates Î xsl:import
15
Artikelbeschreibung übernehmen
© Klaus Schild 2004
16
<xsl:templatematch="item">
match="item">
<xsl:template
<part-number>…</part-number>
<part-number>…</part-number>
<description>
<description>
<xsl:value-ofselect="."/>
select="."/>
<xsl:value-of
</description>
</description>
Ergebnis
Ergebnis
</xsl:template>
</xsl:template>
<?xmlversion="1.0"
version="1.0"encoding="UTF-8"?>
encoding="UTF-8"?>
<?xml
<order>
<order>
<date>2000/1/13</date>
<date>2000/1/13</date>
<customer>CompanyA</customer>
A</customer>
<customer>Company
<item>
<item>
<part-number>E16-25A</part-number>
<part-number>E16-25A</part-number>
<description>Production-ClassWidget</description>
Widget</description>
<description>Production-Class
<quantity>16</quantity>
<quantity>16</quantity>
</item>
</item>
</order>
</order>
ƒ Beachte: "." bezeichnet aktuellen Knoten, hier den
Knoten, auf den das Template angewandt wird ("item").
Name, Abteilung
<?xmlversion="1.0"?>
version="1.0"?>
<?xml
<order>
<order>
<salesperson>JohnDoe</salesperson>
Doe</salesperson>
<salesperson>John
<item>Production-ClassWidget</item>
Widget</item>
<item>Production-Class
<quantity>16</quantity>
<quantity>16</quantity>
<date>
<date>
Zulieferauftrag
<month>1</month>
<month>1</month>
<day>13</day>
<day>13</day>
<?xmlversion="1.0"
version="1.0"encoding="UTF-8"?>
encoding="UTF-8"?>
<?xml
<year>2000</year>
<year>2000</year>
<order>
<order>
</date>
</date>
<date>2000/1/13</date>
<date>2000/1/13</date>
<customer>SallyFinkelstein</customer>
Finkelstein</customer>
<customer>Sally
<customer>CompanyA</customer>
A</customer>
<customer>Company
</order>
</order>
<item>
<item>
<part-number>E16-25A</part-number>
<part-number>E16-25A</part-number>
<description>Production-ClassWidget</description>
Widget</description>
<description>Production-Class
<quantity>16</quantity>
<quantity>16</quantity>
</item>
</item>
</order>
</order>
Artikelbeschreibung übernehmen
<xsl:templatematch="item">
match="item">
<xsl:template
<part-number>…</part-number>
<part-number>…</part-number>
<description>
<description>
<xsl:value-ofselect="."/>
select="."/>
<xsl:value-of
</description>
</description>
</xsl:template>
</xsl:template>
© Klaus Schild 2004
14
Artikelbeschreibung übernehmen
<xsl:templatematch="item">
match="item">
<xsl:template
<part-number>
<part-number>
<xsl:choose>
<xsl:choose>
<xsl:whentest=".
test=".=='Production-Class
'Production-ClassWidget'">E16-25A</xsl:when>
Widget'">E16-25A</xsl:when>
<xsl:when
<xsl:whentest=".
test=".=='Economy-Class
'Economy-ClassWidget'">E16-25B</xsl:when>
Widget'">E16-25B</xsl:when>
<xsl:when
<xsl:otherwise>00</xsl:otherwise>
<xsl:otherwise>00</xsl:otherwise>
</xsl:choose>
</xsl:choose>
</part-number>
</part-number>
…
…
</xsl:template>
</xsl:template>
© Klaus Schild 2004
© Klaus Schild 2004
17
© Klaus Schild 2004
18
3
5/24/2004
Fazit aus dem Beispiel
XSLT 1.0 und Namensräume
ƒ Beispiel-Stylesheet nicht gut strukturiert:
ƒ XSLT 1.0 / XPath kennt keine Namensräume
ƒ In XSLT 1.0 / XPath dürfen aber Namen mit ":"
benutzt werden.
ƒ besser für jede Teiltransformation eigenes Template
ƒ besser viele kleine Templates statt eines großen
Templates
ƒ bei namensraumeingeschränkten Elementen:
ƒ Anbindung von Datenbanken umständlich:
ƒ Namensraum-Präfix definieren
Datenbank Î Templates Î xsl:import
ƒ Beispiel-Transformation sollte auf Server durchgeführt werden,
da Kundenauftrag extern nicht sichtbar sein sollte.
Name, Abteilung
<xsl:value-of select="ns:order/ns:date/ns:year"/>
ƒ Standard-Namensraum statt Präfix nicht möglich!
ƒ Auf dem Server kann aber für die Transformation eine
beliebige andere Programmiersprache benutzt werden.
© Klaus Schild 2004
ƒ In XPath-Pfaden Präfix voranstellen:
19
© Klaus Schild 2004
20
4
Herunterladen