Post on 14-Jun-2015
Leukere documenten dankzij DTD en schema
Diederik Gerth van Wijk
XML Holland 2005
Papendal, 23 november
2005 - CountryDiederik Gerth van Wijk 2
Leukere documenten dankzij DTD en schema
Wat maakt een document leuk?
Wat zijn schema’s?
Wie gebruikt schema’s?
Wat voor soorten schema’s zijn er?
Hoe maak je een schema?
Moet je zelf wel een schema maken?
Hoe beheer je schema’s?
The DTD to end all DTDs
2005 - CountryDiederik Gerth van Wijk 3
Wat maakt een document leuk?
Een leuk document is— leuk om te schrijven
— leuk om te lezen
“leuk” = “goedkoop”, “gemakkelijk”, “correct”, “consequent”, “voorspelbaar”, “informatief”
Schrijven / Lezen:—Een database die moet uitwisselen met een andere database
—Een programma dat een verslag maakt / een mens die de fouten leest, een programma dat statistieken bijwerkt
—Een auteur die in Word® een document tikt / een mens die PDF leest
—Een auteur die in XMetal een XML-document tikt / een mens die een site leest
—Een conversie- of transformatieprogramma (leest en schrijft)
XML-documenten zijn er om automatisch verwerkt te worden
Markup zonder processing is waardeloos
2005 - CountryDiederik Gerth van Wijk 4
Een voorbeeld
ZinHet is verbazend hoe moeilijk het is een voorbeeld te vinden van
eentijdschrift waarvan de artikelen alleen uit alinea’s bestaan, zonder paragrafen dus.
Vandaar dat ik nu een verzonnen voorbeeld moet tikken, dat u dan ook niet op www.kluwer.nl vindt.
ArtikelTitel
Alineanadruk
href
2005 - CountryDiederik Gerth van Wijk 5
Voorbeeld (2)
<artikel><titel>Zin</titel><alinea>Het is verbazend hoe moeilijk het is een voorbeeld te vinden van een tijdschrift waarvan de artikelen alleen uit alinea’s bestaan, zonder paragrafen dus.</alinea><alinea>Vandaar dat ik nu een <nadruk>verzonnen</nadruk> voorbeeld moet tikken, dat u dan ook niet op <href uri=”http://www.kluwer.nl”>www.kluwer.nl</href> vindt.</alinea></artikel>
2005 - CountryDiederik Gerth van Wijk 6
Wat zijn schema’s?
Een schema beschrijft waar documenten van een bepaald type aan moeten voldoen
Hulpmiddel om leuke documenten van nare te scheiden (valideren, parseren, redigeren)
Voegt informatie over het document toe die niet in het document staat of zelfs kan staan
Een goed schema heeft een formeel deel, voor machinale validatie
Een goed schema heeft een informeel deel, voor mensen!
De verzameling valide documenten wordt bepaald door wat verwerkt kan worden
De verzameling valide documenten volgens het informele deel is een piepkleine deelverzameling van de verzameling valide documenten volgens het formele deel!
2005 - CountryDiederik Gerth van Wijk 7
Wie gebruikt schema’s?
De redacteur die een auteur moet instrueren
De beheerder die een XML-editor moet inrichten
Die XML-editor
De programmeur die een conversiescript van RTF naar XML schrijft
De zetter die een PDF moet maken van XML
De webmaster die een site moet vullen
De parser die een PSVI op moet leveren voor XPath 2.0 / XSLT 2.0
2005 - CountryDiederik Gerth van Wijk 8
Een PSVI???????
Post Schema Validation Infoset
Vertelt van attributen en eenvoudige elementen wat hun datatype is<x>3e2</x> < <y>4</y>
Vertelt van attributen en elementen van welk type (class) ze zijn
En XSLT 2.0 en XPath 2.0 kunnen daar dan wat mee
2005 - CountryDiederik Gerth van Wijk 9
Van tikken of database via XML naar PDF, web, database
2005 - CountryDiederik Gerth van Wijk 10
Wat staat er in een schema?
Een lijst van benoemde elementen en attributen
Datatypen en andere aanwijzingen over de semantiek
Verplicht, een of meer keer
Binnen welke elementen
In welke volgorde
Extra restricties (bijv. elke rij even veel kolommen)
Omschrijving van gedacht gebruik:—“De <titel> van kort samen waar zijn moeder-element over gaat, op
een manier die ook buiten zijn context, bijvoorbeeld in een inhoudsopgave of een hitlist begrijpelijk is.”
—“Omdat een titel hergebruikt moet kunnen worden in een contekst waar tabellen en voetnoten niet op de normale wijze verwerkt kunnen worden, worden deze ontraden in een titel.”
—“Een titel is herkenbaar door korps, lettertype en/of zwaarte”
2005 - CountryDiederik Gerth van Wijk 11
Wat voor soorten schema’s zijn er?
SGML DTD: <!ELEMENT artikel o o (titel, alinea+)> XML DTD: <!ELEMENT artikel (titel, alinea+)> XML Schema: <xs:element name="artikel">
<xs:complexType>
<xs:sequence>
<xs:element ref="titel"/>
<xs:element maxOccurs="unbounded" ref="alinea"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Relax NG: element artikel { titel, alinea+ }
Schematron
Examplotron
XSLT
CSS
FOSI
2005 - CountryDiederik Gerth van Wijk 12
DTD’s
Standaard in SGML en XML “meegebakken”
SGML kent meer (maar irrelevante) datatypen en opties dan XML
In SGML kan de volgorde van verplichte elementen willekeurig zijn, in XML-DTD’s niet (andere schematalen wel)
Document kan zelf de DTD aanpassen via parameter-entiteiten
DTD kan algemene (en in SGML ook systeem-)entiteiten specificeren
DTD kan verstekwaarden van attributen bepalen
Eigen notatie, die van documenten afwijkt
Uit document-wereld: —mixed content belangrijk—data in elementen bestemd voor mensen—data in attributen bestemd voor machines (metadata)
2005 - CountryDiederik Gerth van Wijk 13
Voorbeeld DTD
<!-- artikel1.dtd, dtd voor artikelen --><!-- root-element: artikel --><!-- typische aanroep:<!DOCTYPE artikel PUBLIC '-//MijnBV//DTD artikel v1//NL‘ 'artikel1.dtd'>--><!-- (c) copyright 2005 Diederik Gerth van Wijk --><!-- versie 1.0, 2005-11-22 -->
<!-- verwijzingen mogen geen verwijzingen bevatten, wel nadruk etc --><!ENTITY % lopendetekstzondervw "#PCDATA | nadruk"><!ENTITY % verwijzingen "| href"><!ENTITY % lopendetekst "%lopendetekstzondervw; %verwijzingen;"><!ENTITY % bloktekst "%lopendetekst;"><!ENTITY % URItype "CDATA">
<!ELEMENT artikel (titel, alinea+)>
<!ELEMENT titel (%lopendetekst;)*>
<!ELEMENT alinea (%bloktekst;)*>
<!ELEMENT nadruk (%lopendetekst;)*>
<!ELEMENT href (%lopendetekstzondervw;)*><!ATTLIST href uri %URItype; #REQUIRED>
2005 - CountryDiederik Gerth van Wijk 14
W3C XML Schema
Vanuit datawereld
Nadruk op eenvoudige attributen en elementen, niet op mixed content
Veel ingebouwde datatypes (deel 2)
Mogelijkheid voor ontwikkelen nieuwe datatypes
Objectgeöriënteerd
Elementen en attributen kunnen van bepaald type zijn
XPath 2.0 en XSLT 2.0 kunnen op dat type werken
Types zitten alleen in het schema, niet in het document
Aanval op well formed documenten die stand alone verwerkbaar zijn
2005 - CountryDiederik Gerth van Wijk 15
Voorbeeld W3C XML Schema (1)
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema“ elementFormDefault="qualified">
<xs:group name="lopendetekstzondervw"> <xs:sequence> <xs:element minOccurs="0" ref="nadruk"/> </xs:sequence> </xs:group> <xs:element name="verwijzingen" abstract="true"> <xs:complexType mixed="true"> <xs:group minOccurs="0" maxOccurs="unbounded" ref="lopendetekstzondervw"/> <xs:attribute name="uri" use="required" type="URItype"/> </xs:complexType> </xs:element> <xs:group name="lopendetekst"> <xs:choice> <xs:group ref="lopendetekstzondervw"/> <xs:element ref="verwijzingen"/> </xs:choice> </xs:group> <xs:group name="bloktekst"> <xs:sequence> <xs:group ref="lopendetekst"/> </xs:sequence> </xs:group> <xs:simpleType name="URItype"><xs:restriction base="xs:string"/></xs:simpleType>
2005 - CountryDiederik Gerth van Wijk 16
Voorbeeld W3C XML Schema (2)
<xs:element name="artikel"> <xs:complexType> <xs:sequence> <xs:element ref="titel"/> <xs:element maxOccurs="unbounded" ref="alinea"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="titel"> <xs:complexType mixed="true"> <xs:group minOccurs="0" maxOccurs="unbounded" ref="lopendetekst"/> </xs:complexType> </xs:element> <xs:element name="alinea"> <xs:complexType mixed="true"> <xs:group minOccurs="0" maxOccurs="unbounded" ref="bloktekst"/> </xs:complexType> </xs:element> <xs:element name="nadruk"> <xs:complexType mixed="true"> <xs:group minOccurs="0" maxOccurs="unbounded" ref="lopendetekst"/> </xs:complexType> </xs:element> <xs:element name="href" substitutionGroup="verwijzingen"/></xs:schema>
2005 - CountryDiederik Gerth van Wijk 17
Relax NG
Relax + Trex = Relax NG
Op reguliere expressies (patronen) gebaseerd
Zelfde, zo niet meer zeggingskracht als XML Schema
Types heten nu “patronen”
Twee notaties:—Voluit—Compact
Gebruikt Datatypen van W3C XML Schema (deel 2)
2005 - CountryDiederik Gerth van Wijk 18
Voorbeeld Relax NG XML-notatie (1)
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary=""> <define name="lopendetekstzondervw"><choice><text/><ref
name="nadruk"/></choice></define> <define name="verwijzingen"><ref name="href"/></define> <define name="lopendetekst"> <choice><ref name="lopendetekstzondervw"/><ref name="verwijzingen"/></choice> </define> <define name="bloktekst"><ref name="lopendetekst"/></define> <define name="URItype"><data type="string"/></define> <define name="artikel"> <element name="artikel"> <ref name="titel"/> <oneOrMore> <ref name="alinea"/> </oneOrMore> </element> </define> <define name="titel"> <element name="titel"><zeroOrMore><ref
name="lopendetekst"/></zeroOrMore></element> </define> <define name="alinea"> <element name="alinea"><zeroOrMore><ref name="bloktekst"/></zeroOrMore></element> </define>
2005 - CountryDiederik Gerth van Wijk 19
Voorbeeld Relax NG XML-notatie (2)
<define name="nadruk"> <element name="nadruk"> <zeroOrMore><ref name="lopendetekst"/></zeroOrMore> </element> </define>
<define name="href"> <element name="href">
<ref name="attlist.href"/> <zeroOrMore> <ref name="lopendetekstzondervw"/> </zeroOrMore> </element> </define> <define name="attlist.href" combine="interleave"> <attribute name="uri"> <ref name="URItype"/> </attribute> </define>
<start> <choice> <ref name="artikel"/> </choice> </start></grammar>
2005 - CountryDiederik Gerth van Wijk 20
Voorbeeld Relax NG Compacte notatie
# artikel1.rnc, Relax NG schema voor artikelen# (c) copyright 2005 Diederik Gerth van Wijk# versie 1.0, 2005-11-22# verwijzingen mogen geen verwijzingen bevatten, wel nadruk etc
lopendetekstzondervw = text | nadrukverwijzingen = hreflopendetekst = lopendetekstzondervw | verwijzingenbloktekst = lopendetekstURItype = string
artikel = element artikel { titel, alinea+ }
titel = element titel { lopendetekst* }
alinea = element alinea { bloktekst* }
nadruk = element nadruk {lopendetekst* }
href = element href { attlist.href, lopendetekstzondervw* }attlist.href &= attribute uri { URItype }
start = artikel
2005 - CountryDiederik Gerth van Wijk 21
Hoe maak je een schema?
Documentanalyse is data-analyse: 1-op-n, n-op-n relaties
Praat met gebruikers
Stel de granulariteit vast: de kleinste dingen die een effect moeten hebben
Vind uit hoe die genoemd worden, of iedereen ze zo noemt
Verplicht wat nodig is
Maar niet wat onmogelijk is
Verbied alleen wat fataal is
Bedenk dat voor elke stap in het proces een ander schema handiger kan zijn: speel met content models, pas content model algebra toe
Documenteer
Markeer alleen wat verwerkt kan worden!
2005 - CountryDiederik Gerth van Wijk 22
Hoe maak je een schema (2)
Maak voorbeelddocumenten
Maak stijlbladen om die te kunnen verwerken
Genereer aan de hand van de voorbeelden een schema en pas dat aan
Wees niet te strak, want dan moet je te vaak verruimen
Generaliseer: of je nu veel of heel veel te ruim bent is niet relevant
Wees consequent: —als a in x optioneel is, waarom niet in y ook?—als a in x voor b komt en in y erna, is dat dan echt de bedoeling?
De volgordeparadox:—Als de volgorde niet belangrijk is, kan hij beter vast zijn—Als de volgorde belangrijk is, moet hij vrij zijn—Als de volgorde echt belangrijk is: moet er dan niet een doosje rond?
2005 - CountryDiederik Gerth van Wijk 23
Hoe maak je een schema (3)
Je codeert om te verwerken
Maar documenten worden hergebruikt, en bij elk gebruik kan een andere verwerking nodig zijn
Dus je codeert geen verwerkingsinstructies, maar inhoud:
Vorm is een functie van inhoud en stijlblad
Maar het is een illusie dat je codeert wat “is”
Je codeert geen volzinnen, tenzij je een taalkundige applicatie wilt maken; je codeert alinea’s, omdat het enige dat je wilt een nieuwe regel is
“U dacht”, schreef hij smalend, “dat een volzin altijd in een XML-boom te vangen was?”.
2005 - CountryDiederik Gerth van Wijk 24
Hoe maak je een schema (4)
Tel als een kind: 0, 1, veel:(titel, auteur*, alinea+)(titel, (auteur, (auteur, auteur?)?)?, alinea, alinea+)
Herhaalbare of optionele sequentie is slecht teken:(titel, ((alinea+) | (auteur+, ((alinea+, paragraaf*) | paragraaf+))))(term, definitie)+maak twee elementen, of geef die groep een naam!
Vermijd dat een kind meer dan eens genoemd wordt
2005 - CountryDiederik Gerth van Wijk 25
Moet je zelf wel een schema maken?
Voor uitwisseling van data: alleen als je een consortium bent
Voor opslag van documenten: niet als die 13 in een dozijn zijn
Maar als ze een USP vormen, met jouw extra slimme dingen: ja
Maar:—Baseer je op bestaande schema’s: XHTML, DocBook, TEI, ISO 12083,
AAP, CALS, Ditta—Laat weg wat voor jou irrelevant is—Vertaal eventueel 1-op-1 naar Nederlands—Al was het maar de documentatie—Voeg toe wat voor jou nodig is—Pas de convertors, editor, transformaties naar HTML en PDF aan
2005 - CountryDiederik Gerth van Wijk 26
Hoe beheer je schema’s?
Markeer wat je kunt verwerken
Beschrijf van elk element wat de betekenis is, welke klasse het is, of het typisch verplicht is, en herhaalbaar, wat het typische gedrag is, zijn content
Beschrijf van elke klasse of zijn leden in een volgorde staan, of vrije volgorde hebben, wat de typische content is
Bepaal of je in- en uitschakelbare opties wilt, en welke
Zet je schakelaars
Genereer aan de hand daarvan je schema’s, CSS, FOSI’s, xslt-scripts
Als de verzameling valide documenten volgens het nieuwe schema een deelverzameling van de oude is, is dat een verstrakking
Verstrakkingen: naar voor bestaande content, soms voor applicaties
Verruimingen: oude content mogelijk inconsistent, applicaties aanpassen
2005 - CountryDiederik Gerth van Wijk 27
Bottom Up Constraint Language (vapourware!)
2005 - CountryDiederik Gerth van Wijk 28
The DTD to end all DTDs
<!DOCTYPE ding [
<!ELEMENT ding (#PCDATA | ding)*>
<!ATTLIST ding
aard (element | attribuut | pi | commentaar | entiteit | CDsectie) element
naam CDATA #IMPLIED>
]>
<ding naam=“artikel”><ding naam=“titel”>Zin</ding><ding naam=“alinea”>Het is verbazend hoe moeilijk het is een voorbeeld te vinden van een tijdschrift waarvan de artikelen alleen uit alinea’s bestaan, zonder paragrafen dus.</ding><ding naam=“alinea”>Vandaar dat ik nu een <ding naam=“nadruk”>verzonnen</ding> voorbeeld moet tikken, dat u dan ook niet op <ding naam=“href”><ding naam=“uri” aard=“attribuut”>http://www.kluwer.nl</ding>www.kluwer.nl</ding>vindt.</ding>
</ding>
2005 - CountryDiederik Gerth van Wijk 29
Was dat een grapje?
Nee: naar en van die DTD is elk XML-document zonder verlies van informatie volautomatisch te verwerken
Toch voel je aan je water dat het niet lekker werkt
Want het gebruikt XML niet op de manier waarop het bedoeld is:—Voor mensen leesbare tekst als data in inhoudelijk benoemde
elementen—Metadata in attributen
Maar is een rode auto een <rode-auto> of een <auto kleur=“rood”> ?
Of een <auto type=“brandweer”>? Of <brandweerauto klasse=“auto”>?
Stijlbladen en editors zijn makkelijker op elementen dan op attributen in te richten
2005 - CountryDiederik Gerth van Wijk 30
Praktijkvoorbeelden
Tabellen
Voetnoten
Opsommingen
Naam
2005 - CountryDiederik Gerth van Wijk 31
Vragen?
Stel ze nu....
.... of mail dgerth@kluwer.nl
En lees ook:—www.w3.org (XML DTD, XML Schema)—www.dsdl.org (Relax NG, Schematron, SGML DTD)—www.oasis-open.org (Relax NG, CALS tables, DocBook, DITA)—Eric van der Vlist, Relax NG, O’Reilly—Eric van der Vlist, XML Schema, O’Reilly—Norman Walsh & Leonard Muellner, DocBook, O’Reilly—Maler & El Andaloussi, Developing SGML DTD’s, Prentice Hall—David Megginson, Structuring XML Documents, Prentice Hall