Rodina formátů XML 1



Podobné dokumenty
24. XML. Aby se dokument XML vůbec zobrazil musí být well-formed (správně strukturovaný). To znamená, že splňuje formální požadavky specifikace XML.

Prezentace XML. XML popisuje strukturu dat, neřeší vzhled definice vzhledu:

Jazyk XSL XPath XPath XML. Jazyk XSL - rychlá transformace dokumentů. PhDr. Milan Novák, Ph.D. KIN PF JU České Budějovice. 9.

PRG036 Technologie XML

APLIKACE XML PRO INTERNET

Dotazování nad XML daty a jazyk XPath

Správnost XML dokumentu

Jazyky pro popis dat

Syntaxe XML XML teorie a praxe značkovacích jazyků (4IZ238)

Tvorba informačních systémů

XSLT a jmenné prostory

Podpora XML v.net. Podpora XML v.net. nezávislý publicista. Jirka Kosek.

XML terminologie a charakteristiky. Roman Malo

Metody integrace aplikací

Základy XML struktura dokumentu (včetně testových otázek)

HTML Hypertext Markup Language

Vývoj Internetových Aplikací

Knihovna XmlLib TXV druhé vydání říjen 2012 změny vyhrazeny

Úvod do databázových systémů B

XML a DTD. <!DOCTYPE kořenový_element [deklarace definující vlastnosti jednotlivých elementů a atributů]> externí deklarace:

XML a XSLT. Kapitola seznamuje s šablonami XSLT a jejich použití při transformaci z XML do HTML

1. Webové služby. K čemu slouží? 2. RPC Web Service. 3. SOA Web Service. 4. RESTful Web services

l Kontakt s klientem SSP Popis automatizované komunikace s ÚP ČR v součinnosti a exekuci

XPath je jazyk, který slouží k

Využití XML v DB aplikacích

Rozhraní pro práci s XML dokumenty. Roman Malo

Knihovna XmlLib TXV první vydání prosinec 2010 změny vyhrazeny

Příklad buňka tabulky

Michal Krátký, Miroslav Beneš

Standardy pro Webové služby WSDL, UDDI 1

Tvorba webu. Úvod a základní principy. Martin Urza

Distanční opora předmětu: Databázové systémy Tématický blok č. 4: XML, DTD, XML v SQL Autor: RNDr. Jan Lánský, Ph.D.

Ukládání a vyhledávání XML dat

Další XML technologie

Obsah přednášky. XML DOM SAX XPath XSL transformace 1/46

MBI - technologická realizace modelu

Tvorba informačních systémů

Úvod do Web Services

NSWI096 - INTERNET JavaScript

(X)HTML, CSS a jquery

Požadavky pro výběrová řízení TerraBus ESB/G2x

(X)HTML-TAGY. VOŠ a SŠT Česká Třebová

Obsah prezentace. Co je to XML? Vlastnosti. Validita

Principy XQuery. funkcionální jazyk vše je výraz, jehož vyhodnocením vznikne určitá hodnota základní typy stejné jako v XML Schema:

HTML XHTML JavaScript PHP ASP.Net Zajímavé odkazy

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Předmluva k druhému vydání 13. Úvod 17. ČÁST 2 Vytváření dokumentů XML 65

Uspořádání klient-server. Standardy pro Web

Z n a č k o v a c í j a z y k y. XSL (extensible Stylesheet Language) XSLT (extensible Stylesheet Language Transformation) XPath

XML snadno a rychle Martin Kuba, ÚVT MU

X36DSV 3. cvičení. XML (extensible Markup Language) JavaScript. AJAX (Asynchronous JavaScript and XML) X36DSV. 2007/10 ver.2.0 1

XSLT extensible Stylesheet Language Transformation

Metody tvorby ontologií a sémantický web. Martin Malčík, Rostislav Miarka

PRG036 Technologie XML

NSWI096 - INTERNET. Úvod do HTML

Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

Tvorba WWW stránek. Mojmír Volf

Tvorba informačních systémů

Programovací jazyk Pascal

TÉMATICKÝ OKRUH Softwarové inženýrství

WWW a HTML. Základní pojmy. Ivo Peterka

Základy WWW publikování

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

XSLT pomocí JavaScriptu v Mozille (... Opeře a Safari)

XQuery. Jirka Kosek. Visual FoxPro DevCon června Praha. Copyright 2005 Jiří Kosek

Referenční rozhraní. Jiří Kosek. Ministerstvo informatiky ČR. ISSS 25. března 2003

Roční periodická zpráva projektu

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Programování v jazyce JavaScript

Oracle XML DB. Tomáš Nykodým

Internet 1 vývoj, html, css

XML. Aleš Keprt

POLOPROVOZ ZNALOSTNÍ DATABÁZE INTERPI DOKUMENTACE

Programování v jazyce JavaScript

Software602 Form Designer

Validace souborů DS3

Pokročilé Webové služby a Caché security. Š. Havlíček

Pokročilé techniky tvorby sestav v Caché. ZENové Reporty

Modely datové. Další úrovní je logická úroveň Databázové modely Relační, Síťový, Hierarchický. Na fyzické úrovni se jedná o množinu souborů.

Práce se soubory opakování

Tvorba webových stránek

Unifikovaný modelovací jazyk UML

1 Webový server, instalace PHP a MySQL 13

Analýza dat a modelování. Speciální struktury

Softwarové komponenty a Internet

Dnešní téma. Oblasti standardizace v ICT. Oblasti standardizace v ICT. Oblasti standardizace v ICT

Dotazování nad stromem abstraktní syntaxe

Základní zadání IS o ISVS. Sluţba poskytování dat IS o ISVS

Škola: Gymnázium, Brno, Slovanské náměstí 7 III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Název projektu: Inovace výuky na GSN

PODMÍNKY POSKYTOVÁNÍ PŘÍSTUPU K PORTÁLU NAMĚŘENÝCH DAT POMOCÍ WEBOVÝCH SLUŽEB SPOLEČNOSTI ČEZ DISTRIBUCE, A. S.

Lokální definice (1) plocha-kruhu

Kolaborativní aplikace

HTML - Úvod. Zpracoval: Petr Lasák

Úvod do aplikací internetu a přehled možností při tvorbě webu

TÉMATICKÝ OKRUH Softwarové inženýrství

2 PŘÍKLAD IMPORTU ZATÍŽENÍ Z XML

Úvod do tvorby internetových aplikací

8 Třídy, objekty, metody, předávání argumentů metod

Transkript:

Abstrakt Rodina formátů XML 1 Karel Richta katedra počítačů ČVUT FEL Praha Karlovo nám.13, 212 35 Praha 2 e-mail: richta@fel.cvut.cz, Příspěvek přibližuje základy formátu XML a souvisejících standardů. Není určen jako podrobný popis formátu XML, ale měl by zdůraznit základní myšlenky, nastínit datový model XML, naznačit možnosti definice struktury dokumentů (jazyky DTD, XML Schema). Dále by se měl zabývat nástroji, které tvoří tzv. rodinu XML formátů. Patří sem zejména navigační jazyk XPath, transformační a dotazovací nástroj XSLT. Jako příklad aplikace jsou zde uvedeny protokoly založené na XML (např. SOAP). 1 Úvod Formát XML (extensible Markup Language [W3C04a]) definovalo konsorcium W3C (World Wide Web Consortium) jako formát pro přenos obecných dokumentů. Návrh XML vychází ze staršího a obecnějšího standardu SGML (Standard Generalized Markup Language - ISO 8879). Dokumenty v XML jsou tedy automaticky i dokumenty v SGML. SGML je ale složitější a komplikovanější, což je pravděpodobně příčina, proč nedošlo k jeho širšímu užití. Poznamenejme, že ze standardu SGML vychází i formát dokumentů HTML (Hyper-Text Markup Language [W3C99a]). Sada značek HTML je však pevná a slouží k vyjádření prezentační podoby dokumentu. Naproti tomu v XML sada značek pevná není, ale může být definována pro různé sady dokumentů různě. Značky mají tvar obecných závorek (tags), např.: <jmeno>josef</jmeno> Značky slouží k označení určitých prvků v dokumentu. Uvažme např. níže uvedenou hypotetickou zprávu, jednou bez značek a jednou s označením jména odesilatele: Jan Amos, Karel Hynek Ahoj! Pozdrav z říše divů! posílá Alenka Jan Amos, Karel Hynek Ahoj! Pozdrav z říše divů! posílá <jmeno>alenka</jmeno> P.S.: Napište mi! P.S.: Napište mi! 1 Tento článek vznikl při práci na výzkumných záměrech MŠMT 212300014 Výzkum v oblasti informačních technologií a komunikací Českého vysokého učení technického v Praze, a byl též částečně sponzorován z grantu GAČR 201/03/0912 Vyhledávání a indexování XML dokumentů.

Vyznačíme-li jméno odesilatele, bude takový dokument lépe uchopitelný a bude možno jej zpracovat případně i programem. Definice sady značek může být součástí definice XML dokumentu, může být specifikována odkazem, nebo může být dohodnuta předem. Značky v XML slouží k vymezení logické struktury dokumentu. Můžeme např. stanovit, že dokument typu zpráva musí obsahovat adresu (případně vynechanou, nebo i více adres), oslovení, text, podpis a případně dodatek. V XML tento požadavek zapíšeme následovně: <!ELEMENT zprava (adresa*, osloveni, text, podpis, dodatek?)> Vlastní obsah každé zprávy pak musí mít odpovídající tvar, např.: <zprava> <adresa>jan Amos</adresa> <adresa>karel Hynek</adresa> <osloveni>ahoj!</osloveni> <text>pozdrav z říše divů!</text> <podpis>alenka</podpis> <dodatek>napište mi!</dodatek> </zprava> Pomocí značek XML vyznačíme syntaktickou strukturu dokumentu. Sémantika obsahu není pomocí XML definována. Např. pro výše zmíněnou zprávu nevíme, v jakém formátu se má tisknout, nevíme, jak jej zpracovat to je věcí aplikací, které s tímto dokumentem manipulují. Význam XML spočívá v tom, že struktura dokumentu (v našem případě dokumentu typu zpráva ) je známa, lze ji kontrolovat a zpracovat obecnými nástroji. Libovolná aplikace si může strukturu dokumentu zjistit a dle této struktury jej zpracovat. Význam jednotlivých částí dokumentu XML není pomocí XML definován víme, že dokument typu zpráva musí obsahovat element oslovení, ale není předepsáno, co se s oslovením má provést. Později se budeme věnovat možnostem zpracování XML dokumentů, např. jak můžeme XML dokument přepsat na jiný dokument, jehož sémantika je známa např. na dokument ve formátu HTML a v tomto formátu jej prezentovat. Různými předpisy lze popsat transformaci stejného dokumentu do různých formátů. Předpis pro transformaci XML dokumentu lze tedy chápat jako definici, kterou se vyjádří sémantika XML dokumentu. Potřeba nezávislého formátu pro reprezentaci a přenos obecných dokumentů je nesporná. Tento příspěvek představuje úvod, na který naváží další příspěvky. V následujícím textu proto bude popsán podrobněji formát XML a možnosti definice struktury dokumentů pomocí jazyka DTD (Document Type Definition). Dále se zde budeme zabývat nástroji, které tvoří tzv. rodinu XML formátů. Patří sem navigační jazyk XPath [W3C99c], transformační a dotazovací nástroj XSLT [W3C99b]. Jako příklad aplikace budou uvedeny protokoly založené na XML (např. SOAP [Ni01]). V dalších příspěvcích pak budou probírány novější a preciznější možnosti definice struktury dokumentů pomocí jazyka XML Schema [Ml04], některé významné aplikace formátu XML, zejména XML databáze [Po04], dotazovací jazyky pro XML [ToK04] a komprese XML dat [ToV04]. 2 Formát XML XML je formát pro reprezentaci a přenos obecných dokumentů [W3C04a, XML04a, XML04b, XML04c]. Při návrhu XML se autoři řídili následujícími principy: XML musí být použitelné v rámci Internetu, XML by mělo podporovat širokou škálu aplikací, XML musí být kompatibilní s SGML, Musí být snadné vytvářet programy, které manipulují s dokumenty v XML,

Množství variant XML by mělo být minimální (nejlépe žádné) a XML dokumenty by měly být čitelné a pochopitelné. Na základě těchto principů navrhli definici XML, která zahrnuje dvě části: definice co to je XML dokument, definice programů, které zpracovávají XML dokumenty (XML procesor). XML procesor je modul, který umí číst XML dokumenty a zpřístupňuje entity aplikacím. XML procesor kontroluje, zda je dokument dobře vytvořen zda odpovídá pravidlům zápisu XML dokumentů. Porušení tohoto omezení představuje fatální chybu, kterou musí XML procesor detekovat a hlásit aplikaci. XML procesor může být validující - pak umí kontrolovat, zda vstupní XML dokument je správný vzhledem k zadané specifikaci struktury XML dokumentu. 2.1 XML dokument XML dokument se fyzicky skládá ze sady entit (objektů). Z hlediska XML může každá entita obsahovat buď rozpoznatelná data nebo nerozpoznatelná data. Rozpoznatelná data pro XML jsou sestavena ze znaků a představují buď znaková data nebo značky (markups). Značky popisují logickou strukturu dokumentu a jeho rozložení (layout). Jedna entita může odkazovat na entitu jinou. Dokument začíná entitou nazývanou kořen (root entity objekt syntaktické třídy document). Logicky se XML dokument skládá z deklarací, elementů, komentářů a instrukcí pro zpracování jinou aplikací. Logické elementy jsou v dokumentu vyznačeny značkami. XML poskytuje mechanizmy na definici omezení logické struktury a rozložení dokumentu (DTD Document Type Definition, nebo nověji a přesněji XML Schema). Tyto možnosti budou podrobně probírány v jiném příspěvku ([Ml04]). XML dokument je dobře vytvořen (well-formed), pokud všechny rozpoznatelné entity v dokumentu jsou správně vytvořeny a navíc, všechny rozpoznatelné entity, na které existují v dokumentu odkazy, jsou rovněž dobře vytvořeny. Dobře vytvořené elementy musí být správně uzávorkovány, závorky se nesmí křížit. Každá dvojice závorek musí být korektně spárována v rámci elementu a tyto dvojice musí být dobře vnořeny do sebe. Z toho plyne, že dobře vytvořený XML dokument má stromovou strukturu. Uvažme jako příklad jednoduchou faxovou zprávu: <fax> <odesilatel> <jmeno>jan Amos</jmeno><cislo>33333</cislo> </odesilatel> <adresat> <jmeno>karel Hynek</jmeno><cislo>66666</cislo> </adresat> <text> </text> </fax> Elementy mohou mít atributy, kterými jsou blíže charakterizovány. Atributy se vkládají do otevírací závorky v čele elementu ve formě dvojice: klíčové slovo= hodnota. Hodnoty atributů musí být vždy uzavřeny v uvozovkách nebo apostrofech. Stejnou faxovou zprávu lze s pomocí atributů vyjádřit následovně: <fax> <odesilatel jmeno= Jan Amos cislo= 33333 /> <adresat jmeno= Karel Hynek cislo= 66666 /> <text> </text> </fax>

Každý dobře vytvořený XML dokument může být navíc správný (valid), pokud splňuje další omezení správnosti (validity constraints). Ta jsou určena specifikací typu dokumentu, pomocí DTD nebo pomocí XML schématu vyjádřeném např. v jazyce XML Schema. Ke specifikaci každého elementu je možno připojit podmínky pro dobře vytvořený element (WFC Well-Formedness Condition) a podmínky pro správný XML dokument (VC - Validation Condition). 2.2 Prolog XML dokumentu Každý správný XML dokument začíná prologem, za ním následuje kořen dokumentu a na konec dokumentu může být připojena sada komentářů a instrukcí pro jiné aplikace. Prologem se stanoví verze XML a případně požadavky na strukturu dokumentu (DTD nebo XML schéma). Každý XML dokument obsahuje jeden či více elementů. Vždy existuje právě jeden element nazývaný kořen (root), jehož žádná část není obsažena v žádném jiném elementu. XML dokument může a měl by začínat deklarací verze XML, jinak je sice dobře vytvořen, ale není správný. Jinými slovy, každý správný XML dokument obsahuje prolog s deklarací verze XML. Deklarace verze dokumentu má tvar: <?xml version="1.0"?> Součástí prologu je také specifikace typu XML dokumentu. Specifikace typu představuje odkaz na jakousi gramatiku třídy dokumentů, která se zapisuje buď jako definice typu dokumentu (DTD) nebo XML schéma dokumentu v jazyce XML Schema. Specifikace typu XML dokumentu může odkazovat na externí entitu, která obsahuje deklaraci značek, nebo může tuto deklaraci obsahovat přímo XML dokument, nebo obojí. Skutečná gramatika je tvořena spojením těchto deklarací, interní mají v případě kolize přednost před externími. Příklady specifikace typu dokumentu Dokument s externím DTD: <?xml version="1.0"?> <!DOCTYPE pozdrav SYSTEM "hello.dtd"> <pozdrav>hello, world!</pozdrav> Dokument v XHTML s definicí stanovenou externím DTD: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-2"/> <title>zprava</title> </head> <body> Moje zpráva </body> </html> Dokument s lokálním DTD: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE pozdrav [ <!ELEMENT pozdrav (#PCDATA)> ]> <pozdrav>hello, world!</pozdrav> Dokument s definicí stanovenou XML schématem: <?xml version="1.0" encoding="utf-8"?>

<pozdrav xsi:nonamespaceschemalocation= "http://www.example.com/schemas/pozdrav.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"> Hello, world! </pozdrav> 2.3 Obsah XML dokumentu XML dokument se logicky skládá z elementů, komentářů a dat pro jiné aplikace (instrukcí pro zpracování). Základním prvkem dokumentu je element. Každý XML dokument obsahuje jeden nebo více elementů, omezených závorkami (start-tag a end-tag), nebo případně prázdných (označených tzv. empty-element tag). Každý element má typ identifikovaný jménem (generickým identifikátorem) a může mít sadu atributů. Každý atribut má jméno a hodnotu. Příklad <osoba jmeno="karel" prijmeni="iv."> text tvořící obsah elementu osoba </osoba> Obsahem elementu může být libovolná posloupnost znakových dat, jiných vnořených elementů, referencí (odkazů) na jiné objekty, datových sekcí (CDATA), instrukcí pro zpracování jinou aplikací, nebo komentářů. Jednotlivé složky jsou popsány dále. Prázdný element Prázdné elementy slouží obvykle pro vyznačení místa, kam se později doplní nějaký element, nebo pro logické vyznačení místa v dokumentu. Prázdný element může mít atributy (to může být např. jeho smyslem). Různé formy ukazují následující příklady: <IMG align="left" src="http://www.w3.org/icons/www/w3c_home" /> <br></br> <br/> Komentáře Komentáře se v XML dokumentu mohou vyskytnout kdekoliv mimo ostatní značky. XMLprocesor může umožnit aplikaci číst text komentářů (obsah komentářů). V komentáři se nesmí vyskytovat řetězec "--" (double-hyphen), neboť ten se používá v komentářových závorkách podle syntaxe: <!-- Já jsem příklad komentáře --> Instrukce pro jinou aplikaci Definice XML dokumentu umožňuje, aby dokument obsahoval instrukce a data pro jinou aplikaci. Takové sekci se říká Processing Instructions (PI). Instrukce obsahují návěští (PITarget), kterým je identifikována aplikace, pro kterou jsou instrukce určeny (nesmí to být XML). Obsah sekce instrukcí není chápán jako součást dokumentu, obsah musí být pouze předán ke zpracování dané aplikaci. <?xql "Já jsem data pro aplikaci xql"?> <!-- Následují příklad popisuje připojení formátovacího stylu k aktuálnímu dokumentu. --> <?xml-stylesheet href="styl.css" type="text/css"?>

Sekce CDATA Sekce typu CDATA slouží k označení bloků textu, který by jinak mohl být považován za značku. Uvedeme-li v dokumentu text: <pozdrav>hello, world!</pozdrav> bude chápán jako element typu pozdrav s obsahem Hello, world!. Chceme-li, aby závorky pozdrav byly součástí textu elementu, musíme použít konstrukci: <![CDATA[<pozdrav>Hello, world!</pozdrav>]]> 2.4 DTD specifikace struktury dokumentu Jak jsme se již několikrát zmínili, lze pro XML dokumenty předepsat jejich požadovanou strukturu. Zde probereme specifikaci struktury pomocí DTD. Základem DTD jsou deklarace typů elementů ty specifikují, jaké elementy může XML dokument obsahovat a jak se mohou skládat a vnořovat. Deklarace typu elementu Deklarace typu elementu zavádí jméno elementu a specifikuje jeho možný obsah. Element může být prázdný (EMPTY): <!ELEMENT br EMPTY> Element může mít libovolný obsah (ANY): <!ELEMENT container ANY> Element může obsahovat určitá data (znaky v implicitním, nebo předepsaném kódu): <!ELEMENT jmeno (#PCDATA)> Obsah elementu může být specifikován regulárním výrazem, kde se znakem:? vyjadřuje nepovinnost složky, + vyjadřuje možnost opakování složky 1x a více, * vyjadřuje možnost libovolného opakování složky, vyjadřuje možnost selekce možností a, vyjadřuje požadavek na sekvenční uspořádání složek. Následující deklarace elementu typu dopis říká, že každý element tohoto typu musí obsahovat nejméně jeden vnořený element typu adresa, pak následují povinné elementy osloveni, text a podpis a to v tomto pořadí. Nakonec může být nepovinně uveden element typu poznamka. <!ELEMENT dopis (adresa+,osloveni,text,podpis,poznamka?) > Pokud chceme připustit, aby element typu p obsahoval libovolnou posloupnost znaků a elementů typu emph, zapíšeme to následující deklarací. <!ELEMENT p (#PCDATA emph)* > Deklarace seznamu atributů elementu Deklarace typu elementu zavádí jméno elementu. Atributy elementu jsou zavedeny deklarací seznamu atributů. Při deklaraci atributů lze o každém atributu stanovit zda je povinný (#REQUIRED), či nepovinný. Dále lze požadovat unikátnost atributu (ID), lze nastavit atribut jako konstantní (#FIXED). Lze určit výčet možných hodnot a případnou implicitní hodnotu.

<!ELEMENT osoba (jmeno,prijmeni)> <!ATTRIBUTE osoba jmeno CDATA #REQUIRED prijmeni CDATA #REQUIRED titul (žádný ing. dr.) "žádný"> Pokud specifikujeme jako typ atributu typ ID, musí být hodnota tohoto atributu jednoznačná v rámci jednoho dokumentu jedná se o jakýsi primární klíč na úrovni dokumentu. Pouze jediný atribut v rámci elementu může být typu ID. Odkazy na atribut typu ID lze specifikovat jako atribut typu IDREF, příp. IDREFS (seznam odkazů oddělených mezerou) jakýsi cizí klíč v rámci dokumentu. <!ATTRIBUTE osoba sin ID #REQUIRED jmeno CDATA #REQUIRED prijmeni CDATA #REQUIRED titul (žádný ing. dr.) "žádný" druh IDREF #IMPLIED> Ve výše uvedené specifikaci má atribut sin význam social insurance number, které by mělo být jednoznačné a lze jej použít pro odkazy z jiných elementů typu osoba téhož dokumentu pomocí atributu druh. Pokud by druhů mohlo být více, použila by se specifikace typu IDREFS. Deklarace entity Entity využívá XML podobně jako symbolické konstanty. Deklarací entity se stanoví nahrazující text pro entitu. Často se toho využívá pro speciální znaky, které nejsou součástí použitého kódu. <!ENTITY Post-Scriptum "P.S.: "> <!ENTITY Pub-Status "This is a pre-release of the specification."> <!ENTITY open-hatch SYSTEM "http://www.textuality.com/boilerplate/openhatch.xml"> <!ENTITY open-hatch PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//en" "http://www.textuality.com/boilerplate/openhatch.xml"> Reference Reference představuje odkaz na jinou entitu nebo parametr dokumentu. Součástí reference mohou být podmínky, za kterých je reference dobře vytvořena (WFC), nebo správná (VC). Lze tak například zakázat rekurzivní odkazy. Reference vždy končí znakem ; a začíná buď znakem & (reference na entitu), nebo znakem % (reference na parameter). Mezi těmito omezovači se uvede jméno entity nebo parametru. &apos; <!-- Odkaz na entitu apos -> znak apostrof --> %size; <!-- Odkaz na parameter size --> %version; [ WFC: No Recursion ] <!-- Odkaz na parameter version --> Parametry Parametry jsou podobné entitám. V deklaraci parametru (parametrické entity) je jméno parametru předznačeno znakem %. <!-- deklarace parametru "ISOLat2"... --> <!ENTITY % ISOLat2 SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" >

<!--... odkaz na parameter --> %ISOLat2; Příklad XML dokumentu <?xml version="1.0" encoding="iso-8859-2"?> <!DOCTYPE zprava [ <!ELEMENT zprava (adresa+,osloveni,text,podpis,dodatek?)> <!ELEMENT adresa (jmeno,prijmeni)> <!ELEMENT osloveni (#PCDATA)> <!ELEMENT jmeno (#PCDATA)> <!ELEMENT prijmeni (#PCDATA)> <!ELEMENT podpis (jmeno)> <!ELEMENT text (#PCDATA)> <!ELEMENT dodatek (#PCDATA dodatek1)*> <!ELEMENT dodatek1 (#PCDATA)> ]> <zprava> <adresa><jmeno>jan</jmeno><prijmeni>amos</prijmeni></adresa> <adresa><jmeno>karel</jmeno><prijmeni>hynek</prijmeni></adresa> <osloveni>ahoj!</osloveni> <text>pozdrav z říše divů!</text> <podpis><jmeno>alenka</jmeno></podpis> P.S.: <dodatek>napište mi!</dodatek> </zprava> 3 Datový model XML dokumentů Při zpracování XML dokumentů je třeba studovat řadu otázek. Patří sem zejména otázka, jak XML dokumenty ukládat. Bylo definováno několik datových modelů pro reprezentaci XML dokumentů (např. [W3C03b, SAX02]). Tyto datové modely nejsou zamýšleny jako předpis pro implementaci, ale slouží pro účely specifikace. Jsou definovány pro dobře vytvořené XML dokumenty, které mohou být správné (konformní) vzhledem k DTD nebo XML schématu. Existují dva základní přístupy ke zpracování XML dokumentů. Prvý přístup spočívá v definici stromové reprezentace XML dokumentu v paměti (příp. virtuální). Vstupní analyzátor přečte celý XML dokument, uloží jej do paměti ve formě stromu a aplikaci poskytuje sadu funkcí pro traverzování, či modifikaci této stromové struktury. Uvažme jako příklad dokument v HTML [W3C99a], kde každý správný dokument obsahuje element body tělo HTML stránky. Po načtení a analýze dokumentu doc můžeme tělo získat: // načteme posloupnost potomků, které se jmenují "body" var potomci = doc.getelementsbytagname("body"); // protože HTML dokument má právě jedno tělo, vybereme prvního z nich var telo = potomci.item(0); // a můžeme s ním dále pracovat telo.style.color = "black"; Jiný přístup ke zpracování XML dokumentů je událostmi řízený model. Pokud zpracováváme veliký XML dokument, ale zajímá nás pouze jeho část, bylo by zbytečné celý dokument ukládat v paměti. Místo toho lze vstup XML dokumentu považovat za posloupnost událostí, které musí aplikace zpracovat. Jako příklad takového rozhranní lze uvést model SAX (Simple API for XML [SAX02]). Uvažme např. následující jednoduchý XML dokument: <?xml version="1.0"?> <zprava> <pozdrav barva="blue">hello, world!</pozdrav> </zprava>

Událostmi řízená rozhranní převede tento dokument na posloupnost událostí: start document start element: zprava start element: pozdrav characters: Hello, world! end element: pozdrav start attribute: barva characters: blue end attribute: barva end element: zprava end document Tyto události pak musí zpracovat aplikace. Je vhodné poznamenat, že pomocí událostmi řízeného rozhranní lze zkonstruovat stromovou reprezentaci dokumentu a naopak strom lze procházet pomocí událostí. Zde uvedeme datový model podle specifikace [W3C03b], tzv. DOM model. Pro účely práce se sadami XML dokumentů podporuje též reprezentaci kolekcí XML dokumentů a kolekcí hodnot. XML dokument je modelován jako strom. Uzly tohoto stromu mohou být některého z následujících typů: dokument, element, atribut, text, jmenný prostor, instrukce pro zpracování a komentář. Každý strom má právě jeden kořen, pokud je to uzel typu dokument, pak mluvíme o XML dokumentu, pokud je jiného typu, mluvíme o fragmentu XML dokumentu. Definice datového modelu zavádí nový typ posloupnost (sequence). Posloupnost je uspořádaná kolekce položek (včetně prázdné posloupnosti). Položkou (item) v posloupnosti může být uzel nebo atomická hodnota. Kolekce dokumentů je reprezentována posloupností uzlů typu dokument. Ve starších verzích se pracovalo s množinami položek ( node-sets ), ale novější verze pracují s posloupnostmi. Dovoluje to bohatší možnosti a k množině se dá vždy přejít. Není možné zjišťovat identitu dvou posloupností je ale možné rozhodnout, zda obsahují stejné položky. Porovnání se děje postupným srovnáním prvků posloupností. Posloupnost obsahující jedinou položku se od této položky nerozlišuje, považuje za totéž. Posloupnost nemůže obsahovat jinou posloupnost položkou může být pouze uzel nebo atomická hodnota. Při manipulaci s více posloupnostmi se tyto spojují tak, že výsledkem je opět jediná posloupnost. Atomické hodnoty představují hodnoty jednoduchých primitivních typů, nebo typů z nich odvozených restrikcí. Primitivní typy jsou např. logické hodnoty (boolean), celá čísla (decimal), desetiná čísla (float, double), řetězce znaků (string), časové údaje (date, time, duration) a různé speciality (untypedany, untypedatomic, anyatomictype). Každá atomická hodnota se dá převést na řetězec. Podrobněji viz definice jazyka XML Schema v příspěvku [Ml04]. Uzly XML stromu jsou propojeny vazbami, které vyjadřují jejich hierarchii a strukturu. Každý uzel XML stromu je dosažitelný z kořene. Uzly různých typů jsou propojovány v jiných rovinách (používá se termín osa axis). Propojení reprezentující hierarchii elementů dokumentu je vyjádřeno vztahy v ose potomek-předchůdce. Atributy elementu jsou k němu připojeny v ose atributů. XML strom představuje uzlově ohodnocený, orientovaný, acyklický graf. Každý uzel stromu je unikátní má svou unikátní identitu (která ovšem nesouvisí s jednoznačnou identitou v rámci XML dokumentu předepsanou atributy ID/IDREFS).

Každý XML strom má přesně definováno pořadí uzlů, které obsahuje (document order). Toto uspořádání je v rámci jednoho zpracování stromu úplné, byť některé části mohou být implementačně závislé např. pořadí atributů elementu není dáno normou, ale implementací. Pořadí uzlů je dáno prohledáváním do hloubky, in-order. Kořen stromu je vždy prvý uzel v pořadí uzlů. Pořadí sourozenců ve stromě je dáno jejich pořadím v reprezentovaném XML dokumentu. Uzly typu jmenný prostor (namespace) bezprostředně následují element, ke kterému se vztahují. Jejich relativní pořadí je implementačně závislé. Uzly typu atribut jsou zařazeny za případné uzly typu jmenný prostor, jejich relativní pořadí je opět implementačně závislé. Pro traverzování XML stromu jsou k dispozici předefinované přístupové funkce, tzv. accessors. V přehledu je budeme uvádět včetně jmenného prostoru dm:http://www.w3.org/tr/xpath-datamodel. Funkce Služba, kterou zajišťuje Návratová hodnota dm:node-kind služba, která zjišťuje druh uzlu vrací jednu z hodnot: document, element, attribute, namespace, processing-instruction, comment, nebo text dm: base-uri vrací URI vrací posloupnost URI pro daný prvek dm: node-name vrací jméno uzlu vrací posloupnost jmen pro daný prvek dm: type vrací jméno typu uzlu vrací posloupnost jmen typů pro daný prvek dm: typed-value vrací typovanou hodnotu vrací posloupnost atomických hodnot pro daný prvek dm: string-value vrací řetězec vrací hodnotu prvku převedenou na řetězec dm: parent vrací rodiče vrací rodiče prvku jako posloupnost uzlů dm: children vrací potomky vrací potomky prvku jako posloupnost uzlů dm: attributes vrací atributy vrací atributy prvku jako posloupnost uzlů dm: namespaces vrací jm.prostory vrací jmenné prostory prvku jako posloupnost uzlů dm: nilled vrací příznak tzv. nilled elementu vrací logickou hodnotu true, pokud je aplikována na element, který má prázdný obsah, vrací prázdnou posloupnost, pokud je aplikována na jiný uzel, než element Mimo tyto základní traverzovací funkce je k dispozici celá sada různých metod, např. uzel typu element může poskytovat (mimo jiné) metody (fragment v IDL): boolean hasattribute(in DOMString name); -- test na existenci atributu DOMString getattribute(in DOMString name); -- získání hodnoty atributu void setattribute(in DOMString name, in DOMString value) raises(domexception); -- nastavení hodnoty atributu void removeattribute(in DOMString name) raises(domexception); -- zrušení atributu Attr getattributenode(in DOMString name); -- vrátí uzel atributu NodeList getelementsbytagname(in DOMString name); -- vrátí seznam elementů daného jména Specifikace W3C dokonce doporučuje interface modulů pro traverzování, např. pro procházení všech uzlů posloupnosti: interface NodeIterator { Node nextnode() raises(domexception); Node previousnode()raises(domexception);

}; NodeIterator iter= ((DocumentTraversal)document).createNodeIterator( root, NodeFilter.SHOW_ELEMENT, null); while (Node n = iter.nextnode()) printme(n); Podobně pro traverzování stromu: interface TreeWalker { Node parentnode(); Node firstchild(); Node lastchild(); Node previoussibling(); Node nextsibling(); Node previousnode(); Node nextnode(); }; processme(node n) { nodestartactions(n); for (Node child=n.firstchild(); child!= null; child=child.nextsibling()) { processme(child); } nodeendactions(n); } Uvažme jednoduchý dokument: <?xml version="1.0"?> <zprava> <pozdrav barva="blue">hello, world!</pozdrav> </zprava> Jeho XML strom by mohl vypadat následovně: zprava: document pozdrav: element barva= blue : attribut Hello, world! : text Serializované vyjádření XML stromu lze zapsat pomocí výsledků traverzovacích funkcí: // Document node D1 dm:node-kind(d1) = "document" dm:string-value(d1) = "Hello, world!" dm:children(d1) = ([E1]) // Element node E1 dm:node-kind(e1) = "element"

dm:node-name(e1) = xs:qname("", "pozdrav") dm:string-value(e1) = "Hello, world!" dm:typed-value(e1) = "Hello, world!" dm:type(e1) = xs:anytype dm:parent(e1) = ([D1]) dm:children(e1) = () dm:attributes(e1) = ([A1]) // Attribute node A1 dm:node-kind(a1) = "attribute" dm:node-name(a1) = xs:qname("", "barva") dm:string-value(a1) = "blue" dm:typed-value(a1) = "blue" dm:type(a1) = xs:string dm:parent(a1) = ([E1]) / Text node T1 dm:node-kind(t1) = "text" dm:string-value(t1) = "Hello, world!" dm:typed-value(t1) = xs:anysimpletype("hello, world!") dm:type(t1) = xs:anysimpletype dm:parent(t1) = ([E1]) 4 Jazyk XPath Jak bylo ukázáno v předchozí sekci, lze XML dokumenty reprezentovat pomocí XML stromů. Při práci s XML dokumenty potřebujeme mít nějaký nástroj pro označování částí XML dokumentů. Jinými slovy, potřebujeme mít nástroj, který de facto popisuje cestu od kořene stromu k danému prvku. Konsorcium W3C vytvořilo návrh specializovaného jazyka XPath [W3C99c], který slouží pro tento účel. Jazyk XPath bývá použit jako součást jiných jazyků a formátů, např. XQuery, XSLT apod. Základním konstruktem jazyka XPath je výraz (location path expression). Výraz jazyka XPath je tvořen posloupností kroků (location steps), které jsou odděleny lomítkem /. Pokud výraz začíná lomítkem, jedná se o absolutní cestu, jinak o cestu relativní. Krok-1 / Krok-2 / / Krok-n Pokud je zapotřebí vyznačit explicitně dokument, pro který se má výraz vyhodnotit, využívá se prefixu document : document( )/Krok-1 / Krok-2 / / Krok-n Kroky výrazu vyznačují postup XML stromem. Každý krok může být kvalifikován osou, po které se má postupovat. Pokud kvalifikaci neuvedeme, používá se osa child. Obecně lze pro označení osy použít následující kvalifikátory: ancestor, ancestor-or-self, atribute, child, descendent, descendant-or-self, following, following-sibling, namespace, parent, preceding, preceding-sibling, nebo self. Osa-1::Krok-1 / Osa-2::Krok-2 / / Osa-n::Krok-n Výrazy XPath slouží pro označení částí XML dokumentu. Sémantickým významem výrazu v jazyce XPath je posloupnost uzlů nebo atomických hodnot. Význam výrazu závisí na tzv. kontextu kontextem pro celý výraz je vstupní XML dokument (nebo kolekce dokumentů), pro který se výraz vyhodnocuje. Výraz se vyhodnocuje vždy zleva doprava po jednotlivých krocích, ze kterých se skládá. Význam kroku v daném kontextu je opět posloupnost uzlů nebo atomických hodnot. Kontext pro prvý krok je vstupní dokument,

výsledek prvého kroku tvoří kontext pro druhý krok atd. Význam výrazu XPath je posloupnost uzlů nebo atomických hodnot, která je významem posledního kroku. Uvažme jako příklad vstupu XML dokument obsahující údaje o universitě, který bude uložen v souboru universita.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE University SYSTEM "universita.dtd"> <!-- Universitní databáze studentů --> <Universita jmeno="české vysoké učení technické"> <Fakulta idfaculty="f3" name="elektrotechnická"> <Student TypStudia="MSc" username="xnovak10"> <jmeno>josef Novák</jmeno> <narozeni>1.1.1980</narozeni> <adresa>praha 4, Nová 45</adresa> <rocnik>3</rocnik> </Student> <Student TypStudia="PhD" username="xpolak11"> <jmeno>pavel Polák</jmeno> <narozeni>1.1.1980</narozeni> <adresa>praha</adresa> <rocnik>3</rocnik> </Student> </Fakulta> </Universita> a bude správný vzhledem k DTD universita.dtd. <!-- universita.dtd --> <!ELEMENT Universita (Fakulta)+> <!ATTLIST Universita jmeno CDATA #REQUIRED> <!ELEMENT Fakulta (Student)*> <!ATTLIST Fakulta idfakulty ID #REQUIRED nazev CDATA #REQUIRED > <!ELEMENT Student (jmeno, narozeni, adresa, rocnik)> <!ATTLIST Student username CDATA #REQUIRED TypStudia (BSc MSc PhD) #IMPLIED > <!ELEMENT jmeno (#PCDATA)> <!ELEMENT narozeni (#PCDATA)> <!ELEMENT adresa (#PCDATA)> <!ELEMENT rocnik (#PCDATA)> Pak následující výraz XPath: document( universita.xml )/Universita/Fakulta/Student/jmeno vrátí posloupnost dvou uzlů typu element odpovídající jménům obou studentů. Potřebujeme-li vybrat druhého studenta fakulty s identifikátorem F3, použijeme výraz: id("f3")/child::student[position()=2] Zde bylo použito jméno osy child, kterou jsme zdůraznili směr navigace. Jsou definovány zkratky, kterými se zápis zjednodušuje. Např. výraz: //Student[@rocnik = "3"] označuje všechny studenty, kteří mají atribut rocnik s hodnotou 3. Ve výrazech je možno využívat předdefinované, nebo i uživatelsky definované funkce. XPath je funkcionální jazyk v tom smyslu, že výrazy mohou být vnořeny do jiných výrazů (nemají vedlejší efekty). XPath

rozlišuje malá a velká písmena, je silně typovaný (každý výraz má přesně definován typ, složené výrazy vyžadují komponenty správných typů). 5 Transformační jazyk XSL XML dokumenty je třeba prezentovat v různých formátech. Konsorcium W3C vytvořilo návrh specializovaného jazyka XSL (extensible Stylesheet Language [W3C99b,W3C01b]), který byl původně zamýšlen jako jazyk určený pro popis style-sheets - formátované tištěné verze XML dokumentů. Obecně však je XSL nástrojem pro popis transformací XML dokumentů, lze jej tedy využít pro řadu jiných účelů. Např. jej můžeme považovat za dotazovací jazyk, který pro daný transformační předpis a vstupní dokument vrátí výstupní dokument výsledek dotazu. Definice XSL má dvě části: jazyk pro popis transformací XML dokumentů (XSLT), XML slovník popisující sémantiku formátování (výstupu). Dokument v jazyce XSLT (XSL stylesheet) specifikuje transformaci třídy XML dokumentů na dokumenty jiné. Výstupem mohou být opět XML dokumenty, nebo stránky v HTML, příp. prostý text. Prezentace XML pomocí XSL Libovolný XML dokument jisté třídy (tj. konformní s DTD nebo XML schématem) lze prezentovat pomocí XSL. Vytvoříme předpis v jazyce XSLT, který bude obsahovat pravidla pro prezentaci. Proces prezentace má dva kroky: 1. zdrojový XML dokument (source tree) je podle pravidel transformován na výsledný document (result tree), 2. výsledný dokument je interpretován a výsledkem je formátovaný výstup (na obrazovce, papíru, atd.). XML dokument XSL procesor Formátovaný výstup XSL stylesheet Formát XSL dokumentu XSL dokument je XML dokument. Skládá se ze sady pravidel (také se jim říká šablony), která popisují transformaci vstupního dokumentu. Pravidla obsahují vzorek (pattern) a akci (template). Vzorek se porovnává se zdrojovým dokumentem, při srovnání se modifikuje akce pravidla (přizpůsobí se konkrétnímu srovnání) a aplikuje se na výsledný strom (zdrojový a výsledný strom jsou dva různé dokumenty). Struktura výsledného dokumentu může být

zcela jiná, než struktura zdrojového dokumentu (lze přidávat elementy, přeuspořádat pořadí, opakovat atd.). Protože je XSL dokument správně vytvořený XML dokument, musí být uzavřen v závorkách (používá se dvojice <xsl:stylesheet> a </xsl:stylesheet>) a všechny ostatní závorky musí být správně spárovány. Specifikace XSL plně využívá tzv. prostorů jmen (name spaces). Pro seznámení s XSL není nutno zcela podrobně porozumět tomuto mechanismu, postačí nám jednoduchý příklad. Podrobný popis lze nalézt na stránkách W3C. Všechny dokumenty odpovídající specifikaci XSL jsou vloženy do kořene XML dokumentu (root element): <xsl:stylesheet> </xsl:stylesheet> Příklad <xsl:stylesheet xmlns:xsl="http//www.w3.org/1999/xsl/transform" xmlns:fo="http//www.w3.org/1999/xsl/format" result-ns="fo"> </xsl:stylesheet> Kořen dokumentu má v tomto případě atributy: xmlns:xsl (prostor jmen XSL dokumentu jako XML dokumentu), xmlns:fo (formátovací slovník), a result-ns= fo (výstupní prostor jmen). Prvý atribut je povinný a jeho hodnota musí být: xmlns:xsl="http//www.w3.org/1999/xsl/transform" Tento atribut slouží pro procesor XSL, který tak pozná, že všechny elementy s prefixem xsl: mají být interpretovány dle specifikace XSL (jsou v prostoru xsl ). Druhý atribut je teoreticky volitelný, ale ve skutečnosti bývá většinou uveden v naznačeném tvaru. Říká XSL procesoru, že elementy s prefixem fo: (zkratka pro flow objects, nebo formatted objects) jsou v prostoru fo, a formátování využívá formátovací slovník dle specifikace XSL. Narazíli pak procesor na <fo:block font-size= 10pt >, řídí se syntaxí specifikovanou v prostoru fo. Je samozřejmě možné používat jiný slovník, je pak ale třeba přesvědčit tvůrce aplikací, aby tento formát respektovali. Třetí atribut result-ns= fo říká XSL procesoru, že konstruovaný výstupní strom (result tree) používá slovník fo. Pravidla XSL dokumentu Pravidla XSL dokumentu popisují přepis vstupního dokumentu na výstupní. Každé pravidlo obsahuje vzorek a akci. Vzorek pravidla slouží pro selekci uzlu (elementu) vstupního stromu. Selekci je možno předepsat podle: jména elementu, předchůdce elementu, ID elementu, wildcards (lze využít zástupné znaky), atributů elementu, relativní pozice elementu ve stromě, nebo unikátnosti elementu. Akce pravidla obsahují: elementy konstruovaného (formátovaného) objektu, např. <fo:block></fo:block> vytvoří ve formátovaném objektu blok, atributy formátovaného objektu, např. <fo:block font-size= 16pt > indikuje, že ve výstupním objektu má být použito písmo velikosti 16 bodů, způsob zpracování (ve formě prázdného elementu), např. <apply-templates/> způsobí, že XSL procesor zpracuje v tomto místě všechny potomky. Procesor XSL prochází vstupní dokument (vstupní strom) a pokouší se hledat vzorky pravidel XSL dokumentu. Pokud se podaří nalézt shodu, aplikuje akci pravidla na výstupní

dokument (výstupní strom). Pokud je aplikovatelných pravidel více, lze stanovit pořadí při výběru pravidel. Pravidla mají následující formát: <xsl:stylesheet> <!-- zde je vzorek --> <xsl:template... <!-- zde je akce -->... </xsl:template> </xsl:stylesheet> Příklad pravidla XSL <xsl:stylesheet> <!-- zde je vzorek --> <xsl:template match= pozdrav > <!-- zde je akce --> <fo:block color= red font-size= 16pt > <apply-templates/> </fo:block> </xsl:template> </xsl:stylesheet> Příklad zpracování dle tohoto pravidla vstup: výstup: <pozdrav>hello XSL!</pozdrav> <fo:block color= red font-size= 16pt > Hello XSL! </fo:block> 5.1 Zpracování XML dokumentu pomocí XSL Pokusme se jako příklad napsat popis transformace, která z databáze studentů uvedené dříve (soubor universita.xml) vybere určitého studenta a vytvoří XML dokument, který nese informaci o tom, že daný student je studentem příslušné fakulty (viz [Ku01]). <xsl:stylesheet version="1.0" xmlns:xsl=http://www.w3.org/1999/xsl/transform <xsl:output method="xml" indent="yes"/> <xsl:param name="id" select="'xnovak10'"/> <xsl:param name="fak" select="'f3'"/> <!-- Pravidlo pro výběr a zpracování fakulty --> <xsl:template match="fakulta"> <xsl:if test="./@idfakulty=$fak"> <! Jen pro zadanou fakultu --> <xsl:apply-templates/> </xsl:if> </xsl:template> <!-- Pravidlo pro výběr a zpracování studenta --> <xsl:template match="student"> <xsl:if test="@username = $id"> <! Jen pro zadaného studenta --> <xsl:processing-instruction name= "cocoon-process">type="xslt"</xsl:processing-instruction> <xsl:processing-instruction name=

"xml-stylesheet">href="pos2-html.xsl" type="text/xsl"</xsl:processing-instruction> <!-- Nastavení proměnných podle atributů studenta --> <xsl:variable name="typ"> <xsl:choose> <xsl:when test="./@typstudia = 'BSc'">bakalář</xsl:when> <xsl:when test="./@typstudia = 'MSc'">inženýr</xsl:when> <xsl:when test="./@typstudia = 'PhD'">doktorand</xsl:when> <xsl:otherwise/> </xsl:choose> </xsl:variable> <!-- začátek transformace vytváříme element certifikát --> <certificate> <header> <Fakulta><xsl:value-of select="./../@nazev"/></fakulta> </header> <paragraph> <row> <text>děkan fakulty </text> <Faculty><xsl:value-of select="./../@nazev"/></faculty> <text> potvrzuje, že </text> </row> <row> <jmeno><xsl:value-of select="./jmeno"/></jmeno> <text>, narozen(á) </text> <narozeni><xsl:value-of select="./narozeni"/></narozeni> </row> <row> <text> bydliště: </text> <adresa><xsl:value-of select="./adresa"/></adresa> <text> působí na naší fakultě jako </text> <TypStudia><xsl:value-of select="$typ"/></typstudia> </row> <row> <text> ve </text> <rocnik><xsl:value-of select="./rocnik"/></rocnik> <text> ročníku. </text> <row> </paragraph> </certificate> <!-- Konec certifikatu --> </xsl:if> </xsl:template> </xsl:stylesheet> Příklad výstupu Aplikujeme-li tento předpis pro transformaci na dokument universita.xml, bude výstupem opět XML dokument (ale správný vzhledem k jinému DTD), který obsahuje potřebné informace o certifikátu, ale zatím nenaformátované. <?xml version="1.0" encoding="utf-8"?> <?cocoon-process type="xslt"?> <?xml-stylesheet href="pos2-html.xsl" type="text/xsl"?>

<certificate> <header> <Fakulta>elektrotechnická</Fakulta> </header> <paragraph> <row> <text>děkan fakulty </text> <Fakulta>elektrotechnická</Fakulta> <text> potvrzuje, že </text> </row> <row> <jmeno>josef Novák</jmeno> <text>, narozen(á) </text> <narozeni>1.1.1980</narozeni> </row> <row> <text> bydliště: </text> <adresa>praha 4, Nová 45 </adresa> <text> působí na naší fakultě jako </text> <TypStudia>inženýr</TypStudia> </row> <row> <text> ve </text> <rocnik>3</rocnik> <text> ročníku. </text> </row> </paragraph> </certificate> Příklad převodu do HTML Následující příklad ukazuje předpis pro převod dokumentu v XML vytvořeného v předchozím odstavci do HTML pomocí XSLT. <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="html"/> <xsl:template match="/certificate"> <xsl:processing-instruction name= "cocoon-format">type="text/html" </xsl:processing-instruction> <html> <head><title>potvrzení o studiu</title></head> <body style= "margin-left:1cm;margin-right:1cm;margin-top:15mm;width:15cm;"> <div style="margin:0px;width:125mm;"> <xsl:apply-templates/> <p align="right">the Dean of </p> </div> </body> </html> </xsl:template> <xsl:template match="header"> <table width="100%"> <tr><td colspan="2">české vysoké učení technické</td> </tr> <tr><td>fakulta <i><xsl:value-of select="fakulta"/></i></td>

<td><div align="right">datum: <xsl:value-of select="date"/></div> </td> </tr> </table> <center><h1 style="font-size:larger;letter-spacing:5pt"> POTVRZENÍ</h1> </center> </xsl:template> <xsl:template match="fakulta jmeno narozeni adresa TypStudia rocnik"> <font color="blue"><i><xsl:value-of select="."/></i></font> </xsl:template> <xsl:template match="paragraph"> <div style="margin-top:2em;margin-bottom:0.5em:" align="justify"><xsl:apply-templates/></div> </xsl:template> <xsl:template match="row"> <xsl:apply-templates/> </xsl:template> <xsl:template match="text"> <xsl:value-of select="."/> </xsl:template> </xsl:stylesheet> Výstupem pak bude dokument v XHTML: <?cocoon-format type="text/html"> <html> <head> <META http-equiv="content-type" content="text/html; charset=utf-8"> <title>the Certificate about Study</title> </head> <body style="margin-left:1cm;margin-right:1cm;margintop:15mm;width:15cm;"> <div style="margin:0px;width:125mm;"> <table width="100%"> <tr> <td colspan="2">české vysoké učení technické</td> </tr> <tr> <td>fakulta elektrotechnická</i> </td> <td> <div align="right">datum: 15.8.2001</div> </td> </tr> </table> <center> <h1 style="font-size:larger;letter-spacing:5pt"> POTVRZENÍ</h1> </center> <div style="margin-top:2em;margin-bottom:0.5em:" align="justify"> Děkan fakulty <font color="blue"> <i>elektrotechnická</i> </font> potvrzuje, že

<font color="blue"> <i>josef Novák</i> </font> narozen(á) <font color="blue"> <i>1.1.1980</i> </font> bydliště: <font color="blue"> <i>praha 4, Nová 45</i> </font> působí na naší fakultě jako <font color="blue"> <i>inženýr</i> </font> ve <font color="blue"> <i>3</i> </font> ročníku. </div> </body> </html> Vytvořený certifikát lze ale prezentovat i v jiných formátech. Jako ukázku uvažme jen fragment XLST kódu pro převod do formátu FO (PDF), který je součástí definice XSL. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:fo="http://www.w3.org/1999/xsl/format" > <!-- <xsl:output method="pdf"/> --> <xsl:output method="xml" indent="yes"/> <xsl:template match="/certificate"> <xsl:processing-instruction name="cocoon-format">type="text/xslfo"</xsl:processing-instruction> <fo:root xmlns:fo="http://www.w3.org/1999/xsl/format"> <fo:layout-master-set>

<fo:simple-page-master page-master-name="one" page-height="130mm" page-width="190mm" margin-left="10mm" margin-right="10mm"> <fo:region-body margin-top="15mm" margin-bottom="5mm"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence> <fo:sequence-specification> <fo:sequence-specifier-repeating page-master-first="one" page-master-repeating="one"/> </fo:sequence-specification> <fo:flow font-family="timesroman" font-size="13pt" line-height="14pt"> <xsl:apply-templates/> <fo:block text-align="end" space-before.optimum="30pt"> České vysoké učení technické </fo:block> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template>... </xsl:stylesheet> 6 Protokol SOAP Konsorcium W3C v současné době podporuje řadu dalších formátů, které z XML vycházejí tzv. aplikace XML. Jednou takovou aplikací je i standard pro tzv. webové služby služby poskytované prostřednictvím sítě. Jako příklad takové služby může posloužit služba pro zjištění aktuálního kurzu akcie ve vzdáleném místě. Pokud mají být takové služby nezávislé na platformě a být dostupné zcela globálně, je výhodné využít při jejich volání reprezentaci ve formátu XML. Je to tedy rozšíření XML z datové oblasti na volání funkcí. Požadavek na službu zakódujeme do XML a přeneseme pomocí protokolu HTTP na cílový stroj. Tam je požadavek rozkódován, obsloužen a získané výsledky opět přeneseny zpět ve formátu XML. Volání služeb ve vzdáleném místě lze formulovat a přenášet pomocí protokolu, který je založen na formátu XML. Jedním z takových je formát SOAP (Simple Object Access Protocol [W3C03a, Ni01]), který slouží pro obecné vyvolávání metod vzdálených objektů. Aby ale klient věděl, jak službu vzdáleného objektu vyvolat, musí znát její interface - funkční profil. Pro jejich zápis byl definován standard WSDL (Web Services Description Language [W3C04b]). Z popisu služby ve WSDL lze automaticky vygenerovat kód, kterým tuto službu zavoláme (ve formátu SOAP), i kostru programové obsluhy této služby. Poslední související problém je, jak zjistit, které služby se v síti nabízí. K tomu by měl posloužit univerzální registr obsahující seznam a popis dostupných webových služeb, tzv. UDDI (Universal Description, Discovery and Integration [OASIS02]). V takovém registru by mělo být možné službu vyhledat, podle jejího popisu ve WSDL zformulovat zprávu ve formátu SOAP a nechat se vzdáleným poskytovatelem obsloužit.

Požadavek na službu je třeba zabalit do obálky. Poslouží zde protokol SOAP, což je jednoduchý protokol, který definuje uniformní způsob přenášení dat v XML. Rovněž definuje, jakým způsobem se má pomocí HTTP provést vyvolání vzdálené procedury (RPC - Remote Procedure Call). SOAP vychází z přesvědčení, že ať je aktuální realizace procedury služby jakkoliv sofistikovaná, její vyvolání přes XML zvyšuje operativnost v rámci sítě. Hlavním elementem dokumentu ve formátu SOAP je obálka (SOAP-Envelope, viz obrázek). Ta může obsahovat hlavičku (Header) a musí obsahovat tělo (Body). Dále může obsahovat informace pro zpracování výjimek (Fault). Např. požadavek na provedení součtu dvou hodnot může vypadat následovně (do obálky je třeba vložit i odkazy na XML schémata zabudovaných typů, které používáme): <?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wn1="http://www.w3.org/2000/10/xmlschemas" xmlns:wn0="http://www.w3.org/2001/xmlschemas" xmlns:xsi="http://www.w3.org/2001/xmlschemas-instance"> <nsp:soucet xmlns:nsp="urn:x-kosek:services:soucet"> <par0 xsi:type="wn0:int">2</par0> <par1 xsi:type="wn0:int">5</par1> </nsp:soucet> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Tato zpráva je zaslána na server. Tam musí být obsluha, která požadavek dekóduje a vykoná. Poté je výsledek služby opět zabalen do SOAP obálky a poslán zpět:

<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wn1="http://www.w3.org/2000/10/xmlschemas" xmlns:wn0="http://www.w3.org/2001/xmlschemas" xmlns:xsi="http://www.w3.org/2001/xmlschemas-instance"> <nsp:vysledek_souctu xmlns:nsp="urn:x-kosek:services:soucet"> <vysledek xsi:type="wn0:int">7</vysledek> </nsp:vysledek_souctu> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Výsledek je na straně klienta dekódován, jsou z něj extrahována data předána ke zpracování (např. metodě println k vytištění). 7 Formát WSDL Jako poslední příklad aplikace formátu XML uvedeme jazyk WSDL (Web Services Description Language [W3C04b]). Dokument ve formátu WSDL představuje sadu definic zahrnutých do elementu wsdl:definitions. Zjednodušená gramatika pro tento element je znázorněna na obrázku na následující straně. Služby jsou definovány pomocí 4 základních elementů: message abstraktní definice přenášených dat, skládá se z částí (parts), porttype představuje sadu abstraktních operací, které mají definován vstup, výstup a reakci na chyby, binding popisuje konkrétní protokol pro navázání operace na složky operace popsané pomocí porttype, service odkazuje na uzel který službu realizuje a pomocí složek port odkazuje na způsob vazby (binding).

Příklad definice ve formátu WSDL Předpokládejme, že chceme vytvořit a použít jednoduchou webovou službu. Pro jednoduchost uvažme službu, která nevyžaduje žádné další pomocné komponenty. V [Ko02] je uveden příklad služby na sečtení dvou čísel. Popis této služby vyžaduje, abychom stanovili, že požadavek na vykonání této služby bude muset obsahovat 2 parametry této služby označme je jako par0 a par1. Parametry jsou celá čísla: <wsdl:message name='pozadavek_na_secteni'> <wsdl:part name='par0' type='xsd:int'/> <wsdl:part name='par1' type='xsd:int'/> </wsdl:message> Získaný výsledný součet bude opět celé číslo: <wsdl:message name='vysledek_souctu'> <wsdl:part name='vysledek' type='xsd:int'/> </wsdl:message> V části označované porttype je nutno stanovit, jaká operace bude implementovat požadavek na službu Soucet. Služba Soucet bude implementována pomocí operace Sum, které budou předány dva parametry par0 a par1 v tomto pořadí: <wsdl:porttype name='soucet'> <wsdl:operation name='sum' parameterorder='par0 par1'> <wsdl:input name='soucet' message='tns:pozadavek_na_soucet'/>

<wsdl:output name='soucet' message='tns:vysledek_souctu'/> </wsdl:operation> </wsdl:porttype> V části označené Binding se stanoví, jakým způsobem bude požadavek transportován. Pro náš účel bude vyhovovat přenos typu RPC Remote Procedure Call, kde vstup a výstup bude zakódován jako XML elementy: <wsdl:binding name='soucetsoap' type='tns:soucet'> <soap:binding transport='http://schemas.xmlsoap.org/soap/http' style='rpc'/> <wsdl:operation name='soucet'> <soap:operation soapaction='' style='rpc'/> <wsdl:input name='soucet'> <soap:body use='encoded' encodingstyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='urn:x-kosek:services:soucet'/> </wsdl:input> <wsdl:output name='soucet'> <soap:body use='encoded' encodingstyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='urn:x-kosek:services:soucet'/> </wsdl:output> </wsdl:operation> </wsdl:binding> Nakonec v části označené Service stanovíme, který výpočetní uzel bude adresován a jaký vazební element bude použit: <wsdl:service name='soucet'> <wsdl:port name='sum' binding='tns:soucetsoap'> <soap:address location='http://localhost:6060/soucet/'/> </wsdl:port> </wsdl:service> Celý dokument ve formátu WSDL pak bude vypadat následovně: <?xml version='1.0'?> <wsdl:definitions name='sum' targetnamespace='urn:x-kosek:services:sum' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns:xsd='http://www.w3.org/2001/xmlschema' xmlns:tns='urn:x-kosek:services:sum' xmlns:http='http://schemas.xmlsoap.org/wsdl/http/' xmlns:xsi='http://www.w3.org/2001/xmlschema-instance' xmlns:mime='http://schemas.xmlsoap.org/wsdl/mime/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:soap-enc='http://schemas.xmlsoap.org/soap/encoding/'> <wsdl:message name='vysledek_souctu'> <wsdl:part name='vysledek' type='xsd:int'/> </wsdl:message> <wsdl:message name='pozadavek_na_soucet'> <wsdl:part name='p0' type='xsd:int'/> <wsdl:part name='p1' type='xsd:int'/> </wsdl:message> <wsdl:porttype name='sum'> <wsdl:operation name='sum' parameterorder='p0 p1'> <wsdl:input name='sum' message='tns:pozadavek_na_soucet'/> <wsdl:output name='sum' message='tns:vysledek_souctu'/> </wsdl:operation> </wsdl:porttype> <wsdl:binding name='soucetsoap' type='tns:sum'>