XML & spol. ########### Úvod do XML =========== Historie -------- - speciální řídící sekvence pro osvitové jednotky (60. léta) -> obecné příkazy + konvertory -> TeX (70. léta) - zaměřeno na tisk dokumentu - pro elektronické zpracování dokumentů potřeba logické struktury, význam označených částí dokumentu, forma (vzhled) podřadná -> značkovací jazyk GML (Generalized Markup Language, 80. léta) -> ANSI norma SGML (Standard GML) - metajazyk = jazyk pro vytváření jazyků - SGML příliš obecné a složité -> pro webové stránky (90. léta) jednoduchý jazyk HTML (HyperText Markup Language) - kromě obsahu (znovu) forma -> pevně dané značky spíše pro vzhled dokumentu (stránky), absence struktury dokumentu (pro strojové zpracování a vyhledávání), nekompatibilita a problémy zobrazování prohlížeči, ... - oddělit obsah a formu (styl), strukturovat, standardně -> XML (eXtensible Markup Language) - používaná podmnožina SGML (parametry pevně zvolené, přísná jednoduchá syntaxe) - necelých 10 let historie XML (počátky 1997, první specifikace 1998) eXtensible Markup Language -------------------------- - rozšiřitelný = pevná syntaxe značek pro strukturování dokumentu, ale bez významu značek (sémantiky, narozdíl od HTML), rozšíření o význam značek (jazyky založené na XML) - značkovací = vyznačení struktury dokumentu pomocí značek - jazyk = metajazyk pro vytváření jazyků? - standardní (W3C, World Wide Web Consortium) human readable rozšiřitelný jazyk (formát) pro tvorbu vlastních jazyků (formátů) s jednoduchou syntaxí a snadnou implementací (ve srovnání se SGML) - standardní jazyky založené na XML: XHTML, XSL, XML Schema, XPath, XQuery (rodina XML), SVG, MathML, SOAP, ... (W3C), DocBook, WML, RSS/Atom, XML-RPC, *Office, XUL, Jabber (jiní) Proč právě XML? --------------- - otevřený (nepropriétární), licencemi nezatížený, platformě nezávislý formát pro uchování a zpracování dokumentů a komunikaci - stabilní - vydrží (vydržel) déle než binární proprietární formáty konkrétních aplikací a firem - flexibilní reprezentace čehokoliv (dat. formáty, volání procedur, ...), použitelný ve většině průmyslových odvětví (zejména IT) - mezinárodní (internacionalizace) - od začátku, Unicode (metoda UTF-8 normy ISO 10646) + info o použité znakové sadě -> bezproblémově jakékoliv znaky - jednoznačně rozhodnutelná jednoduchá syntaxe (well-formedness), snadná konverze do jiných (i binárních) formátů - možnost přidat sémantickou informaci a vytvořit tak vlastní formát s vlastnostmi XML, automatická kontrola struktury formátu (validace) - aktivní komunita koordinovaná W3C, open source implementace standardů -> standardní univerzální datový formát Proč ne XML? ------------ - zbytečně upovídané - ano, ale srozumitelné (textové), velikost řeší komprimace - dvojí notace: elementy a atributy - co má být element a co atribut? -> atributy popisují elementy jako základní stavební kameny, věc citu - složité standardy velké rodiny XML - ano, ale není nutné používat všechny, jazyky založené na XML = aplikace XML, nepochopení: ne XSL, XQuery, XPath, ..., ale otevřenost, flexibilita, internacionalizce, ... viz výše - obtížné pro programátory - zpracování časově náročné a náchylné na chyby (hierarchický přístup, oproti tabulkovým řádkům s oddělovači) - neexistující jednotné API - celé do paměti (DOM) nebo nemotorné callback funkce (SAX), ano -> reg. výrazy?, XSLT, DOM+XPath -> proudové zpracování po nalezení elementu (chybí obecné pull rozhraní a navigační jazyk) Svět technologií XML -------------------- - výměna informací v B2B, B2C, jazyky založené na XML - elektronické publikování (po přidání stylu) - univerzální datový formát (pro data i parametry programů) - sémantický web a kontextové vyhledávání - budoucnost? - ,,XML je dnes prostě všude'' - role W3C - koordinátor, standardizátor Syntaxe XML =========== - specifikace XML 1.0 (čtvrtá revize, http://www.w3.org/TR/2006/REC-xml-20060816/) - pro znalce HTML: podobné HTML, ale přísnější - značky (tagy) vymezují elementy, obsah elementu začíná startovacím tagem a povinně končí koncovým tagem nebo prázdný tag obsah - vnořování elementů obsahtext - nekřížení elementů (startovací a koncový tag ve stejném elementu) NE: text - jediný nejvyšší kořenový element - element může mít atributy s hodnotami ve startovacím tagu, hodnoty uvedené v uvozovkách nebo apostrofech (možné vnořit) - jména elementů a atributů podle specifikace: musí začínat písmenem, pak mohou být čísla, tečky, dvojtečky, pomlčky a podtržítka, i diakritika (obecně Unicode znak) - znakové entity pro speciální znaky (<, >, atd.) <, >, &, ", ' - numerické entity pro všechny znaky &, & - case-sensitive, všechny znaky z použité znakové sady (výchozí Unicode) -> syntakticky správný dokument = well-formed dokument Dále: ----- - hlavička (deklarace) s použitou znakovou sadou - komentáře - kdekoliv mezi elementy, nelze zakomentovat atributy elementu NE: /> - sekce CDATA pro větší kusy textu se speciálními znaky (např. kód programovacího jazyka) - instrukce pro zpracování (processing instructions) - připojení stylu, příkazy pro preprocesory, skriptovací jazyky, značky editorů, apod. Jmenné prostory (Name spaces) ----------------------------- - doplněk specifikace XML (http://www.w3.org/TR/REC-xml-names/) - identifikován pomocí URI, specifikován pomocí deklarovaného prefixu - kvalifikovaná jména elementů a atributů pomocí prefixu a lokálního jména -> elementy a atributy v kontextu prostoru - elementy dědí (výchozí) prostor rodičovského elementu - prostor zadáván nejčastěji u kořenového elementu, atributy dědí prostor elementu, ne výchozí - oddíly prostoru pro elementy, globální a lokální atributy (pro element) -> problémy Editory ======= - jakýkoliv textový editor - podpora pro zvýraznění syntaxe, automatické doplnění koncového tagu, kontrolu syntaxe (well-formedness), kontrolu validity a zobrazení přípustných tagů, atributů a hodnot (pokud je dostupné schéma, viz Schémata dále) - žádný, částečný nebo úplný WYSIWYG (skrytí syntaxe jazyka) - př. JEdit, XMLMind, Bluefish, Quanta, GNU/Emacs, Vim, EmEditor, UltraEdit, TextPad, EpicEditor, XMetaL, VS.NET, M$ XML Notepad, Etna XML Editor, , aj. Parsery ======= - programy pro čtení, zpracování a kontrolu XML dokumentu (well-formedness i validace) - většinou příkazová řádka - př. SP (pro SGML, program nsgmls), Expat, Jing, CookXML, TinyXML, aj. - pro programátory: čtení a zápis textových souborů -> standardizovaná rozhraní (API) pro práci s dokumentem implementovaná v knihovnách (parserech) - př. Xerces (Java, C++), JAXP (Java), libxml2 (C, C++), M$ XML parser (C++ COM objekt), .NET System.Xml XmlReader (.NET jazyky), S-XML, XMLisp (Common Lisp) Prohlížeče ========== - webovské prohlížeče - podpora zobrazení pomocí stylu (zobrazovacího nebo transformačního), viz Styly dále API === - standardizovaná rozhraní (API) pro programové čtení, zpracování a kontrolu (well-formedness i validace) XML dokumentů - implementovaná v knihovnách pro většinu prog jazyků (C/C++, Java, .NET/C#, Lisp, Perl, Python, ...) = parser - nabízí abstraktní model dokumentu (infoset) - elementy, atributy, textpvý obsah, atd. - dříve v zásadě dva hlavní, DOM a SAX, dnes více různých přístupů (rozšíření DOMu, pull SAX), částečně neslučitelné (např. DOM a XPath), očekává se DOM3 (integruje XPath) - nevalidující (infoset s textovými hodnotami) a validující mód (infoset oproti schématu s datovými typy) - kromě čtení a zápisu obecná transformace dokumentu (např. do HTML) - XSLT parser SAX (Simple API for XML) ----------------------- - přístup k dokumentu na základě řízení událostí (event-driven přístup) vyvolaných při sekvenčním průchodu dokumentem - rozhraní pro definici callback funkcí (nebo metod objektu handleru) jako reakcí na události vyvolané parserem (začátek, obsah, konec elementu, komentář, atd.) - funkci předány parametry popisující událost (např. jméno elementu) - výhody: rychlost, malá spotřeba paměti - nevýhody: zpracování na jeden průchod, vlastní stavové proměnné v programu, pouze čtení dokumentu! - většinou push přístup (,,tlačí'' události), ale i pull přístup (program ,,si říká'' o části dokumentu) - de facto standard, vzniklo rychle jako reakce na potřebu zpracovávat XML soubory (původně pro Javu) DOM (Document Object Model) --------------------------- - dokument reprezentován jako stromová hierarchie objektů reprezentujících elementy, atributy, textový obsah atd. - celá hierarchie v paměti - obecné rozhraní (funkce) pro procházení a modifikaci dokumentu - výhody: jednoduchý (objektový) náhodný přístup -> editory, prohlížeče, pohodlnější přístup k dokumentu - nevýhody: nižší rychlost, paměťová náročnost - standard W3C, původně jednotný objektový model pro prohlížeče (využití skriptovacím jazyce JavaScript), různé úrovně (0, 1, 2, 3) document.getElementById("elementID") XPath ----- - DOM a SAX komplexní -> zjednodušení práce s XML dokumenty - dotazování na DOM stromem, výběr částí stromu - dotazovací jazyk pro adresaci elementů, aributů i textu pomocí výrazů - použití zejména jinými jazyky založenými na XML (např. XSL) - kompaktní a intuitivní, podobné adresaci souborů v souborovém systému /element//subelement/* - pro vyhodnocení výrazu potřeba kontext = aktuální uzel v hierarchii elementů a sada kontextových uzlů - standard W3C z rodiny XML Data-binding ------------ - v případě validujícího parseru poskytujícího infoset oproti schématu s datovými typy (viz Schémata) - elementy a atributy jako datové struktury programovacího jazyka - automaticky vygenerovaný kód - objektový model Další ----- - dotazovací API, volání XSL transformací, př. TrAX - InfoSet (XML Information Set) - snaha W3C o jednotný datový model, jaké informace jsou v dokumentu?, přišel pozdě Programovací jazyky ------------------- Java .... - nejvíce knihoven (také historický důvod), prověřená řešení - Xerces (DOM, SAX), XP a další - rozhraní JAX (Java API for XML): JAXP (... Processing) - zpracování (DOM, SAX, XSLT), JAXB (Java Architecture for XML Binding) - data-binding a další - JAXP: standarní API pro XML, metody pro vytvoření parseru - aplikace nazávislé na implementaci parseru SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser parser = spf.newSAXParser(); MyHandler handler = new MyHandler(); parser.parse("faktura.xml", handler); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.parse("soubor.xml"); NodeList nl = doc.getElementsByTagName("jmeno"); for (int i=0; iroot->childs; node != NULL; node = node->next) node = xmlDocGetRootElement(doc); if (xmlStrcmp(node->name, (const xmlChar *) "jmeno")) node = node->xmlChildrenNode; atr = xmlGetProp(xmlnode,"jmeno"); context = xmlXPathNewContext(doc); result = xmlXPathEvalExpression(xpath, context); doc = xmlNewDoc("1.0"); doc->root = xmlNewDocNode(doc, NULL, "Genealogy", NULL); newxml = xmlNewChild(xmlnode,NULL,"jmeno",NULL); xmlNewProp(newxml,"jmeno",data); xmlSaveFormatFile (docname, doc, 1); static xmlSAXHandler my_handler { }; struct ParserState { }; xmlSAXUserParseFile(&my_handler, &my_state, filename); Nový XmlTextReader podobný .NET: reader = xmlNewTextReaderFilename(filename); ret = xmlTextReaderRead(reader); while (ret == 1) { processNode(reader); ret = xmlTextReaderRead(reader); } name = xmlTextReaderName(reader); value = xmlTextReaderValue(reader); xmlTextReaderNodeType(reader); - Xerces (C++): DOM, SAX, data-binding do C++, mnoho platforem (open source) class MySAX2Handler : public DefaultHandler { public: void startElement; } XMLPlatformUtils::Initialize(); SAX2XMLReader* parser = XMLReaderFactory::createXMLReader(); DefaultHandler* defaultHandler = new DefaultHandler(); parser->setContentHandler(defaultHandler); char* xmlFile = "soubor.xml"; parser->parse(xmlFile); XMLPlatformUtils::Initialize(); XercesDOMParser* parser = new XercesDOMParser(); char* xmlFile = "soubor.xml"; parser->parse(xmlFile); docRootNode = someDocument->getDocumentElement(); aNode = someDocument->createElement(anElementName); Další ..... - PHP (funkce xml_*, XMLReader), Perl (XML::Parser), atd. Schémata (schémové jazyky) ========================== Úvod ---- - libovolné značky v XML znamenají příliš volnosti, potřeba známé struktury (sémantiky) -> odvození nového značkovacího jazyka (založeného na XML) pomocí jeho schématu zapsaného pomocí schémového jazyka - jednoznačně formálně definuje značkovací jazyk (datový formát) založený na XML - vyjadřuje typ XML dokumentu, požadavky na značky, jejich strukturu a obsah (jaké elementy, atributy a obsah), někdy také datové typy - hlavní použití: validace oproti schématu = ověření, zda XML vyhovuje schématu (má správnou sémantiku), nutná při výměně a čtení XML dokumentu, podpora parsery - může sloužit i jako dokumentace definovaného jazyka, zdroj pro vytvoření objektového modelu při data-bindingu, apod. - př. schémata XHTML, XSL, SVG, MathML, DocBook, WML, RSS/Atom, ... Historie -------- - přímo ve standardu XML jazyk DTD, nevýhody pro IS a web (zejména chybějící datové typy a jmenné prostory), už v době vzniku XML vývoj schémových jazyků, př. SOX, DSD, DDML (XML DTD), DT4DTD (Data Types for DTD), většina nepřežila, proprietární - XML-Data (1998) - jazyk ani ne tak pro schéma XML jako pro definici charakteristik tříd objektů, složitý -> XDR (XML-Data Reduced) - M$ produkty (XML parser, SQL Server 2000) - XML Schema (2001), velká podpora, dostačující, ale složitější -> RelaxNG, elegantní, pro negramatický pravidlový popis Schematron, kombinace - jednotný rámec pro validaci oproti více schématům: projekt DSDL (Document Schema Definition Languages) - řešení problému jmenných prostorů? Document Type Definition (DTD) ------------------------------ - přímo ve standardu XML (ještě z dob SGML) - díky široké podpoře všemi parsery se stále používá, ale zastaralé - stačí na použití XML jako strukturovaného formátu elektronicky publikovaného dokumentu, nestačí ale na XML v IS (faktury, apod.), webových službách apod. - chybí zejména datové typy (jen textový obsah) a jmenné prostory (problematická rozšíření) - definice gramatiky jazyka - popis struktury, pravidla na subelementy, atributy a hodnoty - mnoho existujících standardních DTD pro XML jazyky, např. (X)HTML, DocBook - nestandardní jazyk, který není XML, podobný reg. výrazům - kódování UTF-8 nebo UTF-16 nebo na začátku instrukce xml: Definice elementu: - model obsahu v () - uspořádané podelementy oddělené čárkou - volba jednoho z několika oddělených | (v závorkách) - volitelný podelement - za jménem ? - opakování - za jménem + (min 1x), *, přesnější zadání několikerým uvedením - textový obsah: #PCDATA - smíšený obsah: (#PCDATA | podelement | ...)* - prázdný obsah: EMPTY - jakýkoliv podelement nebo text: ANY (ale jen deklarované!) Definice atributu: - typy: CDATA (libovolný text), NMTOKEN (slovo, omezení jako u jmen elementů a atributů), NMTOKENS (slova oddělená mezerou), ID (identifikátor jedinečný v rámci celého dokumentu pro všechny atributy typu ID, u elementu max. jeden atribut typu ID), IDREF a IDREFS (odkaz(y) na nějaký atribut typu ID) - výčet hodnot: ("h1" | "h2" | ...) - výchozí hodnota: zadaná, #REQUIRED - musí být v XML zadaná, #IMPLIED - záleží na parseru - před výchozí hodnotou #FIXED - atribut může obsahovat jen výchozí hodnotu Definice textových entit (nejen znakové, ale libovolný řetězec, lze jen v DTD): - používané v DTD - před jménem % - systémové - použití pro modularizaci (rozdělení XML dokumentu do více souborů a vložení) Komentáře: - XML, mezi deklaracemi Připojení schématu ke XML: - specifikováno hned za instrukcí xml - lokální - součást XML: - externí: - kombinace - lokální mají přednost - identifikace (standardních DTD): W3C XML Schema (WXS), XML Schema (Definition) (XSD) -------------------------------------------------- - základ: vše je datový typ (typ elementu, atributu, hodnoty), definice podtypů - definice gramatiky jazyka pomocí typů - hierarchie zabudovaných jednoduchých typů: řetězec, celá a desetinná čísla, datum a čas, časový interval, URI, typy z DTD, binární data, aj. - definice (vlastních) jednoduchých typů - restrikce (omezení pro zabudované typy) nebo rozšíření (seznam, sjednocení) - definice (vlastních) komplexních typů pro elementy - XML jazyk (definovaný schématem XML Schema), elementy patří do jmenného prostoru http://www.w3.org/2001/XMLSchema (prefix xs nebo xsd) ... - OO rysy - odvozování datových typů = dědičnost, ADT, možnost zablokovat odvození Definice jednoduchého typu hodnot: - omezení (restriction) pro řetězce: length, min/maxLength, enumeration (výčet), pattern (reg. výraz, Perl) - omezení pro čísla: min/maxIn/Exclusive, total/fractionDigits - normalizace hodnot = tabulátory a nové řádky na jednu mezeru (ne u řetězcových typů) -> lexikální reprezentace, prostor hodnot -> abstraktní reprezentace hodnoty, př. 10, 10.000, 1.0E1 -> 10 Definice komplexního typu: ... - typy v pořadí: ... - volba: ... - nezáleží na pořadí typů (výskyty pouze od 0 do 1, nelze kombinovat): ... - opakování: atributy min/maxOccurs (výchozí 1, nekonečno "unbounded") - smíšený obsah: atribut mixed="true", jiný než v DTD -> volba s libovolným počtem výskytů Definice elementu: - anonymní typ: ... - odkaz na definici elementu: atribut ref="jmeno" Definice atributu v definici elementu: - atributy se definují až na konci komplexního typu - povinný atribut: atribut use="required" - výchozí hodnota atributu: atribut default="hodnota" Referenční integrita: - podpora pro použití relačních databází (uložení tabulek) - jedinečné hodnoty množiny (pod)elementů a atributů ... - klíč = jedinečné a nastavené hodnoty ... - cizí klíč = odkaz na klíč ... - množina určená XPath výrazy: Jmenné prostory: - atribut targetNamespace u xs:schema, i jako implicitní (atribut xmlns) - bohužel patří jen kořenové elementy -> atributy elementFormDefault a atributeFormDefault Modularizace: - vložení podschématu: - podschéma z jiného jmenného prostoru: Komentáře: - anotace: blah - jiný XML jazyk, např XHTML -> jiný jmenný prostor, např. xmlns:html="http://www.w3.org/1999/xhtml" - nástroje pro vygenerování dokumentace ke schématu, např. webové stránky: xs3p (XSLT styl) Připojení schématu ke XML: - pomocí atributů ze jmenného prostoru http://www.w3.org/2001/XMLSchema-instance (prefix xsi) - schéma bez jmenných prostorů: ... - schéma se jmennými prostory: ... Relax NG (RNG, RNC) ------------------- - XML Schema složité a příliš obecné - založeno na vzorech (a matematické teorii hedge automatů a gramatik), celé schéma vzor, definice (pod)vzorů - definice regulární gramatiky jazyka (ReLaX = Regular Language for XML) pomocí vzorů - XML zápis (RNG, jmenný prostor http://relaxng.org/ns/structure/1.0, prefix rng) ... - a kompaktní zápis (RNC) - mnohem úspornější, s XML navzájem převoditelné element jméno { ... } - OASIS (2001) a ISO standard (2003) - převzaté datové typy, nejčastěji z XML Schema Definice vzorů: - text: text - atribut (kdekoliv v definici elementu): attribute jmeno { text } - element: ... element jmeno { ... } - prázdný element (i bez atributů): empty - volitelný vzor: ... ...? - opakování (výchozí 1): ..., ... ...+, ...* - chybí přesný počet opakování -> povinné a volitelné, nebo méně restriktivní vzor a Schematron - podlementy v pořadí: ... (samostatně není nutné) (... , ...) (v závorkách skupina vzorů) - volba: ... (... | ...) - nezáleží na pořadí podelementů: ... (... & ...) = prolínání ve skupinách - mnohem mocnější než v DTD nebo XML Schema, např. jednoduše umožňuje uspořádané podelementy proložené elementem: element jmeno { (element prvni { text }, element druhy { text }, element treti { text }) & element poznámka { text }* } - smíšený obsah = prolínání se vzorem text (není potřeba opakování) nebo ... mixed { ... } Datové typy: - velmi omezená podpora dat. typů, jen string a token -> externí knihovna dat. typů, např. z XML Schema - určení datového typu obsahu elementu nebo atributu - vzor data (RNG) nebo rovnou typ s prefixem knihovny (RNC): datatypes xs = "http://www.w3.org/2001/XMLSchema-datatypes" xs:decimal - pro XML Schema předdefinovaný prefix xsd: xsd:decimal - dědění definice knihovny na podelementy -> jen v kořenovém - normalizace hodnot - parametry dat. typů (restrikce v XML Schema): hodnota xsd:typ { parametr = "hodnota" } - výčet (typ je výchozí string): ... ... typ "..." | typ "..." - vyloučené hodnoty: ... typ - "..." - seznam hodnot (struktura bílými znaky bez značkování) - opakování, výčet, vyloučení hodnot, různé dat. typy hodnot cm mm list { xsd:decimal, ("cm" | "mm") } Kontextové modelování obsahu: = obsah vzoru závisí na hodnotě obsahu podvzoru - díky lib. kombinování vzorů i s konkrétní hodnotou - většina schémových jazyků neumí (včetně XML Schema) element osoba { ..., ((attribute pohlavi { "muz" }, ...) | (attribute pohlavi { "zena" }, ...)) } Jmenné prostory: - v definici elementu a atributu atribut ns="URI" pro RNG, pro RNC default namespace = "URI" - dědění z nadelementů, u atributů nutné zadat explicitně - prefix pomocí atributu xmlns:prefix="URI" pro RNG, pro RNC namespace prefix = "URI" Modularizace: - velmi silná - pojmenování a použití vzorů - zpřehlednění schématu: ... jmeno = ... jmeno - potřeba určit kořenový element (startovací symbol gramatiky): ... start = ... - aby zůstala XML syntaxe RNG -> jeden kořenový element: ... - vložení podschématu: include "soubor.rnc" Komentáře: - anotace - vlastní jmenný prostor xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" ... ## ... - jiný XML jazyk, např XHTML -> jiný jmenný prostor, např. xmlns:html="http://www.w3.org/1999/xhtml" ... [ html:p [ "..." ] ] (speciální notace pro XML) Připojení schématu ke XML: - pro Relax NG schéma bohužel není podpora Schematron (SCH) ---------------- - DTD, XML Schema i Relax NG definují gramatiku XML dokumentu - Schematron je založen na vyhodnocování podmínek tvrzení pro vzory s kontexty vyhodnocování vymezenými XPath výrazem => použití téměř výhradně pro validaci - výsledkem validace je seznam tvrzení - podmínky platnosti tvrzení vyjádřené XPath výrazem, např. porovnávání obsahu elementů a atributů (i napříč dokumenty), kontrola hodnot oproti číselníku (v jiném souboru), atd. - použití spíše jako doplněk ke XML Schema a RelaxNG pro věci, které neumí, ale umožňují vložit Schematron schéma název schématu ... Definice vzoru: ... - vzor obsahuje pravidla vymezující kontext pro vyhodnocení podmínek tvrzení, daný XPath výrazem: ... - XPath výraz udává vzor pro vybrané uzly dokumentu (elemeny, atributy) - pravidla obsahují tvrzení s podmínkami (ne)platnosti vyjádřenými XPath výrazem: tvrzeni tvrzeni - pokud je podmínka splněna (report) nebo nesplněna (assert), je tvrzení výsledkem validace - v tvrzení (textu validačního hlášení) může být: -> jméno aktuálního elementu z kontextu -> hodnota XPath výrazu Validace: - speciální parsery nebo - XSLT procesor - existuje XSLT styl převádějící Schematron schéma na XSLT styl transformující XML dokument na seznam tvrzení $ xsltproc -o validacni.xsl skeleton1-5.xsl schema.sch $ xsltproc validacni.xsl dokument.xml Duplicitní osobní číslo 100 u elementu zamestnanec. Zaměstnanec nemůže mít více než jedno jméno a příjmení. Vložení do XML Schema: - vkládání vzorů pomocí elementu appinfo do anotace: ... ... ... Vložení do Relax NG: - vkládání vzorů téměř kamkoliv: ... ... namespace sch = "http://www.ascc.net/xml/schematron" element jmeno { >> sch:pattern [ name = "..." sch:rule [ ... ] ... ] ... } - validace XML Schema i Relax NG s vloženým Schematronem buď speciálním validátorem nebo extrakce Schematron schématu pomocí XSLT Pravidla používání schémat -------------------------- Přístupy k návrhu: - rozšiřitelnost schématu, použitelnost v jiných schématech 1. jeden kořenový element a vše v něm - v XML kořenový jen ten, podelementy nelze použít jinde 2. více kořenových elementů a odkazy - v XML kořenový lib. z nich, lib. lze použít jinde, jen jeden model obsahu v závislosti na kontextu 3. kombinace - typy elementů, definice elementů lokálně pomocí těchto typů Elementy vs. atributy: - vždy jde místo atributu použít podelement, jsou atributy zbytečné? - atributy: kratší zápis (ruční editace), ale struktura dána elementy, zjednodušení modelu obsahu (?) - u elementu nelze mít dva atributy stejného jména - hodnotu atributu nelze strukturovat pomocí podelementů, potřeba strukturovat -> podelement -> do atributů pouze hodnoty se známým omezeným oborem hodnot (čísla) Jmenné prostory: - každý XML jazyk by měl mít elementy ve vlastním jmenném prostoru, elementy bez prostoru nejde jednoznačně kombinovat - atributy ne - název tvar URI (URN nebo URL) - URN: experimentální prostor začínající x (urn:x-pokus:...) nebo odvozený z doménového jména (urn:cz-upol:...), pak vyznačení jmenného prostoru (...:ns:...) a jméno schématu - URL: na adresu lze dát dokumentaci schématu (HTML nebo RDDL), při zpracování se nic z URL nestahuje, nebezpečí kolize -> první část cesty ns/ Názvy elementů a atributů: - ne extrémy jako 3 písmena nebo 30 písmen - slova s velkými počátečními písmeny nebo oddělená pomlčkou či podtržítkem, jednotně! Verzování schémat: - důvod: nové požadavky - atribut version u kořenového elementu, u velkých změn i změna jmenného prostoru Rozšiřitelnost: - vývoj nebo i potřeba jiných elementů -> otevřené schéma pomocí libovolných podelementů: anything = element * { (attribute * { text } | text | anything)* } - před libovolné podelementy nedávat volitelný element -> nejednoznačnost Který schémový jazyk?: - není potřeba jmenných prostorů a datových typů, jednoduchá struktura, největší podpora -> DTD - komerční vývojové nástroje a knihovny velkých firem -> XML Schema - jinak jednodušší RelaxNG (RNC) - jednoduchý převod mezi schémovými jazyky XML parsery ----------- 1. well-formedness 2. validace oproti schématu - dnes většina podporuje DTD, XML Schema, RelaxNG, některé i Schematron - xmllint (C, DOM, SAX, z balíku libxml2, xmlsoft.org), Xerces (C++, Java, DOM, SAX, xerces.apache.org), a další - převod schémat: trang, XML Authority Srovnání -------- XML: Josef Vyskočil pepek.vyskoc@rakousko-uhersko.cz informátor 5 Flanderka vachmajstr.putim@rakousko-uhersko.cz strážmistr DTD: XML Schema: Relax NG, XML syntaxe: Relax NG, kompaktní syntaxe: element zamestnanci { element zamestnanec { attribute id { xsd:int }, element jmeno { text }?, element prijmeni { text }, element email { xsd:string }, element pozice { xsd:string }+, element mzda { xsd:decimal }?, }* } Schematron: U zaměstnance musí být zadáno jeho osobní číslo (id). Zaměstnanec musí mít příjmení. Zaměstnanec musí mít e-mail. Zaměstnanec musí mít pozici. Zaměstnanec nemůže mít více než jedno jméno a příjmení. Duplicitní osobní číslo u elementu . Zpracování a zobrazení XML ========================== Zobrazení --------- - základní myšlenka XML: oddělení obsahu (význam, co je co) od vzhledu (jak to vypadá) -> styl - výhody: více vzhledů jednoho dokumentu: web - PC, mobily, PDA, tiskárny, ..., jeden (jednotný) vzhled pro více dokumentů: web, faktury -> editace na jednom místě - bez stylu záleží na aplikaci (webovém prohlížeči): strom elementů s obsahem, jen textový obsah elementů, apod. - zápis stylu pomocí stylových jazyků, např. XSL (FO) nebo CSS: XSL Transformace (XSLT) ----------------------- - klíčové pro zpracování XML dokumentů - XSL = eXtensible Stylesheet Language, W3C standard, verze 1.0 1999, http://www.w3.org/TR/xslt - původně stylový jazyk umožňující definovat vzhled elementů: zarovnání, písmo, barvy apod., také automatické generování obsahu, číslování -> oddělení transformace a vzhledu - transformace = XSLT (XSL Transformations), styl definuje převody elementů do jiného XML, HTML, textu nebo čehokoliv jiného (SQL), pomocí XSLT procesoru - XSLT procesory (i jako knihovny): Saxon (Java), xsltproc (C, funkce v C), Xalan (Java, C++, funkce v jiném jazyce), MSXML (C++, COM, funkce ve skriptovacích jazycích, součást M$ produktů), .NET System.Xml (součást .NET, funkce v jazycích .NET, řádkové nxslt) nebo přímo ve webovém prohlížeči (IE6/7, Mozilla/Firefox) - použití pro převod v reálném čase naráží na výkonnostní problémy -> kompilátory, např. Java translety (Sun) - vzhled: formátovací objekty, XSL FO (XSL Formatting Objects) = CSS + layout stránky - více sloupců, hlavičky, atd., XSLT stylem se z XML dokumentu vytvoří XML s formátovacími objekty, který interpretuje procesor FO do např. PDF - procesoty FO: FOP, XEP, XSL Formatter - připojení ke XML, i více (pro různá výstupní zařízení): ... Definice stylu: - XSLT styl = XML dokument - značky (instrukce) pro XSLT procesor a případně značky výsledného dokumentu (např. HTML) - značky pro XSLT procesor: jmenný prostor http://www.w3.org/1999/XSL/Transform, prefix xsl ... šablony ... - obsah stylu: šablony definující převod částí (elementů) XML dokumentu, obsahují XSLT instrukce - postup aplikace stylu: řízený obsahem dokumentu, kdy se šablony volají během parsování XML dokumentu (složitá struktura XML, hodně šablon), nebo opačně řízený stylem, kdy šablona vybírá části dokumentu ke zpracování (jednodušší struktura XML, málo šablon), nebo kombinace - části XML ke zpracování v šablonách, vzory elementů, na které se aplikuje šablona, a generování textu na výstup - dotazovací jazyk XPath XPath ..... - dotazovací jazyk pro zápis výrazů, jejichž výsledkem je (nejčastěji) množina uzlů = elementů a atributů v abstraktním modelu dokumentu Astraktní model dokumentu: - strom uzlů pro: kořen (umělý, potomci kořenový element, poznámky, instrukce), elementy (hodnota = spojení textových uzlů), atributy (připojen k elementu - rodič, listový), text (textový obsah, nahrazeny entity, listový), instrukce pro zpracování (listový, název = cíl instrukce), komentáře (listový), jmenné prostory (připojen k elementu - rodič, listový, název = prefix, dědění) - mírné odlišnosti od modelu DOM - vztahy mezi uzly (osy z aktuálního uzlu): rodič, předek, předchozí/následující (sourozenec), dítě, potomek - spousta textových uzlů reprezentujích jen mezery a konce řádků - XSLT procesor je může ignorovat Výrazy: - hodnoty: true/false, číslo, textový řetězec, množina uzlů, část stromu dokumentu (XSLT) - výběr uzlů pomocí cesty: od aktuálního uzlu (určen XSLT), od kořene, z jiného určeného uzlu (např. funkcí id), oddělovač /, části pro osu, test uzlu (jméno), predikáty omezující výběr uzlů - zkrácený zápis: pro osy implicitně dítě, aktuální = ., rodič = .., potomci = //, pro testy uzlu element = jméno, atribut = @jméno, text = text(), lib. uzel s názvem = *, a další /zamestnanci//prijmeni/text() -> (texty) příjmení zaměstnanců - predikáty v []: vyhodnocení pro každý uzel doposud na cestě, funkce v predikátu mouhou vracet číslo (= pozice/vzdálenost uzlu v množině na ose), množinu uzlů, ostatní převedeny na true/false //zamestnanec[last()] -> poslední zaměstnanec (element) //zamestnanec[mzda/text() > 10] -> zaměstnanec, jehož mzda > 10 - kontext pro vyhodnocení: aktuální uzel, jeho pozice v množině kontextových uzlů, proměnné, aj. - při vyhodnocování se mění aktuální uzel a množina, množinu lze vyznačit pomocí (): //*[3] -> všechny třetí děti svých rodičů (//*)[3] -> třetí element v celém dokumentu - operátory: sjednocení množin uzlů |, logické spojky and a or, relační =, !=, <, <=, >, >= (< a >), aritmetické +, -, *, div, mod - funkce: uzlové position(), last(), name(mn), local-name(mn), řetězcové string-length(r), concat(r1, r2, ...), substring-after (r, hr), logické not(v), true(), false(), lang(), číselné sum(mn), round(n) - funkce v XSLT: document(r) - uzly z jiného dokumentu (URI v r), format-number(n, r, r), current(), system-property(r) aj. document('soubor.xml')/zamestnanci Šablony: - definice šablony: ... - obsahem šablony jsou XSL instrukce zpracování částí dokumentu vyhovujících XPath vzoru (výraz používající jen osy potomků, elementy a atributy) a text (značky) výsledného dokumentu - zpracování šablon: XSLT procesor prochází strom dokumentu do hloubky, pokud je šablona pro uzel, její (zpracovaný) obsah jde na výstup, potomci se nezpracovávájí, jinak implicitní šablona - záleží na pořadí elementů v dokumentu, ne na pořadí šablon ve stylu - výběr uzlů k dalšímu zpracování: - pozor na cyklus! - zpracovat všechny děti (a jejich podstrom, jen elementy) - režim zpracování šablony pro opakovanou aplikaci šablony jiným způsobem: atribut mode="nazev" u xsl:template a xsl:apply-templates - více platných šablon pro jeden uzel -> priorita šablony (atribut priority nebo automaticky - čím specifičtější vzor, tím vyšší) - implicitní šablony: pro postupné zpracování do hloubky, kopírování textových uzlů a nezpracovávání komentářů a XML instrukcí pro zpracování - pro řípad celý styl = jedna šablona pro kořenový element se může uvést rovnou obsah šablony, bez xsl:template Instrukce pro zpracování: - dají se zanořovat, obsahem instrukce mohou být jiné instrukce - všechny elementy včetně obsahu nepatřící do jmenného prostoru XSLT (prefix xsl) a text jdou na výstup - text bez bílých znaků: nějaký text - textový obsah uzlů (bez aplikace šablon pro poduzly): - výsledek výrazu do atributu výstupního elementu: ... - jméno elementu nebo atributu: obsah elementu - výraz např. concat('l', 'i') ->
  • ...
  • hodnota atributu - musí být hned za otevíracím tagem elementu, výraz např. href - komentář: text komentáře -> - XML instrukce pro zpracování: echo "PHP" -> - cyklus - aplikace obsahu pro každý uzel (= aktuální uzel) z množiny dané výrazem: ... - podmínka - obsah se aplikuje, pokud platí podmínka daná výrazem: ... - podmíněné větvení - více podmínek + výchozí větev (else): ... ... ... TODO Rozšíření XSL: - výstup do více souborů - externí funkce v javě nebo JavaScriptu - EXSLT Postup zpracování XML dokumentu: 1. navržení schématu dokumentu - DTD, XML Schema nebo RelaxNG, případně Schematron 2. vytvoření (editace) dokumentu podle schématu + validace 3. vytvoření (vzhledového nebo transformačního) stylu dokumentu - CSS nebo XSLT (FO) + transformace 4. použití (zobrazení) dokumentu - aplikace, webový prohlížeč, atd. Příklad ------- Zaměstnanci

    Zaměstnanci

    Email: Pozice: Mzda:
    Zdroje informací ================ www.kosek.cz zvon.org www.w3c.org relaxng.org schematron.com www.xml.org ... Kosek J.: XML pro každého, podrobný průvodce. Grada Publishing, 2000. ISBN 80-7169-860-1 (http://www.kosek.cz/xml/xmlprokazdeho.pdf) ... (mnoho)