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