XML & XSLT voor DMO Datamodellering 2008 1/24 Een XML datamodel Datamodelleren conceptueel model logisch / fysiek model: platform afhankelijk Logisch-fysieke model voor XML-platform = XML schema, b.v.: 1. DTD 2. W3C schema Schema een ruim begrip! (zie Møller, p. 96) 2/28 Van ERD naar XML schema Entitytype (in de regel) XML element Attributen attributen van een XML element of ook elementen Vergelijk nu constructies in: XML DTD XML Schema Herhaling stof UWT alleen in hoofdpunten! 3/28 DMO 2008 1
Elementen in DTD Elementen in een DTD (zie Møller, p. 98 e.v.) <!ELEMENT naam content model> b.v. <!ELEMENT book (title, author)> content model EMPTY ANY #PCDATA,? * + bijzonder: mixed content model (#PCDATA e1 e 2 e n )* 4/28 XML entities Built-in entities: < > & ' " <title>"computer Science "</title> Internal parsed entities b.v. <!ENTITY cs ComputerScience > <title>the department of &cs;</title> Parameter entities zie volgende slides 5/28 Gebruik entities <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE test [ <!ELEMENT test (title)> <!ELEMENT title (#PCDATA)> <!ENTITY cs "ComputerScience"> ]> <test> <title>" &cs; "</title> </test> 6/28 DMO 2008 2
Parameter entity Parameter entity is een macro in een DTD: <!ENTITY % naam " "> (zie Møller, p. 107) Voorbeeld: <!ENTITY % p "(#PCDATA)"> <!ELEMENT firstname %p;> <!ELEMENT surname %p;> 7/28 Attributen in DTD Attributen in een DTD (zie Møller, p. 101 e.v.) <!ATTLIST element-naam att-defs> vb.: <!ATTLIST box length CDATA 0 > attribuut-definitie: types, b.v.: CDATA, NAMETOKEN, ID, IDREF attribute modifiers: #REQUIRED, #IMPLIED, #FIXED enumeration, b.v.: <!ATTLIST person sex (male female) #REQUIRED> 8/28 DTD versus DDL van SQL DTD: gebrekkige attribuut-definitie nauwelijks domein constraints gebrekkige referentiële integriteit (ID-IDREF werkt alleen binnen een document) SQL: scala aan datatypes domein constraints goede referentiële integriteit Wil je méér in XML W3C schema 9/28 DMO 2008 3
XML schema Logisch/fysiek datamodel met veel meer mogelijkheden dan een DTD: geschreven in XML altijd extern meer datatypes namespace aware nauwkeurige definitie van structuur (volgorde, maar ook aantal child elements) 10/28 Elementen in XML schema Simple type alleen tekst (geen attributen) <xs:element name="lastname" type="xs:string"/> Complex type bevat andere elementen en/of attributen, b.v.: <xs:element name="employee"> <xs:complextype> <xs:sequence> <xs:elementname="firstname type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complextype> </xs:element> 11/28 Attributen in XML schema Gedeclareerd als simple types <xs:attribute name="xxx" type="yyy"/> Voorbeeld: <xs:attribute name="lang" type="xs:string" use="required"/> Uitgebreide lijst van primitive simple types (zie Møller, p. 120): string, boolean, decimal, datetime, etc. 12/28 DMO 2008 4
Element met attribuut B.v. een US-adres: <xsd:complextype name="usaddress" > <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="street" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="state" type="xsd:string"/> <xsd:element name="zip" type="xsd:decimal"/> </xsd:sequence> <xsd:attribute name="country" type="xsd:nmtoken" fixed="us"/> </xsd:complextype> 13/28 Content model DTD vs. Schema DTD, ANY + * mixed content parameter entity NULL XML schema <sequence> <choice> <any> <all> maxoccurs/minoccurs mixed= true <group>, ref-attribute nillable= true 14/28 Mixed content Voornaam, achternaam (in willekeurige volgorde) plus tekst: <xs:complextype name="persname" mixed="true"> <xs:all> <xs:element name="firstname" type="xs:token"/> <xs:element name="familyname" type="xs:token"/> </xs:all> </xs:complextype> 15/28 DMO 2008 5
Domeindefinitie XML schema (1) Restricties op content door een primitive simple type in te perken via facets: <xs:element name="car"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:enumeration value="audi"/> <xs:enumeration value="golf"/> <xs:enumeration value="bmw"/> </xs:restriction> </xs:simpletype> </xs:element> 16/28 Domeindefinitie XML schema (2) Restricties op content door een primitive simpel type in te perken via een pattern facet: <xs:element name="initials"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:pattern value="[a-z][a-z][a-z]"/> </xs:restriction> </xs:simpletype> </xs:element> 17/28 Data retrieval in XML XSLT met Xpath Xquery (b.v. in XML database) In al deze gevallen: navigeren ( setoperaties in SQL) Vereist kennis van de opslagstructuur de werking van een een XSLT processor de XML inputtekst 18/28 DMO 2008 6
XML document tree <?xml version="1.0"?> root node <!-- Dee-licious! --> <sandwich xmlns="http://www.food.org/ns"> <ingredient type="grape"> jelly</ingredient> <ingredient> <?spread thickly?> peanut-butter </ingredient> <ingredient> bread <!-- white bread, preferably --> </ingredient> </sandwich> root element 19/28 Nodes in de XSLT-boom Root node (= document node) een onzichtbaar punt boven het root element Element correspondeert met element in XML document Attribute correspondeert met een attribuut van een element in een XML document heeft een element als parent, maar wordt niet als een gewoon child behandeld in XSLT Text de tekstuele inhoud van het document Comment Processing instruction Namespace 20/28 Van boom tot boom Style sheet Stylesheet tree Source tree Result Tree Source document Result Document Transformatie proces 21/28 DMO 2008 7
Template rules De transformatie is op te vatten als een reis door de input-boom, waarbij stapsgewijs de output-boom wordt opgebouwd XSLT-instructies sturen dit proces = toepassen van: template rules specificeren de transformaties expliciet in de XSLT-file of built-in in de XSLT-processor bestaan twee delen: een actie een pattern (het match-attribute) op welk deel van de input-boom de actie moet worden toegepast Voorbeeld: <xsl:template name="booklist" match="booklist"> 22/28 Default situatie Schrijven we geen uitvoerige template rules, dan toch output. Voorbeeld: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform "version="1.0"> <xsl:template name="basic"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet> dit doorloopt de hele input tree (depth first) en geeft alle text weer 23/28 Sturing template-gebruik <xsl:apply-templates/> <xsl:apply-templates select=""/> <xsl:for-each select=""/> in combinatie met: <xsl:call-template name=""/> of: <xsl:call-template name=""> <xsl:with-param name=""> value </xsl:with-param> </xsl:call-template> 24/28 DMO 2008 8
Wanneer welke stijl? Globale vuistregel: <apply templates> wanneer het voorkomen van elementen betrekkelijk onvoorspelbaar is b.v. bold, italic, afbeeldigen in tekst etc. <for-each> wanneer er een regelmatige, bekende datastructuur is b.v. een databaserecord-structuur of vaste volgorde van hoofdstukken, secties, etc. 25/28 Parameters - 1 XSLT-templates kunnen parameters hebben: <xsl:template name="calcarea" <xsl:param name="width"/> <xsl:param name="height"/> <xsl:value-of select="$width * $height"/> </xsl:template> Gebruik: <xsl:call-template name="calcarea"> <xsl:with-param name="width">5</xsl:with-param> <xsl:with-param name="height" select="7"/> </xsl:call-template> 26/28 Parameters - 2 Parameters kunnen ook globaal zijn voor het hele XSLT-programma. Dan is <xsl:param> een top-level element. Zij zijn vergelijkbaar met een XSLTvariabelen. Default waarde via select-attribuut of via template content. Voorbeelden: <xsl:param name="naam" select="expression"/> <xsl:param name="naam">value</xsl:param> 27/28 DMO 2008 9
Oefening: maak DTD <onderwijs <docenten> <docent doc-id="p1"> <voornaam>jan</voornaam> <tussen>van den</tussen> <achternaam>broek</achternaam> <expertise>logica</expertise> </docent> <docent doc-id="p6"> <voornaam>piet</voornaam> <achternaam>jansen</achternaam> <expertise>logica</expertise> </docent> <docent doc-id="p12"> <voornaam>koos</voornaam> <tussen>de</tussen> <achternaam>boer</achternaam> <expertise>engels</expertise> </docent> </docenten> <onderwijsaanbod> <cursus cur-id="c1" doc-id="p1"> <cnaam>databases</cnaam> <periode>1</periode> </cursus> <cursus cur-id="c2" doc-id="p1"> <cnaam>logica</cnaam> <periode>2</periode> </cursus> <cursus cur-id="c3" doc-id="p6"> <cnaam>nederlands</naam> <periode>2</periode> </cursus> </onderwijsaanbod> </onderwijs> 28/28 DMO 2008 10