XSL Transformation (XML, XSLT, XSL-FO, XPath, XMLUnit, JPdfUnit) IT-Security WS2011/12 FB02 Elektrotechnik u. Informatik FH Münster Referent: Dominic Sondermann, Philipp Steffan und Alexander Jordan
Inhalt Teil 1 - Einführung XSL Sprachfamilie XSL Transformation / XSLT-Prozessor Objekte Serialisieren (XStream) XSLT BookStoreTransformer Apache FOP Teil 2 - XSL Syntax XPath/ XSLT/XSL-FO Teil 3 - Testing XMLUnit JPDFUnit Teil 4 - Einführung - Praktikum 2
Teil 1 - Einführung XSL Sprachfamilie 3
XSL - Sprachfamilie Extensible Stylesheet Language (XSL) Familie von XML Transformationssprachen Unterteilt sich in XSL Transformation (XSLT) XML Path Language (XPath) XSL Formatting Objects (XSL-FO) Transformation und Präsentation von XML Dokumenten 4
XSL Transformation (XSLT) Transformiert XML-Dokumente in neue XML-Dokumente XSLT-Prozessor Benötigt XSLT- und XML-Dokument z.b. SAXON, XALAN oder XT Implementieren JAXP (Java API for XML Processing) Auswahlkriterien Konformität zu den Standards XSLT und XPath Performance Verbreitung Server- oder Client-seitig Unterteilung in POP (Presentation Oriented Publishing) MOM (Message Oriented Middleware) 5
XSL Transformation (XSLT) II Transformation Nicht prozedural Folgt einem Regelwerk (Template-Regeln) Ablauf 1.XML-Parser liest XML-Dokument und XSLT-Dokument und interpretiert beide als Baum. 2.Anwendung von Regeln auf XML ergibt Ergebnisbaum. 3.Result tree in serielle Form bringen. 6
Objekte Serialisieren XML aus Java Objekt erstellen Anforderungen Traversieren des gesamten Objekts Umgang mit Collections Konvertierungswahl z.b. Attribut wird Element- oder Attributknoten Möglichkeiten via XMLEncoder Simple XML Xstream (Spring) 7
XStream Bibliothek zum (de)serialisieren von Java Objekten Keine Anpassung der Modelklassen (Annotations möglich) Einfache Einbindung package test; public class Person { private String firstname; private String lastname; } public String ObjectToXml(Object o){ XStream xstream = new Xstream(); String xml = xstream.toxml(o); } return xml; public String ObjectToXml(Object o){ XStream xstream = new Xstream(); xstream.alias("target", Person.class); String xml = xstream.toxml(o); } return xml; <test.person> <firstname>john</firstname> <lastname>doe</lastname> </test.person> <target> <firstname>john</firstname> <lastname>doe</lastname> <target> 8
Herausforderungen Referenzen public String toxml() throws Exception { } DummyClass dummy = new DummyClass("testString"); ArrayList<DummyClass> list = new ArrayList<DummyClass>(); list.add(dummy); list.add(dummy); return bst.objtoxml(list); <list> <dummyclass> <dummyattribute>teststring</dummyattribute> </dummyclass> <dummyclass reference="../dummyclass"/> </list> Lösung durch xstream.setmode(xstream.no_references) Hibernate Collections <order>... <createdate>2011-12-04 12:41:51.0</createDate>... <invoiceitemlist class="org.hibernate.collection.persistentbag"> <initialized>true</initialized> <owner class="order" reference="../.."/> <cachedsize>-1</cachedsize> <role>de.fhmuenster.lab4inf.model.order.invoiceitemlist</role> <key class="int">1</key> <dirty>false</dirty> <storedsnapshot class="list">... Lösung durch Xstream Hibernate Converter 9
XSLT XSLT bezeichnet eine Sprache zur Transformation von XML-Dokumenten. Aktuelle Version 2.0 (seit 2007) Verbreitet jedoch Version 1.0 (seit 1999) Deklarativ in XML Später mehr dazu... <xsl:template match="/html/body/content"> <b> <xsl:apply-templates/> </b> </xsl:template> 10
(BookStore)Transformer // String to StreamSource ByteArrayInputStream in1 = new ByteArrayInputStream(xml.getBytes()); Source xmlsource = new StreamSource(in1); // Setup XSL transformer TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newtransformer(new StreamSource(getClass().getResourceAsStream(xslt))); // Set Parameter for output method transformer.setoutputproperty(outputkeys.method, method); // Setup OutputStram ByteArrayOutputStream out = new ByteArrayOutputStream(); Result res = new StreamResult(out); //Start XSLT transformation transformer.transform(xmlsource, res); 1.Instanziieren der TransformerFactory Abstrakte Klasse mit statischer newinstance() Methode Instanziiert konkrete Subklasse die in javax.xml.transform.transformerfactory (System property) angegeben ist. 2.Transformer für angegebene XSL-Datei erzeugen 3.OutputMethode setzen Xml html xhtml text 4.Transformation Starten 11
Apache FOP Formatting Objects Processor Erzeugt aus Layoutdateien (XSL-FO) verschiedene Ausgabeformate wie PDF, PNG, Druckerzeugnisse etc. Primäres Ausgabeformat ist PDF Layout wird in XML beschrieben XSL-FO (Extensible Stylesheet Language Formatting Objects) Kann auch unabhängig von XSLT genutzt werden 12
(BookStore)Transformer II public void fotopdf(string fo,outputstream out) throws IOException, FOPException... 1. Erstellen einer FopFactory Sollte wiederverwendet werden 2. OutputStream/ InputStream vorbereiten 3. FopInstance erstellen Angabe von Ausgabeformat und OutputStream 4. Instanziieren eines JAXP Transformers 5. Start der Transformation Ergebnisse werden durch FOP Transformer geleitet 13
Teil 2 - XSL Syntax 14
XPath Dient der Adressierung von Strukturbestandteilen eines XML-Dokumentes XPath-Ausdrücke liefern Knotenmengen/Sequenzen zurück Beschränkung auf einfache Pfadausdrücke 15
Lokalisierungspfad Ein Pfad besteht aus mehreren Lokalisierungsschritten Trennung durch '/' wie bei unixartigen Pfaden Absolute und relative Pfade möglich Syntax eines einzelnen Schrittes: Achse::Knotentest[Prädikat] Achse: child, parent, descendent, Knotentest: Knotenname, Knotentyp Prädikat: Bedingung 16
Beispiele /child::* /child::order/child::book / /order/book //book //book[1] //book[@author="max"] <order> <date>03.12.2011</date> <book author="max"> <title>j2ee</title> <price>19.99</price> </book> <book author="hugo"> <title>xml</title> <price>4.99</price> </book> <book author="max"> <title>jdo</title> <price>29.95</price> </book> </order> //book[price<10] //book[starts-with(title, "J")] 17
XSLT Transformiert einen Quellbaum zu einem neuen Ergebnisbaum Deklarative Sprache in XML Namespace xsl: http://www.w3.org/1999/xsl/transform Wurzelelement: <xsl:stylesheet> Templatebasiert 18
<xsl:stylesheet> Wurzelelement Attribute: version XSLT-Version Jedes XSLT-Stylesheet beinhaltet dieses Element <xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/1999/xsl/transform"> <!-- Top-Level-Elements --> </xsl:stylesheet> 19
XSLT-Stylesheet <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/tr ansform"> </xsl:stylesheet> <order> <date>03.12.2011</date> <book author="max"> <title>j2ee</title> <price>19.99</price> </book> <book author="hugo"> <title>xml</title> <price>4.99</price> </book> <book author="max"> <title>jdo</title> <price>29.95</price> </book> </order> Ergebnis: 03.12.2011 J2EE 19.99 XML 4.99 JDO 29.95 20
<xsl:template> Definiert ein Template (top-level-element) Attribute: match XPath-Ausdruck name Eindeutiger Name des Templates Literale Ergebniselemente werden in das Ergebnisdokument übernommen Beispiel: <xsl:template match="/"> <!-- Content --> </xsl:template> 21
XSLT-Stylesheet Hello World <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/tr ansform"> <xsl:template match="/"> <html> <head><title></title></head> <body>hello World!</body> </html> </xsl:template> </xsl:stylesheet> <order> <date>03.12.2011</date> <book author="max"> <title>j2ee</title> <price>19.99</price> </book> <book author="hugo"> <title>xml</title> <price>4.99</price> </book> <book author="max"> <title>jdo</title> <price>29.95</price> </book> </order> 22
<xsl:apply-templates> Templates mithilfe eines XPath-Ausdrucks anwenden Attribute: select XPath-Ausdruck Falls kein passendes Template definiert wurde, werden Built-In templates angewendet (Rekursiv im Baum absteigen und Textelemente ausgeben) Beispiel: <xsl:apply-templates select="/order/book" /> 23
<xsl:value-of> Inhalte von Knoten zur Laufzeit einfügen Attribute: select XPath-Ausdruck Beispiel <xsl:value-of select="/order/book[1]/title" /> 24
XSLT-Stylesheet <xsl:template match="/"> <html> <body> <table> <xsl:apply-templates select="/order/book" /> </table> </body> </html> </xsl:template> <xsl:template match="book"> <tr> <td> <xsl:value-of select="@author" /> </td> <td> <xsl:value-of select="title" /> </td> <td> <xsl:value-of select="price" /> </td> </tr> <order> <date>03.12.2011</date> <book author="max"> <title>j2ee</title> <price>19.99</price> </book> <book author="hugo"> <title>xml</title> <price>4.99</price> </book> <book author="max"> <title>jdo</title> <price>29.95</price> </book> </order> </xsl:template> Max J2EE 19.99 Hugo XML 4.99 Max JDO 29.95 25
Attributwert-Templates Dynamisch generierte Attribute zu einem Element hinzufügen Problem: <a href="<xsl:value-of select='target' />" /> Lösung: <a href="{target}" /> Für komplexere Fälle: <xsl:attribute> 26
<xsl:output> Ausgabeformat festlegen (top-level-element) Attribute: method Dokumententyp (xml, html, xhtml, text) version Version (nur bei xml, html,...) encoding Zeichensatz indent Einrückung Falls Element nicht vorhanden, so wird versucht den Typ automatisch zu ermitteln Beispiel: <xsl:output method="xml" version="1.0" indent="yes" /> 27
<xsl:if>, <xsl:choose> Bedingte Anweisungen Attribute: test Boolscher XPath-Ausdruck Beispiel: <xsl:if test="starts-with(title,'j')"> <xsl:value-of select="@author" /> </xsl:if> If-then-else bzw. switch: <xsl:choose>, <xsl:when>, <xsl:otherwise> 28
<xsl:for-each> Iteriert über eine Sequenz Attribute: select XPath-Ausdruck Beispiel: <xsl:for-each select="/order/book"> <xsl:sort select="title" order="ascending" /> <xsl:value-of select="title" /></br> </xsl:for-each> 29
<xsl:variable> Speichert einen Wert. Zugriff über $<name>. Globale und lokale Variablen möglich. Attribute: name Variablenname select XPath-Ausdruck Anstelle von select kann der Inhalt auch direkt als Elementinhalt angegeben werden Beispiel: <xsl:variable name="titlevar" select="title" /> <xsl:variable name="var">value</xsl:variable> <xsl:value-of select="$var" /> 30
<xsl:param> Parameter an das Stylesheet übertragen Attribute: name Name des Parameters select XPath-Ausdruck. Standardwert, falls Parameter nicht zugewiesen Zugriff erfolgt wie bei <xsl:variable> Beispiel: <xsl:param name="cur">dollar</xsl:param> transformer.setparameter("cur", "Euro"); 31
XSL-FO Formatierungssprache für seitenorientierte Präsentationen von XML-Dokumenten PDF, Postscript Namespace fo: http://www.w3.org/1999/xsl/format Wurzelelement: <fo:root> XSL-FO-Dokumente teilen sich auf in: <fo:layout-master-set> - Seitenvorlagen <fo:page-sequence> - Inhalt der Seiten 32
Seitenvorlagen Definieren die Ausmaße einer Seite (z.b. A4) Wurzel : <fo:layout-master-set> Ausmaße: <fo:simple-page-master> Regionen: Body, Before, After, Start, End <fo:layout-master-set> <fo:simple-page-master master-name="simplea4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm"> <fo:region-body /> </fo:simple-page-master> </fo:layout-master-set> 33
Seiten Inhalte können an den Rändern oder im Body dargestellt werden Wurzel : <fo:page-sequence> Statische Inhalte: <fo:static> Fließtexte: <fo:flow> <fo:page-sequence master-reference="simplea4"> <fo:static-content flow-name="xsl-region-before"> <fo:block font-size="0.5em"> Mustermann GmbH & Co. KG </fo:block> </fo:static-content> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="16pt" font-weight="bold" space-after="5mm"> <xsl:value-of select="/order/book[1]/title" /> </fo:block> </fo:flow> </fo:page-sequence> 34
XSLT XSL-FO <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:fo="http://www.w3.org/1999/xsl/format"> <xsl:output method="xml" version="1.0" indent="yes" /> <xsl:template match="/"> <fo:root xmlns:fo="http://www.w3.org/1999/xsl/format"> <fo:layout-master-set> <fo:simple-page-master master-name="simplea4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm"> <fo:region-body margin="1cm" /> <fo:region-before extent="1cm" /> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="simplea4"> <fo:static-content flow-name="xsl-region-before"> <fo:block font-size="0.5em"> Mustermann GmbH & Co. KG </fo:block> </fo:static-content> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="16pt" font-weight="bold" space-after="5mm"> <xsl:value-of select="/order/book[1]/title" /> </fo:block> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> </xsl:stylesheet> 35
Teil 3 - Testing 36
XMLUnit http://xmlunit.sourceforge.net/ Maven: xmlunit 1.3 (Stand: September 2009) Kompatibel zu JUnit 3.x Durch XMLAssert auch unter JUnit 4.x Allgemein: Erkennt Differenzen zwischen XML-Strings Kann XPath-Ausdrücke evaluieren Validiert XML gegen DTD (Document Type Definition) oder XSD (XML Schema Definition) 37
XMLUnit Einbinden der Dependency <dependency> <groupid>xmlunit</groupid> <artifactid>xmlunit</artifactid> <version>1.3</version> </dependency> Verwendung public class BookStoreTransformerTest extends XMLTestCase { oder } public void testxsltransformoutputmethodhtml() throws Exception {... assert... } public class BookStoreTransformerTest { } public void testxsltransformoutputmethodhtml() throws Exception {... XMLAssert.assert... } 38
XMLUnit Beispiel I <de.fhmuenster.lab4inf.model.dummyclass> <dummyattribute>teststring</dummyattribute> </de.fhmuenster.lab4inf.model.dummyclass> 39
XMLUnit Beispiel II Erwartet: <?xml version= 1.0 encoding= UTF-8?> <html> <head><title/></head> <body> TestString </body> </html> Erzeugt: <?xml version='1.0' encoding='utf-8'?> <html> <head><title></title></head> <body> TestString </body> </html> assertequals: asserttrue(similar): asserttrue(identical): fail ok ok 40
XMLUnit Beispiel II Erwartet: <?xml version= 1.0 encoding= UTF-8?> <html> <head><title/></head> <body> TestString </body> </html> Erzeugt: <?xml version='1.0' encoding='utf-8'?> <html> <body> TestString </body> <head><title/></head> </html> assertequals: asserttrue(similar): asserttrue(identical): fail ok fail 41
XMLUnit Weitere Möglichkeiten: Whitespace oder Kommentare ignorieren Nur XML-Skelett überprüfen lassen Mit DetailedDiff die Anzahl an Unterschieden feststellen Mit dem TolerantSaxDocumentBuilder wohlgeformte HTML-Dateien erzeugen 42
JPDFUnit http://jpdfunit.sourceforge.net Maven: jpdfunit 1.1 (Stand: Dezember 2009) Allgemein: Simple API um PDF-Dateien zu testen Überprüft Inhalte und Metadaten einer.pdf Inhalte auch mittels REGEXP in einer.pdf suchen 43
JPDFUnit einbinden Einbinden des Repository <repositories> <repository> <id>jpdfunit-repo</id> <url>http://jpdfunit.sourceforge.net/repo</url> </repository> </repositories> Einbinden der Dependency <dependency> <groupid>net.sf.jpdfunit</groupid> <artifactid>jpdfunit</artifactid> <version>1.1</version> </dependency 44
JPDFUnit Verwendung public class BookStoreTransformerTest extends DocumentTestCase { } public void testxsltransformoutputmethodhtml() throws Exception {... assert... } oder public class BookStoreTransformerTest { } public void testxsltransformoutputmethodhtml() throws Exception { DocumentTester tester = new DocumentTester( Pfad/zum/pdf ); tester.assert... } 45
JPDFUnit Beispiel I Auf Inhalte im PDF prüfen Möglichkeiten bei TextSearchType: CONTAINS STARTSWITH ENDSWITH REGEXP... Oder Inhalte auf bestimmter Seite suchen tester.assertcontentcontainstextonpage("teststring", 1, TextSearchType.CONTAINS); 46
JPDFUnit Beispiel II Meta-Angaben prüfen 47
Quellen W3C Standards Apache-FOP Projekt XML von Becher, Margit (als E-Book über FH-Bibliothek beziehbar) W3Schools.com 48
Praktikum http://www.mscit.de/public:xsl 49