XML (Extendable Markup Language) - Beschreibungssprache von Daten - Werden durch Document Type Definition DTD oder Schema definiert selbstbeschreibend - Müssen immer geöffnet und geschlossen werden (<element />) - XML Dokument hat genau ein Root-Element - Kommentar: <!--Mein Kommentar--> Namen: Buchstaben, Nummern, und andere Charakter, - Element vs. Attribute: o o o o - Attribute für Metadaten Essenzielles in Elementen Hilfswerte in Attribute Wenn Wert an Element gebunden ist (Währung an Betrag) Element Content o o o keine Spaces, Case Sensitiv o Element Content: hat unter Elemente Mixed Content: hat Text und Element Inhalt Simple Content: hat Text Inhalt Empty Content: leer <element /> Prolog Stylesheet <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml-stylesheet type="text/css" href="recipe.css"?> Miscellaneous Escaping: < > & ‘ “ Charakter Escaping: &lt; &gt; &amp; &apros; &quot; <![CDATA[…….]]> Document Typ Definition - Definiert Regeln für XML Struktur - Vorteil: Parser kann Gültigkeit prüfen Inline-Deklaration Prinzip <?xml version="1.0" standalone="yes"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> … ]> XML: <!DOCTYPE note SYSTEM "note.dtd"> DTD: <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT element-name (element-content)> <!ELEMENT element-name category> (cat. = EMPTY/ANY) External-Deklaration Regeln Element Eins oder mehrere Kinder 0 oder mehrere Kinder 0 oder 1 Kind Kind oder Kind2 Kinder in Sequenz Leeres Element Irgendeinen Inhalt im Element erlaubt Mixed Content Element Attribute <!ELEMENT element-name (child-name+)> <!ELEMENT element-name (child-name*)> <!ELEMENT element-name (child-name?)> <!ELEMENT element-name (child-name | child-name | ...)> <!ELEMENT note (to, from, (message+ | body)> <!ELEMENT element-name EMPTY> <!ELEMENT element-name ANY> <!ELEMENT note (#PCDATA | to | from | header | message)*> Prinzip <!ATTLIST element-name attribute-name attribute-type default-value attribute-name attribute-type defaultvalue ... > Regeln Attribute Attribut mit Standardwert Obligatorisches Attribut Optionales Attribut Fixiertes Attribut, kann nicht geändert werden Attributtypen Enumeration Gültiger XML Name (ohne Leerzeichen etc.) Eindeutiger Bezeichner und Referenz darauf Entities <!ATTLIST file type (text | binary) "text"> <!ATTLIST file size CDATA #REQUIRED> <!ATTLIST file size CDATA #IMPLIED> <!ATTLIST part title-level NMTOKEN #FIXED "First"> <!ATTLIST shirt size (small | medium | large) "medium"> NMTOKEN ID, IDREF <!ATTLIST chapter my-id ID #IMPLIED> <!ATTLIST chapter-ref target IDREF REQUIRED> Variablen (funktionieren auch Rekursiv) - Internal / External: intern oder in anderem File definiert - General / Parameter : Generell referenziert in XML, Parameter in DTD - Parsed / Unparsed: vom XML Parser Generell Entities Internal DTD: <!ENTITY title "Hacker life"> External DTD XML: …&title… <!ENTITY title SYSTEM "Hacker.txt"> Parameter Entities <!ENTITY % description "address, footage, rooms"> <!ELEMENT apartment (%description;, rent)> Namespaces - Namens Konflikte: Um Missverständnisse zwischen gleichnamigen Tags zu verhindern - Stehen in Starttag - Prefix zur Abkürzung des URI verwendet - Egal ob es den URI gibt oder nicht (er muss einem nur gehören) - Default Namespace: Elemente ohne prefix - Nicht Teil der XML 1.0 Spezifikation Prinzip Schemas - Validieren XML - Spezifiziert Struktur und die Datentypen des Dokuments - Im Gegensatz zu DTD kann mit Namespaces umgehen Namespace Im Schema: Schema: xmlns:namespace-prefix="namespace" Beispiel: xmlns:f=http://www.w3schools.com/furniture Default Namespace <element xmlns="namespace"> <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.books.org" unsere Elemente, optional xmlns="http://www.books.org" DefaulNamespace elementFormDefault="qualified"> Elemente müssen von einem NS erkannt sein qualified /unqualified nur globale Deklarationen NS spezifiziert Im Dokument: <BookStore xmlns ="http://www.books.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.books.org BookStore.xsd"> Ohne Schema: - Element Deklaration Globale Deklarationen: Elemente direkt unter Schema Kein targetNamespace angeben Anstatt schemaLocation noNamespaceSchemaLocation xsi:noNamespaceSchemaLocation= "BookStore.xsd" Named Type Element Lokale Deklarationen: Alle anderen Element Deklarationen Definition vs Deklaration: Deklaration von Elementen und Attributen die direkt im XML vorkommen, Definiere Typen Design Pattern Russian Doll: alles Inneinander verpackt - Inhalt nicht wiederverwendbar - Kompaktes Schema Salami Slice: Alle Elemente global und referenziert - Transparenter Inhalt - Wortreich - vernetzt Venetian blind: Typen definiert und Element nur noch von diesem Typ Daten Typen Wann einsetzen: SimpleType: bei neuen Typen die eine veränderung von - einem Standardtyp sind ComplexType: wenn man Kindelemente oder Attribute hat Simple DataType Facetten generell and verknüpft, ausser pattern und enum (or) String Faceten: - Length minLength maxLength pattern enumeration whitspace (preserve, replace, collapse) Integer Faceten - - totalDigits pattern whitespace enumeration maxInclusive maxExclusive minInclusive minExclusive Abgeleitete Typen Zwei möglichkeiten abzuleiten: - restriction: Einschränkung <xsd:element name="BookStore"> <xsd:complexType> // anonymous Type (no Name) <xsd:sequence> Mit Namen: <xsd:schema> <xsd:complexType name="BookPublication"> <xsd:sequence> <xsd:element name="Book"> <xsd:complexType> <xsd:sequence> <xsd:element name="Title" type="xsd:string"/> <xsd:element name="Author" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </element> <xsd:element name="Title" type="xsd:string"/> <xsd:element name="Author" type="xsd:string"/> <xsd:element name="Book"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Title"/> <xsd:element ref="Author"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="Publication"> <xsd:sequence> <xsd:element name="Title" type="xsd:string"/> <xsd:element name="Author" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:element name="Book" type="Publication"/> Typen: normalizedString token NMTOKEN Name ID, IDREF ENTITY <xsd:simpleType name="ISBNType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{1}-\d{5}-\d{3}-\d{1}"/> <xsd:pattern value="\d{1}-\d{3}-\d{5}-\d{1}"/> <xsd:pattern value="\d{1}-\d{2}-\d{6}-\d{1}"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="TelephoneNumber"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{3}-\d{4}-\d*"/> <xsd:maxLength value="15"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="shape"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="circle"/> <xsd:enumeration value="triangle"/> <xsd:enumeration value="square"/> </xsd:restriction> </xsd:simpleType> //Basis <xsd:complexType name="Publication"> <xsd:sequence> <xsd:element name="Title" type="xsd:string"/> <xsd:element name="Author" type="xsd:string" - extension: Erweiterung Restrictions - müssen immer alles Wiederholen Erweiterungen - müssen nicht alles Wiederholen Man kann einen Typ sagen, man darf davon nicht mehr ableiten: - - <xsd:complexType name="…" final="#all" …> <xsd:complexType name="…" final="restriction" …> <xsd:complexType name="…" final="extension" …> Attribute - Benötigt: use=“required“ oder „optional“ - Standardwert mit Default - Immer nach der Sequenz im ComplexTyp - Attribute haben immer nur SimpleTypes complexContent: zeigt das ComplexTyp eine Ableitung eines anderen Typs ist simpleContent: zeigt das der ComplexTyp eine Ableitung eines einfachen SimpleTyps ist. Choice und all Choice entspricht oder Verknüpfung: <!ELEMENT transportation (train | plane | automobile)*> ALL: Elemente in beliebiger Reihenfolge Man kann darin auch wieder mit Sequenzen arbeiten. maxOccurs="unbounded"/> <xsd:element name="Date" type="xsd:gYear"/> </xsd:sequence> </xsd:complexType > //Erweiterung <xsd:complexType name="BookPublication"> <xsd:complexContent> <xsd:extension base="Publication"> <xsd:sequence> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name="Publisher" type="xsd:string"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType > // Einschränkung <xsd:complexType name= "SingleAuthorPublication"> <xsd:complexContent> <xsd:restriction base="Publication"> <xsd:sequence> <xsd:element name="Title" type="xsd:string"/> <xsd:element name="Author" type="xsd:string" maxOccurs="1"/> <xsd:element name="Date" type="xsd:gYear"/> </xsd:sequence> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:element name="Book" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element … /> </xsd:sequence> <xsd:attribute name="Category" use="required"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="autobiography"/> <xsd:enumeration value="non-fiction"/> <xsd:enumeration value="fiction"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> <xsd:attribute name="InStock" type="xsd:boolean" default="false"/> <xsd:attribute name="Reviewer" type="xsd:string" use="optional"/> </xsd:complexType> </xsd:element> <xsd:element name="transportation"> <xsd:complexType> <xsd:choice minOccurs="0" maxOccurs="unbounded" > <xsd:element name="train" type="xsd:string"/> <xsd:element name="plane" type="xsd:string"/> <xsd:element name="automobile" type="xsd:string"/> </xsd:choice> <xsd:all> <xsd:element name="Title" type="xsd:string"/> <xsd:element name="Author" type="xsd:string"/> <xsd:element name="Date" type="xsd:string"/> </xsd:all> </xsd:complexType> </xsd:element> List <Numbers>12 49 37 99 20 67</Numbers> - Mehrere Werte in einem Elemente Union - Verbindet mehrere Typen als Möglichkeit - z.B. Mesh-Geometrien um Platz zu sparen keine Listen von Listen Listen nur von SimpleTypes Seperierung mit Whitespace <xsd:simpleType name="LotteryNumbers"> <xsd:list itemType="xsd:positiveInteger"/> </xsd:simpleType> AnyType - Element mit Typ anyType kann alles sein auch Mixedtype Any-Element Autor kann irgendwelche Elemente anfügen! <xsd:element name="FloatOrInt"> <xsd:simpleType> <xsd:union memberTypes="xsd:float xsd:integer"/> </xsd:simpleType> </xsd:element> Mixed - Erlaubt inhalt von Text und Elementen <xsd:complexType mixed="true"> - <xsd:element name="Book"> <xsd:complexType> <xsd:sequence> <xsd:element name="Title" type="xsd:string"/> <xsd:any minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> XSLT eXtensible Stylesheet Language - XSL sind auch XML Dokumente - Geteilt in: o XSLT:Strukturelle Umformung Quelle und Ziel sind XML Dokumente o XSL-FO: Layout und Darstellung Zielformat PDF/Ausgabeformat - Rendering: Aufbearbeitung für Ausgabegerät o Auf Client: Nachteil Quelletext sichtbar o Server: Browser muss nicht verarbeiten, nur Bedingte Anpassungen der Darstellung Verweis Verarbeitungsmodell <?xml-stylesheet type="text/xsl" href="foo.xsl"?> Wurzelknoten: / Wurzelelement: /rootelement Befehle Text einfügen Wert ausgeben Wert ausgeben in Literal Kopieren von EIngabe zu Ausgabe (ohne Nachfolger/mit Nachfolger) Template Rekursiver Template aufruf Schleifen Direkter Aufruf (Prozedurale Verarbeitung) If-Else Sortierung in apply-templates und for-eauch order="ascending/descending" lang="..." // nach RFC 1766 - Besteht aus einer Menge von Template Regeln (Suchmuster + Schablone) Einzelner Knoten 1. Es wird die Template Rule die am besten passt gesucht 2. Template wird instanziert, Ausgabefragment erzeugt, Verarbeitung Rekursiv weitergeführt Liste von Knoten 1. Jeder Knoten Reihe nach verarbeitet 2. Resultat wird zusammengefügt. Bestandteile - Anweisung zur Rekursiven verarbeitung, XPath Ausdrücke, Literale, Kontrollstrukturen Wurzelknoten vs Wurzel Element <xsl:text></xsl:text> <xsl:value-of select="text()"/> <adresse public_neu = "{ @public }" /> <xsl:copy> <xsl:copy-of select="nachname"/> //mit Nachfolger <xsl:template match="vorname"> <xsl:apply-templates /> <xsl:apply-templates select="competitor"/> <xsl:apply-templates select="competitor" mode="Rank"/> <xsl:template match="competitor" mode="Rank"> <xsl:for-each select = "competitor"> <xsl:call-template name="RankFamilyNames"> <xsl:with-param name="myComp" select="."/> </xsl:call-template> <xsl:template name="RankFamilyNames"> <xsl:param name="myComp" /> <xsl:if test="expression"> ... </...> <xsl:apply-templates select = "competitor"> <xsl:sort select="time" data-type="number"/> </xsl:apply-templates> data-type="text/number" case-order="upper-first/lower-first" Nummerierung ■ ■ ■ ■ ■ ■ ■ <xsl:number level="single" format="l"/> value="expression" converted to number format="..." default: 1. level="..." any/single/multiple lang="..." letter-value="..." grouping-separator="..." grouping-size="..."/ Vaiablen Import (niedrigere Preferenz) und Include Choose Switch Namspaces XPath Wurzelknoten Wurzelelement absoluter Lokalisierungspfad relativer Lokalisierungspfad irgend ein Nachkomme beliebiges Element aktueller Knoten Eltern benanntes Attribut beliebiges Attribut Textknoten beliebiger Knoten (E, T, K, PI,~A) Kommentar lesen Oder Verknüpfung <xsl:variable name="..." select="expression"/> <xsl:value-of select="$N"/> <xsl:include href="… "/> <xsl:import href="… "/> <xsl:choose> <xsl:when test="expression"> ... </xsl:when> ... <xsl:otherwise> ... </xsl:otherwise> </xsl:choose> <xsl:template match="/ad:adresse"> / /adresse /adresse, /adress/vorname // oder descendant-or-self::node() nachname * . .. @private oder attribute::private @* text() node() comment() | (vorname | nachname) oder alles selektieren mit (node()|@*) XPath – Xpointer - XLink XPath: - deklarative Abfragesprache um Knoten lokalisiert Fragmente verwendet in XSLT, XPointer, XLink, XQuery XPointer: - Erweiterungvon XPath um bereiche von externen Dokumenten zu lokalisieren XLink: - - Verallgemeinerung des HTML Link Konzepts Ausdrucksstärker als HTML Links (Mehrfachauswahl, Verhalten) Verwendet XPointer um in XML Doks zu verweisen XPath - Auswertung des Lokalisierungspfades von Links nach rechts - Starke analogie zu Verzeichnispfad von Unix/Windows - Kontext:Jeder LokalisierungsSchritt in eigenem Kontext (nicht absolute Ausdrücke deshalb immer au Kontext) 3 Lokalisierungsstritte: Vorteil schritt drei nur selten ausführen - axis::node-test [predicate]] - axis: child(standard), parent node-test: erste Filterung nach Namen Prädikat: komplexere filterung (teuer) Axis – Achsen: - self: eigener Knoten self::comment() oder ./comment() ancestor: alle Vorgänger parent: direkter Vorgänger ancestor-or-self: Vorgänger + selbst descendant: alle Nachfolger child: direkte Nachfolger (default) descentant-or-self: Nachfolger oder selbst preceding-sibling: vorherige Elemente mit gleichen Eltern following-sibling: nachfolgende Elemente mit gleichen Eltern preceding/following: Elemente die vorher/nachher kommen in umgekehrter Reihenfolge attribute: attribute des Knotens namespace: des Knotens XPath Prädikate: in [ ] zu bool ausgewertet Beispiele: - - competitor[country/text() ='SWE'] competitor[position()= 100] entspricht competitor[100] rankingList[count(competitor) > 10] competitor[middleName] existenz prüfung Funktionen: - . oder current(): aktueller Knoten text(): Inhalt (Text) des Knotens position(): Index des Kontext-Knotens last(): Index des letzten Elements in Kontext-Knoten count(node-set): Zählt # Knotendocument(String): lade zusätzliches XSLT name(node): Qualifizierter Name des Knotens local-name(node): Name eines Knotens ohne Namespace namespase-uri(node): URI des Namespaces des Knotens generate-id(node): Generiere künstlichen Schlüssel - id (String IDs ): Knoten ID (Leerzeichen getrennte Liste) Nummer-Funktionen - count(node-set): zählt # Knoten number(node): wandelt in Zahl um ceiling(x): rundet zur nächsten ganzen Zahl auf floor(x): rundet zur nächste ganze Zahl ab round(x): mathematisches Runden - sum(node-set): zähle die Werte der Knoten zusammen String-Funktionen - concat(s1,s2,...) füge String zusammen contains(s1,s2) wahr wenn s2 ein Teilstring von s1 ist normalize-space(s) entferne führende und abschliessende Leerz. starts-with(s1,s2) wahr wenn s1 mit s2 beginnt string() wandle in String um string-length() Länge des Strings substring(s, start, [length]) Teilstring der bei der Stelle index beginnt (1..l) substring-after(s1,s2) Teilstring nach dem ersten Vorkommen von s2 substring-before(s1,s2) Teilstring vor dem ersten Vorkommen von s2 translate(s1,s2,s3) ersetze in s1 alle Vorkommen von s2 durch s3 Boolean-Funktionen : Leere Strings false aber „false“ oder „0“true boolean() wandelt in Boolean um false() Konstante FALSCH true() Konstante WAHR not() Negation des Ausdrucks Mehre Dokumente ansprechen: <xsl:template match="/"> <xsl:apply-templates select="document('NY2001.xml')"/> <xsl:apply-templates select="document('NY2002.xml')"/> </xsl:template> XPointer Vorteil: Referenz zu Dokument ohne Anker setzen zu müssen Bleiben oft gültig, auch wenn Dokument ändert Können nur auf wohlgeformte XML verweisen. Mehrere xpointer Verweise nacheinander XLink : Verallgemeinerung des HTML-Links Problem HTML: - Einschränkungen normale Links: - Zeichen Escaping Leerzeichen : %20, " : %22, < : %3C, ... Namespaces: Syntax: xmlns (prefix = uri) Beispiel: xmlns(svg=http://www.w3.org/2000/sgv) xpointer(//svg:rect) ID Referenzieren http://www.books.com/booklist.xml#xpointer(id(020179147)) http://www.books.com/booklist.xml#020179147 Position: xpointer(/child::*[position()=1]/child::*[position()=2]/child::* /[position() = 1]) xpointer(/*[1]/*[2]/*[1]) xpointer(here()/../../following-sibling::buch/text()) Punkte: - Jeweils vor und nach Knoten, bzw. zwischen jedem Character bei Text - Start-point() end-point() - End-point(buch) setzt vor Beginn des Buch Endtags - //title/text()/point()[position()=0] Bereiche: - Spanne zwischen 2 Punkten Range(//title) Range-inside(//title) von elementstart- bis vor ende schlusstag Verweisen immer auf Spezifische Elemente a,img Bedeutung des Links vordefiniert Anker definieren Definition von link in Quelle Nur einzelne Elemente referenzierbar Nur 1 zu 1 verknüpfungen Einfache Links: <autorlist> <name>Rusty Harrold</name> <book xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type ="simple" xlink:href ="http://../booklist.xml#xpointer(id(020179147)) /> </autorlist Link Verhalten: xlink:show New: Zielresource in neuem Fenster Replace: ersetze Dokument im aktuellen Fenster Embed: Einbetten an aktueller Stelle … xlink:actuate onLoad: Link sofort verfolgen onRequest: auf Benutzeranforderung hin verfolgen Bedeutung: xlink:title Beschreibt Bedeutung xlink:role - URI mit ausführlicher Beschreibung der Semantik Erweiterte Links: ? XSL-FO (Formatting Objects) Nachteile CSS: - Nur Darstellung, Struktur unverändert Kein Professionel Layout möglich Nicht von allen Browsern unterstützt Vorteile FO - Browser muss nicht verarbeiten Nachteil: - Nur noch bedingte Anpassung auf dem Client Zweck: Darstellungseigenschaften beschreiben Eigenschaften: - Keine Browserunterstützung Erlaubt exakte und detaillierte Kontrolle über Layout Aufbau ähnlich TeX ist aber XML Tags an CSS angelehnt Master Seiten - Beschreiben das Layout einer Seite - Rechteckige Seite mit Rändern und Leerraum an Seiten - Haben Namen Bereiche: - region-body: Hauptbereich ist obligatorisch region before: Bereich davor region-after: Bereich nachher region-start: Anfangsbereich region-end: Endbereich Einfache Master Seiten: simple-page-master <fo:layout-master-set> <fo:simple-page-master master-name="my-page" page-width="21.0cm" page-height="29.7cm" margin-right="1.5cm" margin-left="1.5cm" margin-bottom="1.5cm" margin-top="1.5cm"> <fo:region-start extent=”1.0cm ”/> <fo:region-before extent=”1.0cm ”/> <fo:region-body margin="1.0cm" column-count=”3” columngap=”0.5cm”/> <!--Obligatorisch --> <fo:region-end extent=”1.0cm ”/> <fo:region-after extent=”1.0cm ”/> </fo:simple-page-master> </fo:layout-master-set> Aufruf von FO in XSLT: fop -xml <xml-Datei-Namen> -xsl <xsl-Datei-Namen> -pdf out.pdf Seitensequenz-Master (page-sequence-master) - sagt wie Layout der Seiten aussieht (Titelblatt, folgende) Sequenzen oder einzelne Seiten single-page-master-reference - master-reference: master-name des Masters repeatable-page-master-reference - master-reference: master-name des Masters - maximum-repeats repeatable-page-master-alternatives - alternativen <fo:repeatable-page-master-alternatives> // first | last | rest | any <fo:conditional-page-master-reference page-position="first" master-reference="first-page"/> <fo:conditional-page-master-reference odd-or-even="odd" master-reference="odd-page"/> <fo:conditional-page-master-reference odd-or-even="even" master-reference="even-page"/> </fo:repeatable-page-master-alternatives> <fo:layout-master-set> <fo:simple-page-master master-name="first-page"> <fo:region-body margin="2cm" /> </fo:simple-page-master> <fo:simple-page-master master-name="all-pages"> <fo:region-body margin="1cm"/> </fo:simple-page-master> <fo:page-sequence-master master-name="my-sequence"> <fo:single-page-master-reference master-reference="firstpage"/> <fo:repeatable-page-master-reference master-reference="allpages"/> </fo:page-sequence-master> </fo:layout-master-set> Seitensequenzen (Seiteninhalt) Besteht aus einem Fluss von Inhalt in Bereiche - page-sequence: gibt an auf welchen Master static-content: auf allen Seiten gleich Header/Footer flow: fliessender Inhalt block-container: Gruppe von Blöcken vererbt Attribute block: Textblock mit dem eigentlichen Text inline: auf einzelne Teile im Block: Inline Element Allgemeine Bereichseigenschaften (wie CSS) - margin: (left, right, top, bottom, start, end, before, after) Rand - space-after/before: Platz zwischen Bereichen - display-align: (after, auto, before, center) - width/height auf block-container - reference-orientation=180: Orientierung <fo:page-sequence master-reference="my-page"> // welchen master <fo:static-content flow-name=”xsl-region-after”> <fo:block>The Periodic Table</fo:block> </fo:static-content> <fo:flow flow-name="xsl-region-body"> // welchen Bereich <fo:block>Hello, world!</fo:block> // Text-Blöcke <fo:block> <fo:inline color="red"> It's </fo:inline> a cruel world</fo:block> </fo:flow> </fo:page-sequence> Text- Bereiche - line-height=”1.5cm” text-align=”justify,center, start, end” letter-spacing word-spacing text-transform=”uppercase, lowercase, capitalize” baseline-shift=”sub, super” hyphenate=”true” language=”de” //Silbentrennung Listen Tabellen <fo:list-block provisional-distance-between-starts="18pt"> <fo:list-item> <fo:list-item-label end-indent="label-end()"> <fo:block>&#x2022;</fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block>First item</fo:block> </fo:list-item-body> </fo:list-item> <fo:list-item> <fo:list-item-label end-indent="label-end()"> <fo:block>&#x2022;</fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block>Second item</fo:block> </fo:list-item-body> </fo:list-item> </fo:list-block> Grafiken <fo:external-graphic src="file:boxes.svg"/> <fo:external-graphic src="url('aufmacher.jpg')" width="7cm"> <fo:table border-style="solid" border-width="thick"> <fo:table-column column-width="20mm" number-columns-repeated="2"/> <fo:table-body> <fo:table-row > <fo:table-cell border-style="solid"> <fo:block>Hallo</fo:block> </fo:table-cell> <fo:table-cell border-style="solid"> <fo:block> World </fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table> Direkt SVG <fo:instream-foreign-object> <svg:svg xmlns:svg="http://www.w3.org/2000/svg" width="3cm" height="4cm" xml:space="preserve"> <svg:polygon style="fill" color="#FFCCCC" points="0,31 18,0 36,31"/> </svg:svg> </fo:instream-foreign-object> Seiten Nummern und Referenzen Seitennummer: <fo:static-content flow-name="xsl-region-before"> <fo:block text-align="end">Page <fo:page-number/></fo:block> </fo:static-content> Seitennummer-Referenz: <fo:block text-align-last="justify"> 1. Introduction <fo:leader leader-pattern="dots"/>· <fo:page-number-citation ref-id="intro"/> </fo:block> Links Innerhalb Dokument: (Ziel muss id haben) <fo:basic-link internal-destination="smiley" text-decoration="underline">Click here</fo:basic-link> Ausserhalb Dokument: <fo:basic-link external-destination="http://www.zhwin.ch/~rea" text-decoration="underline" color="blue">Rege's Homepage</fo:basic-link> Marker und Fussnote - Folien nachsehen <fo:block> This text contains a footnote <fo:footnote> … <fo:footnote-body> … </fo:footnote-body> </fo:footnote> after the word "footnote".</fo:block> DOM Document Object Model - DOM bildet Baumstruktur des XML in Speicher ab - DOM standardmethode um XML zu verarbeiten - Schnell lieber SAX - Java unterstützung über: JAXP Java API for XML - Unterschied Node und Element: Element ein spezieller Node Dokument Parsen: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(docFile); Factory Einstellungen: dbf.setValidating(true); dbf.setIgnoringElementContentWhitespace(true); dbf.setNamespaceAware(true); Befehle Alle Kindknoten erhalten Root-Element erhalten Alle untergeordneten Tags vom Typ tag Alle Attribute vom Element erhalten Länge der NodeListe Auf ein spezielles Kind Element zugreifen Name und Wert eines Nodes Typ eines Nodes abfragen Attribut per Name ansprechen Wert eines Nodes ändern Nodes erstellen Nodes einfügen/anhängen Auf Eltern Element zugreifen Auf ersten Kindknoten zugreifen Element austauschen Attribute hinzufügen Attribut-Wert setzen Attribut entfernen Namespace zugreifen Node-Typen - Element: kann als einziger Attribute haben - Attribute - Text - Document: oberstes Element keine Eltern - Andere CDATA, Comment, Entities, Notations Dokument Ausgabe: - DOMUtil .printDOM(Node), writeXmlToFile(filename, document) // nicht in standard API - Über Transform Source source = new DOMSource(document); File file = new File(filename); Result result = new StreamResult(file); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.transform(source, result); // Achtung: TransformerConfigurationException // Achtung: .parse() SAXException NodeList children = node.getChildNodes(); Element root = doc.getDocumentElement(); NodeList desc = e.getElementsByTagName(tag); NamedNodeMap attr = e.getAttributes(); children.getLength() Children.item(i) node.getNodeName() node.getNodeValue() if (start.getNodeType() == Node.ELEMENT_NODE) Node att = node.getAttributes().getNamedItem("attributname"); Node.setNodeValue(String value); Element e = doc.createElement (name); Text t = doc.createTextNode (name); Attr a = doc.createAttribute (name); e.appendChild(n); e.insertBefore (n, childNode); e.removeChild(node); n.getParentNode() …item(0).getFirstChild() alt.getParentNode().replaceChild( neu, alt); e.setAttributeNode(a); e.setAttribute(attributeName, attributeValue); e.removeAttribute(attributeName); String getNamespaceURI() String getLocalName() String getPrefix() getElementsByTagNameNS() etc. XPath Import Factory Import javax.xml.xpath.*; Neuer XPath XPath String Ausführen String expr = "//NAME[text()='Cindy']"; XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); Element name = (Element)xpath.evaluate (expr, doc, XPathConstants.NODE); Vorkompiliert (falls mehrfach verwendet) XPathExpression xexpr = xpath.compile(expr); Element name = (Element) xexpr.evaluate( doc, XPathConstants.NODE); SAX (Simple API for XML) - Schneller als DOM - Event bassiert - Kein w3c-Standard - StAX: Streaming API for XML pull-API: Client calls Klassen und Interfaces Methoden von StAX, statt Events Switch-Anweisung Ablauf: - - SAXParser erzeugen EventHandler erzeugen Handler an Parser binden Parse Dokument und sende events zu den Handlern SAXParser erstellen Direkt: XMLReader reader = new org.apache.xerces.parsers.SAXParser(); Treiber zur Laufzeit: - Attributes XMLReader: representiert Parser InputSource ContentHandler: spezifiert die Events DefaultHandler: ContentHandler mit DTDHandler und ErrorHandler XMLReaderFactory: bezug des XMLReaders SAXParser EventHandler erstellen - reader.setContentHandler() reader.setDTDHandler() reader.setEntityResolver() reader.setErrorHandler() java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser XMLApp XMLReader reader = XMLReaderFactory.createXMLReader(); DefaultHandler implementiert alle bereits mit leeren Methoden Treiber übergabe bei XMLReaderFactory: ContentHandler: XMLReader reader = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser"); Benutze JAXP: SAXParserFactory spfactory = SAXParserFactory.newInstance(); SAXParser saxParser = spfactory.newSAXParser(); XMLReader reader = saxParser.getXMLReader(); Parser -Verhalten ändern - - Factory.setNamespaceAware(true); Factory.setValidationg(true) setFeature(); setProperty(); - - characters (char[] ch, int start, int length) endDocument() endElement(String namespaceURI, String localName, String qName) endPrefixMapping(String prefix) ignorableWhitespace(char[] ch, int start, int length) processingInstruction(String target, String data) setDocumentLocator(Locator locator) skippedEntity(String name) startDocument() startElement(String namespaceURI, String localName, String qName, Attributes atts) startPrefixMapping(String prefix, String uri) ErrorHandling: warning() error() fatalError() z.B: public void error (SAXParseException e) {System.out.println (“Error”)} SVG( Scalable Vector Graphics) Vektor Grafik: - Bild durch Geometrie-Formen beschrieben Viewer erhält Kommandos zum darstellen Beschrieben durch eine Liste von Instruktionen Raster Grafik - Formate : - - Adobe Illustrator PostScript Flash Windows Meta File Pixel Array Pixel durch RGB bestimmt Serie von Pixel Bitmap Kompremiert /Kompression Viewer untkomprimiert ung transferiert zu Screen Koordinaten Anzeigebereich im <svg>-Tag Einheit wählbar, Standard Pixel Die Viewbox setzt die Grafik realtiv zu en Angaben. <svg width="4cm" height="5cm" viewBox="0 0 64 80"> <rect x="16" y="16" width="40" height="40" style="fill: none; stroke: black;"/> ... </svg> Formen <?xml version="1.0"?> <!DOCTYPE svg SYSTEM "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="400" height="200" xmlns="http://www.w3.org/2000/svg"> <desc>Basic shapes</desc> <circle cx="50" cy="50" r="25" stroke="black" fill="none"/> <ellipse cx="75" cy="125" rx="50" ry="25"/> <rect x="155" y="5" width="75" height="100" fill="#ffff00"/> <rect x="250" y="5" width="75" height="100" rx="30" ry="20" fill="red"/> <line x1="0" y1="150" x2="400" y2="150" stroke-width="2" stroke="blue"/> <polyline points="50,175 150,175 150,125 250,200" stroke="magenta" fill="none"/> <polygon points="350,75 379,175 355,175 355,200 345,200 345,175321,175" fill="green"/> </svg> Text an Pfad Text transformieren (transformieren) <defs> <path id="curve" d="M 30 40 C 50 10, 70 10,120 40 S 150 0, 200 40" /> </defs> <text font-size="15" style="fill:blue;"> <textPath xlink:href="#curve"> Following a Bezier curve </textPath> </text> <text x="10" y="180" font-size="30" transform="rotate(30,10,180)" font-family="Times" style="fill:green;"> Rotated 30 degrees </text> Pfade Ellipsen Bogen <path d="M 40 60, L 10 60, L 40 30, Z, M 70 80, L 100 100"/> M: MoveTo, L: LineTo, Z: ClosePath A: Bogel, Q: Quadric Bezier, C: Cubic Bezier (kleine Buchstaben sind Relativ zur aktuellen Position) A radiusX radiusY rotation largeArcFlag sweepFlag endX endY Styles Gruppieren und Referenzieren //Reihenfolge Transformationen wichtig! - Gruppen mit <g> Wenn <g> nicht in <defs> wird es gleich gezeichnet <g id="house" style="fill: none; stroke: black;"> <rect x="6" y="50" width="60" height="60"/> <polyline points="6 50, 36 9, 66 50"/> <polyline points="36 110, 36 80, 50 80, 50 110"/> </g> <use xlink:href="#house" transform="translate(70,100)"/> Bild-Dateien Referenzieren External: <?xml-stylesheet href="ext_style.css" type="text/css"?> Inline: <circle cx="20" cy="20" r="10" style="stroke: black; strokewidth: 1.5; fill:blue;"/> Oder: <defs> <style type="text/css"> <![CDATA[ circle {stroke: black; stroke-width: 5; fill: blue;} line {stroke: black; stroke-width: 2;} ]]> </style> </defs> - JPEG und PNG möglich <image xlink:href="LakePowell.jpg" x="100" y="100" width="400" height="300"/> Transformationen Translate: <use xlink:href="#square" transform="translate(100, 100)"/> Scaling: <use xlink:href="#square" transform="scale(2)"/> Rotation (im Uhrzeigersinn, x, y): <use xlink:href="#square" transform="rotate(-45,50,50)"/> Nacheinander hinten zuerst ausgeführt: <use xlink:href="#square" transform= "rotate(-45, 50, 50) translate(0,100)" zuerst Traslation SVG in HTML <object type="image/svg+xml" data="Cat6.svg" width="1200" height="800"> </object> Animation Elemente auf zu animierendes Element Animate animateColor animateTransform animateMotion Im Animations-Element spezifiziert man die zu animierenden Attribute den Bereich Timing Endwert Animate: <ellipse ry=”5” …> <animate id="close" attributeName="ry" from="5" to="0" begin="nose.click" dur="0.5s" repeatCount="7" fill="freeze"/> </ellipse> AnimateColor: <circle …> <animateColor id="toGreen" attributeName="fill" from="blue" to="green" begin=“close.end" dur="1s" repeatCount="7" fill="remove"/> </circle> AnimateTransform: <animateTransform attributeName="transform" type="rotate" from="20,70,95" to="-20,70,95" begin="toGreen.begin+7s" dur="1s" repeatCount="7" fill="freeze"/> Webservice - - Definition: Ein Web Service ist eine Funktion (Prozedur,Methode, Teil der Geschäftslogik), die via Internet-Technologien zugegriffen werden kann Zweck: Interoperation zwischen Maschinen Schnittstelle beschrieben in maschinenlesbarer Form Nachrichtenaustausch über SOAP (unabhängig von Transportprotokoll, und implementierung Java/.NET) Transportiert via http oder andere Web Protokolle (FTP,SMTP) Meistens XML kodierte Nachrichten WSDL: Web Service Description Language: Schnittstellenbeschreibung SOAP Simple Object Access Protocol SOAP: Definiert Standard-Format für - - Architektur - Service Anbieter (Server): bietet und beschreibt Dienst, registriert Transport von XML über HTTP; SMTP, FTP, ist erweiterbar (Auth, Sicherheit etc.) WSDL: Beschreibt die Schnittstelle (Ein/Ausgabe Params , Protokollbindung) UDDI: Universal Description, Discovery and Integration (Weltweites) Verzeichnis von registrierten Services (Nach Kriterien suchbar) allenfals in Verzeichnis - - Service Verzeichnis: ermöglicht Finden,Eintragen in Service Service Konsument (Client): benutzt Dienste, sucht diese im Verzeichnis, stellt Verbindung mit Service her Vorteile: - Unäbhängig Programmiersprache/Laufzeitumgebung, OS Baut auf bestehender Internetinfrastruktur auf Standardisiert Weit unterstützt Nachteile: - Performance (wegen XML) Gremien bestehen aus Vertretern mit eigenen Interessen Standards zu komplex Erweiterbarkeit führt zu Interoperabilität Funktionsweise - Verschiedene Meldungsaustauschmuster: oneway, request-response Interaktionsmodelle - - One Way: SOAP/SMTP nur ein Weg Request-Response: SOAP/http synchrone Kommunikation Server antwortet Solicit Rsponse: SOAP/SMTP Asynchrone Kommunikation, keine Bestätigungen Notification: POP3 Benachrichtigung vom Service SOAP Meldungen http-Header: - - POST: fast immer POST HOST: Zielmaschine SOAPAction: für Routing und Dispatching von SOAP Meldungen mit ““ direkt Endpunkt Envelope - Ns: http://schemas.xmlsoap.org/soap/envelope/ - Beinhaltet Header(optional), Body und bei Fehlern im Body noch fault (faultcode, faultString) Header - - Anwendungsspezifishce Informationen (Auth, Transaktionssteuerung) Ermöglicht piggybacking von Metainformatinen (info über Daten) http-Aufruf: GET: Einschränkung auf einfache Aufrufe (keine Strukturierten Daten) Aufruf httpkodiert Response: xml-kodiert Body - Eigentliche Daten - Frei wählbar wellformed (meist durch Schema) Datenformat im Body http://localhost/time/TimeService.asmx/GetTime? shortForm=true - POST: Datenteil des post enthält SOAP Anfrage keine Einschränkungen NachrichtenFormat: Dokument Übermittlung oder Aufruf von Funktion Document: Methodenname nicht Teil der Meldung rpc: Methodenname teil der Meldung Kodierung heute literal - Literal: Daten nach XML-Schema kodiert, Vorteil validierung, Nachteil: nicht Baumstrukturen komplex - encoded: Daten nach SOAP Regeln kodiert Kombinationen: rpc/literal Java document/literal meisten verwendet, läuft am besten rpc/encoded früher oft gebraucht Serialisierung Datentypen - - Siehe Folien (meistens genau gleich) Einfache Typen: VariblenName = Elementname, Wert = ElementInhalt, Typ durch Schema definiert Single Refernce: einfach eingebettet (verschachtelt) Multi Reference: Objekt mit id und die anderen referenzieren über href=“#id“ auf das Element WSDL ist eine IDL siehe genaues Folien - Von Mensch lesbar - Von Maschine lesbar Implementierungsrumpf - Version 1.0 seit 2001 2.0 Recommendation (Umbenennung PortEndpoint, Definition description, eliminiert message) - Beschreibt: Service Interface (Datentypen, Aufbau Nachricht, Operationen) und Service Implementation (Protokolle für Operation, Adressen für Webservice) Konkrete Implementierung Java Stubs eines Webservice erzeugen (Kommandozeile): wsimport -d . –keep -p com.javatutor.insel.ws.gen.chrisws http://localhost:8081/services?wsdl -d . aktuelles Directory Package WebServiceWSDL URL Clientseitige Verwendung (alternative dll): CalculatorService service = new CalculatorService(); Calculator calc = service.getCalculatorEndPoint(); double d = calc.add(4,5); Server: Webservice erstellen seit 1.6 mit annotations package com.javatutor.insel.ws; import javax.jws.*; import javax.jws.soap.*; @WebService(name="BmiWebServices") @SOAPBinding(style = SOAPBinding.Style.RPC) //DOCUMENT public class MyBmiWeb { @WebMethod(operationName=”hello”) //name optional public String hello( String name ) { return "Hello " + name + "!"; } @WebMethod(operationName="body-massindex") @WebResult(name = "your-bmi") public double bmi( @WebParam(name="height") double height, @WebParam(name="weight") double weight ) { double bmi = weight / (height * height) * 10000; System.out.println(this.getClass().getSimpleName()+" called:"+height+ " "+weight+" "+bmi); return bmi; } } Kommandozeile: Webservice erzeugen: wsgen -r . -extension -wsdl:Xsoap1.2 -cp . -keep timerservice.Timer -r . : resourcenfiles wsdl version Klasse xQuery – (XML und Datenbanken) Vorteile XML - Portabilität: Unicode Verschiedene Verarbeitungsmöglickeiten XSLT, DOM, SAX Trasfer über Netzwerk (Text) Nachteile XML - Speicherung nicht standardisiert (ausser Datei) Mehrere Arten der Beschreibung, XSD, DTD Grad der Strukturierung Speicher und Rechenleistungsbedarf Vergleich XML – RDBMs: Drei-Ebenen-Modell - Konzeptionelle Ebene: Datentypen z.B. ERM, Schema Logische Ebene: Dateninhalte z.B.Relationenmodell, XML Dokument/Element - Physische Ebene: Datenspeicherung Klassifikation von XML-Dokumenten - Strukturierte Daten (alles schön in Elementen)relationale DB speichern Semistrukturiert: Generische Speicherung Unstrukturiert (Mixed Content): Dateien speichern XML - einfach-hierarchische Struktur (Baum) - Knoten haben Elemente und Attribute - Elemente können eingebettet sein - Elemente habe Reihenfolge - Schema ist optional - direkte Speicherung/Abfrage von einfachen Dokumenten - Abfrage basierend auf XML Standard RDBMS - Daten in mehreren Tabellen - Zellen haben einzelnen Wert - Atomare Zellen Inhalte - Kolonnen/Zeilen Reihenfolge undefiniert - Schema ist vorgeschrieben - Joins für die Abfrage von einfachen Dokumenten (bei normalisierten Daten) - Abfrage mittels SQL Speicherung von XML Dokumenten Als ganzes CLOB Generierung XML aus DB - Vollständige Abbildung - Abbildung von Abfrageergebnissen - Individuelle Transformationen Volltext- XML-Index unstrukturiert + semiunstruk. - Volltextindex oder Volltext- XML-Index Dokumentstruktur Abbildung Graphstruktur oder DOM Speicherung - Strukturiert vollständiges Mapping Volltext-Index unstrukturierte - Zusätzlich XML-Markup auswertbar XPath/Query Abbildung Graphenstruktur - Struktur und Inhalt in DB gespeichert Generishce Speicherung Verwendet Relationen zur Speicherung von Elementen und Attributen DOM-Speicherung Excelon Vollständiges Mapping - Schema DTD wird gebraucht Benutzerdefinites Mapping Hybrid-Verfahren - Struktur Teilen und bestes nehmen XQuery - - Erweitertes XPath basiert auf Version 2.0 ähnelt SQL viele Datenbankhesteller haben Unterwstützung angekündigt FLWR-Ausdruck: for –let, where, return Variablen mit $ Konzeptbedingt kein JOIN wie in SQL Syntax for $var in expr [, $var in expr ...] let $var := expr [, $var := expr ...] where expr return expr Berechnete Werte return <hotel name="{$h/@name}"> Bedingte Anweisung if (Bedingung) then <...> else <...> if ($h/foto) then return <hotel name= {$h/@name} foto = {$h/phot/@href} /> Some Every [some ¦ every] var in expr-1 satisfies expr-2 for $h in document("hotels.xml")//hotel where some $z in $hotel/zimmmer/typ satisfies $z = "EZ" return <hotel name= {$h/@name}/> Sortierung where ... order by expr ID, IDREF for $h in document("hotels.xml")//hotel return <hotel name= {$h/@name}>{id($h/@adrID)/addresse}</hotel> Glossar Element Typ Element Element Content Character Content Attributname Attributvalue Well-formed Tagname Das ganze Konstrukt von Tag bis Schlusstag <element></element> Alles was innerhalb des Tags ist. Nur Text als Element Content attributname=“attributvalue“ attributname=“attributvalue“ Syntax Korrekt, aber entspricht noch nicht dem Schema valid