Tomáš Kliegr, David Chudán upravil D. Pejčoch 4iz210 – cvičení XML Tomáš Kliegr, David Chudán upravil D. Pejčoch
Osnova Procvičování regulárních výrazů XML, XML schéma, XSLT Práce v SW Kernow (open source) Práce v SW Oxygen (komerční) Jak na úkol č. 2
XML Formát pro výměnu dat Odděluje data od způsobu jejich prezentace Snadno čitelný a editovatelný Standardizován W3C, odvozen od SGML Zaměřeno na obsah Stromová struktura <?xml version=“1.0” encoding = “utf-8”> <Message> Hello <bold>world!<bold> </Message>
Seznam – Zboží.cz Služba, s jejíž pomocí je možné vyhledávat informace o nabízeném zboží a jeho cenách mezi internetovými obchody registrovanými na www.zbozi.cz Jedná se o zprostředkování prodeje Nápověda pro službu k dispozici na http://napoveda.seznam.cz/cz/zbozi/napove da-pro-internetove-obchody/
Zboží.cz – klíčové (povinné) tagy <shop> - kořenový tag pro celý obchod <shopitem> - tag pro jednu nabízenou položku <description> - popis výrobku <url> - odkaz na stránku s nabídkou výrobku <dues> - součet ceny všech poplatků, které je nutné zaplatit při zakoupení výrobku Celý přehled tagů: http://napoveda.seznam.cz/cz/specifikace- xml.html
XML Schema Syntaxe je založena XML, soubor má příponu .xsd Feed.xsd XML Schema umožňuje vytvořit vlastní„datový formát“ Definujeme povolené elementy, atributy, přípustné kombinace elementů a atributů, vlastní datové typy odvozené od existujících typů Syntaxe je založena XML, soubor má příponu .xsd Validace: Proces kontroly, zda XML dokument odpovídá schématu
Úprava XML Schématu Detailní pokrytí XML Schématu je předmětem kurzu 4iz238 Tento kurz pokrývá pouze základní úpravy XML schémat bez jmenných prostorů Komentář k souboru zbozi_feed.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element type="SHOP_TYPE" name="SHOP"/> Dokument musí obsahovat element "SHOP", struktura tohoto elementu je dána typem SHOP_TYPE Typy XML Schématu jsou komplexní a jednoduché.
Komplexní typ Komplexní typy se mohou skládat z elementů a atributů. Například SHOP_TYPE je komplexní typ: <xs:complexType name="SHOP_TYPE"> <xs:sequence minOccurs="1" maxOccurs="unbounded"> <xs:element type="SHOPITEM_TYPE" name="SHOPITEM"></xs:element> </xs:sequence> </xs:complexType> Elementy typu SHOP_TYPE musí obsahovat alespoň jeden element SHOPITEM, který je typu SHOPITEM_TYPE
Element typu SHOPITEM_TYPE SHOPITEM_TYPE je opět komplexní typ. Skládá se z elementů DESCRIPTION, DUES,… FIRMY_CZ. Atribut minOccurs a maxOccurs udává, kolikrát se může element vyskytovat, výchozí hodnota atributu je 1. Pokud nejsou atributy uvedeny, musí se element vyskytovat právě jednou. <xs:complexType name="SHOPITEM_TYPE"> <xs:all> <xs:element name="PRODUCT" type="PRODUCT_NAME"/> <xs:element name="DESCRIPTION" type="PRODUCT_DESCRIPTION"/> <xs:element minOccurs="0" name="DUES" type="CZK_PRICE"/> <xs:element minOccurs="0" name="DISCUSSION_SIZE" type="xs:nonNegativeInteger"/> <xs:element minOccurs="0" name="DISCUSSION_URL" type="xs:anyURI"/> <xs:element name="AVAILABILITY" type="xs:nonNegativeInteger" minOccurs="0"/> <xs:element minOccurs="0" name="SHOP_DEPOTS" type="xs:string"/> <xs:element name="URL" type="xs:anyURI"/> <xs:element name="IMGURL" type="xs:anyURI" minOccurs="0"/> <xs:element name="ITEM_TYPE" type="ITEM_TYPE_TYPE" minOccurs="0"/> <xs:element name="AVAILABILITY" minOccurs="0" type="xs:nonNegativeInteger"/> <xs:element minOccurs="0" name="PRICE" type="CZK_PRICE"/> <xs:element name="VAT" minOccurs="0" type="VAT_TYPE"/> <xs:element name="PRICE_VAT" type="CZK_PRICE" minOccurs="0"/> <xs:element name="TOLLFREE" minOccurs="0" maxOccurs= "1" type="TOLLFREE_TYPE"> </xs:element> <xs:element name="FIRMY_CZ" minOccurs="0" type="FIRMY_CZ_TYPE"/> </xs:all> </xs:complexType> Instrukce <xs:all> udává, že elementy mohou být v XML dokumentu uvedeny v libovolném pořadí
Jednoduchý typ XML Schéma obsahuje základní / primitivní datové typy jako xs:string, xs:boolean, xs:decimal, xs:dateTime, xs:anyURI.. Můžeme definovat vlastní datové typy restrikcí nebo odvozením existujících datových typů <xs:element name="PRODUCT" type="PRODUCT_NAME"/> … <xs:element minOccurs="0" name="DISCUSSION_URL" type="xs:anyURI"/> <xs:element name="DESCRIPTION" type="PRODUCT_DESCRIPTION"/> Se odvolává na uživatelsky definovaný datový typ: <xs:simpleType name="PRODUCT_DESCRIPTION"> <xs:restriction base="xs:string"> <xs:minLength value="1"/> <xs:maxLength value="512"/> </xs:restriction> </xs:simpleType> Tento uživatelsky definovaný datový typ vzniknul odvozením restrikcí od předdefinovaného datového typu xs:string. Restrikce spočívá v tom, že přípustný popis produktu musí mít alespoň jeden znak a nejvíce 512 znaků.
Příklad rozšíření XML schématu Rozšíření o výrobce produktu <xs:complexType name="SHOPITEM_TYPE"> <xs:all> <xs:element name="PRODUCT" type="PRODUCT_NAME"/> <xs:element name="DESCRIPTION" type="PRODUCT_DESCRIPTION"/> <xs:element name= "MANUFACTURER" type="xs:string" minOccurs="0" /> … Na libovolné místo v definici komplexního typu vložíme nový řádek, který zavádí nový nepovinný element MANUFACTURER
Uživatelsky definovaný jednoduchý typ Rozšíření o EAN Kód <xs:complexType name="SHOPITEM_TYPE"> <xs:all> <xs:element name="PRODUCT" type="PRODUCT_NAME"/> <xs:element name="DESCRIPTION" type="PRODUCT_DESCRIPTION"/> <xs:element name= "MANUFACTURER" type="xs:string" minOccurs="0" /> <xs:element name= "EAN" type="EANTYPE" minOccurs="0" /> … </xs:all> </xs:complexType> EAN bychom mohli definovat jednoduše přímo jako xs:integer, ale můžeme využít uživatelského typu ke kontrole počtu číslic. <xs:simpleType name="EAN_TYPE"> <xs:restriction base="xs:integer"> <xs:totalDigits value="13"></xs:totalDigits> </xs:restriction> </xs:simpleType> Pokud může XML obsahovat EAN13 nebo EAN8 kód, můžeme využít regulárního výrazu <xs:simpleType name="EAN_TYPE"> <xs:restriction base="xs:integer"> <xs:pattern value="[0-9]{13}|[0-9]{8}"></xs:totalDigits> </xs:restriction>
XSL(T) Stylový jazyk Oddělení obsahu dokumentu od jeho vzhledu Plní dvě funkce: Transformace XML dokumentů (XSLT) Definice vzhledu formátování (XSL)
Použití stylů, význam
Připojení stylu k dokumentu <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet href="mujstyl.xsl" type="text/xsl"?> <dokument> ... </dokument>
Zpracování stylu - šablony Jsou základem každého stylu, základní tvar je: <xsl:template match="vzor"> tělo šablony </xsl:template> Tělo šablony definuje, jak se budou části šablony, vyhovující konkrétnímu výrazu, zpracovávat.
Klíčové příkazy v těle šablony <xsl:value-of select="výraz"> Vybere obsah textových uzlů, které jsou potomky elementu určeného pomocí výrazu. Tento výraz použijeme, pokud nechceme aplikovat na další šablony. <xsl:apply-templates> Daná větev stromu se má zpracovávat dále (další potomci uzlu, pro který je vybrána šablona, se nezpracovávají automaticky) a mají se pro její uzly hledat odpovídající šablony.
Podmíněné zpracování Podmíněný příkaz <xsl:if> <xsl:if test="podmínka"> příkazy </xsl:if> Pokud je výraz pravdivý, provedou se příkazy v této podmínce. Není zde k dispozici část else, místo toho se využívá <xsl:choose>
XSL Transformace, konkrétně XSLT transformace se skládá ze šablon (template) <xsl:template match="SHOP"> Atribut match obsahuje XPath výraz určující uzly na které se má šablona uplatnit. Tato šablona se má uplatnit na kořenový uzel – element SHOP Výklad jazyka XPath přesahuje rámec kurzu 4iz210. Pro účely seminární práce není třeba nové šablony přidávat nebo měnit množinu uzlů, na které se šablony aplikují. Pokud se šablona uplatní, vypíše se její obsah na výstup. V tomto případě se jedná o značky jazyka HTML. <html> <head> <title>Nabídka produktů našeho eshopu</title> </head> <h1>Výpis produktů:</h1> … <!-- Příkaz pro nalezení a provedení šablony pro element SHOPITEM--> <xsl:apply-templates select="SHOPITEM"/> </body> </html> </xsl:template>
Šablona pro zpracování kořenového elementu Ukázkový XML Feed obsahuje dvě šablony, První šablona zpracuje kořenový element XML dokumentu a vypíše základní strukturu výstupního HTML souboru <xsl:template match="SHOP"> <html> <head> <title>Nabídka produktů našeho eshopu</title> </head> <body> <xsl:apply-templates select="SHOPITEM"/> </body> </html> Instrukce <xsl:apply-templates select="SHOPITEM"/> Zavolá šablonu pro výpis konkrétních produktů.
Úprava šablony V šabloně upravte HTML kód <xsl:template match="SHOP"> <html> <head> <title>Seznam služeb nabízený firmou XYZ</title> </head> <body> <h1>Stručná charakteristika portfolia firmy </h1> … <h2> Seznam služeb</h2> <xsl:apply-templates select="SHOPITEM"/> <strong>Nebudete-li s našimi službami spokojeni, vrátíme vám peníze!</strong> </body> </html> Tučně jsou označeny provedené úpravy.
Šablona pro zpracování konkrétní položky <xsl:template match="SHOPITEM"> <hr/> <h2><xsl:value-of select="PRODUCT"/></h2> <table> <tr><td rowspan="4" ><img src="{IMGURL}" alt=""/></td><td>Popis</td><td><xsl:value-of select="DESCRIPTION"/></td></tr> <!-- XML dokument musí obsahovat PRICE nebo PRICE_VAT a VAT--> <xsl:if test="PRICE"><tr><td width="150px">Cena v Kč bez DPH</td><td><xsl:value-of select="PRICE"/></td></tr></xsl:if> <xsl:if test="PRICE_VAT"><tr><td>Cena v Kč s DPH</td><td><xsl:value-of select="PRICE_VAT"/></td></tr></xsl:if> <xsl:if test="VAT"><tr><td>Sazba DPH</td><td><xsl:value-of select="VAT"/></td></tr></xsl:if> </table> </xsl:template> Podmíněný výpis obsahu elementu Instrukce xsl:if zajistí, že její obsah se vypíše, pouze pokud je XPath výraz v atributu test splněn. <xsl:if test="PRICE"><tr><td width="150px">Cena v Kč bez DPH</td><td><xsl:value-of select="PRICE"/></td></tr></xsl:if> Řádek s cenou bez DPH je vypsán, obsahuje-li právě zpracovávaná položka element cena Hodnotu z XML souboru vypíšeme pomocí instrukce xsl:value-of select= "XPath výraz" Cena aktuálně zpracovávané položky je uložena v jejím dětském elementu PRICE, XPath výraz je v tomto případě jednoduchý – na dítě aktuálního elementu odkážeme pouhým uvedením jeho názvu. <xsl:value-of select="PRICE"/>
Ukázková úprava šablony <xsl:template match="SHOPITEM"> <hr/> <h2><xsl:value-of select="PRODUCT"/></h2> <xsl:if test="AVAILABILITY>0"><font style="color:red">Pozor, tento produkt je k dodání až za <xsl:value-of select="AVAILABILITY"/>dní!</font></xsl:if> <table> <tr><td rowspan="4" ><img src="{IMGURL}" alt=""/></td><td>Popis</td><td><xsl:value-of select="DESCRIPTION"/></td></tr> <xsl:if test="PRICE"><tr><td width="150px">Cena v Kč bez DPH</td><td><xsl:value-of select="PRICE"/></td></tr></xsl:if> <xsl:if test="PRICE_VAT"><tr><td>Cena v Kč s DPH</td><td><xsl:value-of select="PRICE_VAT"/></td></tr></xsl:if> <xsl:if test="VAT"><tr><td>Sazba DPH</td><td><xsl:value- of select="VAT"/></td></tr></xsl:if> <xsl:if test="EAN"><tr><td>EAN kód</td><td><xsl:value-of select="EAN"/></td></tr></xsl:if> </table> </xsl:template>
SW - Kernow (opensource) http://kernowforsaxon.sourceforge.net/ Program není nutné instalovat, stačí rozbalit a spustit
Úprava XML schématu a XML souboru XSD soubor (schéma) Výsledek validace
Uložení Upravené schéma a XML Soubor si nezapomeňte uložit zkopírováním přes schránku do souboru.
Úprava XSLT transformace XML Soubor Hlášení, pokud je chyba v transformaci Výstup transformace
Uložení Upravenou XSLT transformaci si nezapomeňte uložit zkopírováním přes schránku do souboru.
Validace proti schématu XML Schéma Validovaný XML dokument Výsledek validace
XSL Transformace – souborový vstup Pokud XML schéma a XSLT transformaci upravené v Schema Sandbox a XSLT Sandbox uložíte do souboru
SW – Oxygen (komerční) Alternativou k open source programu Kernow je program Oxygen, který nabízí mnohem větší komfort při tvorbě XML dokumentů, XSL transformacích a validaci. Oxygen nabízí mj. code completion a XSLT debugger. Na učebnách ho najdete v Application Exploreru Pro účely seminární práce si ho můžete nainstalovat i na domácí počítač či notebook - licenci získáte (oproti vašemu xname a heslu do školní sítě) na https://badame.vse.cz/oxygen/index.php
Oxygen – hlavní obrazovka Pás s otevřenými soubory Vedlejší okno, kde je možné označovat jednotlivé položky (všimněte si, že v hlavních okně je související položka SHOPITEM označená) Hlavní okno
Validace XML souboru Validaci je možno uskutečnit dvojím způsobem: Pomocí schématu jakožto externího souboru. Přiřazením schématu přímo do XML souboru.
Validace externím souborem Pro validaci externím souborem zvolíme ikonu Validate Zde vybereme External validation Následně soubor najdeme a potvrdíme, čímž se validace provede.
Validace přiřazením schématu Pro přiřazení schématu do XML souboru zvolíme ikonu Associate schema V následujícím menu vybereme schéma a potvrdíme
Validace přiřazením schématu Přiřazení schématu do XML souboru si můžeme ověřit tím, že přibylo přiřazení schématu (viz. obrázek) Nyní můžeme zvalidovat pomocí ikony Validate
Výsledek validace Validace může buď proběhnout bez chyb (dokument je zvalidován a je v souladu se schématem) nebo může nějaké chyby obsahovat. Validace neproběhla bez chyb Validace proběhla bez chyb Seznam chyb najdeme v okně umístěném ve spodní části obrazovky
Přiřazení XSLT stylu XSLT styl přiřadíme pomocí následující ikony (která se nachází vedle přiřazení schématu) V následujícím okně opět vybereme příslušný soubor a potvrdíme. Nyní si opět můžeme všimnout toho, že v XML souboru máme přiřazenou šablonu se stylem.
Přiřazení XSLT stylu
Transformace Nyní klikneme na ikonu Apply transformation scenario, potvrdíme a dojde k vygenerování HTML stránky a jejímu spuštění ve výchozím prohlížeči.
Výsledek transformace
Procvičování Do ukázkových souborů přidejte alespoň dva nové elementy (vyplňte u 5 produktů ze stránky http://www.fair-bio.cz/ ) Změňte styl tak, aby byl ve výstupu nadpis každého produktu červeně a podtržený, text více odsaďte od obrázku a v tabulce budou u vámi vybraných (naeditovaných) produktů zobrazeny příslušné informace. Aktivujte jednoduché okraje jednotlivých buněk tabulky. Po provedených úpravách vygenerujte HTML stránku, která musí všechny výše uvedené změny zohlednit.
Zdroje http://www.kosek.cz/clanky/xml/index.html http://www.kosek.cz/clanky/xml/xml- xsl.html http://help.seznam.cz/cz/specifikace- xml.html Přednáška XML od Tomáše Kliegra