XML merkintäkielten perusteet Luento 2 - XSLT Pekka Aarnio
Luennon sisältö OSA 1: XSLT-kieli OSA 2: XML Nimiavaruudet (OSA 3: AutomationML lyhyt kuvaus harjoitustehtävän tueksi)
Luento 2: OSA1 XSL-MUUNNOKSET
OSA 1-Sisältö XSLT:n käyttö tietointegroinnissa XSLT-prosessoinnin vaiheet Tietosisältöjen käsittelysäännöt Value-of For-each ja sort ehtolauseet Rakenteiden luontisäännöt Rakenteiden kopiointi Uusien elementtien ja attribuuttien luonti Sapluunat eli templatet Edistyneet piirteet
XSLT:N KÄYTTÖSOVELLUKSET
(Luento 1: XML:n käyttösovellukset) XSLTdoc. Sovellus 1 XSLTprosessori XMLprosessori XMLdoc1. XMLdoc2. Sovellus 2 XML:a voidaan käyttää perustuen valmiiseen kielioppiin (esim. AutomationML, B2MML, MathML) käyttäen omaa sovelluskohtaista kielioppia Järjestelmien tietointegraatiossa tarvitaan muunnoksia kielestä toiseen Eri organisaatioiden tietojärjestelmät käyttävät usein erilaista XMLesitystapaa samankin sovellusalueen tietojen esittämiseen XSLT-prosessori muuntaa dokumentin (doc1.xml) toiseen muotoon (doc2.xml) lukemansa XSLT-dokumentin sääntöjen ohjaamana (ks. Kuva)
Tietointegraatio XML tiedonsiirto XSLTdoc. XML-tiedonsiirto kahden organisaation välillä: XSL-muunnos voidaan tehdä lähettävässä päässä (a) tai vastaanottavassa päässä (b) tai keskitetysti ns. hub:ssa (c) Sovellus 1 XSLTprosessori XMLprosessori XMLdoc1. XMLdoc2. Sovellus 2 XSLTdoc. Sovellus 1 XMLprosessori XMLdoc1. XSLTprosessori XMLdoc2. Sovellus 2 XSLTdoc. Message Hub Sovellus 1 XMLprosessori XMLdoc1. XSLTprosessori XMLdoc2. Sovellus 2
Integraatio-ongelma N erillistä organisaatiota, jotka kaikki käyttävät omaa erityistä XML-tiedon esitysmuotoa. Jokaisen organisaation täytyy tehdä N-1 erilaista muunnosta vastaanottaessaan muiden lähettämiä xml-dokumentteja (olettaen, että kaikki lähettävät omassa esitysmuodossaan) XSLT 4-1 XSLT 3-1 XSLT 2-1 XSLT 1-2 XSLT 4-2 XSLT 3-2 XSLT 1-4 XSLT 2-4 XSLT 3-4 XSLT 4-3 XSLT 1-3 XSLT 2-3
Tietointegraatio Standardoitu tiedonsiirto XSLTdoc. Sovellus 1 XSLTprosessori XMLprosessori XMLdoc1. XML- STD Sovellus 2 XSLTdoc. XMLprosessori XSLTprosessori XMLdoc3. Sovellus 3 XMLprosessori Sovellus 4
Tietointegraatio Standardoitu tiedonsiirto N erillistä organisaatiota, jotka kaikki käyttävät tiedonsiirrossa standardia XMLesitysmuotoa. Jokaisen organisaation täytyy tehdä vain 0-1 erilaista muunnosta sekä vastaanottaessaan että lähettäessään standardeja xml-dokumentteja (muunnoksia ei tarvita lainkaan, jos std-muotoa käytetään myös organisaation sisällä) XSLT STD - 1 XSLT STD - 2 XML STD XSLT STD - 4 XSLT STD - 3
XSLT-TYYLISIVU JA PROSESSOINTI Online xslt tool: http://www.xpathtester.com/xslt
XSLT-prosessointi (1/2) XSLT-tyylisivu XSLTdoc. Sisään luettava lähtödokumentti XSLTprosessori XMLdoc1. XMLdoc2. Tuotettava tulosdokumentti XSLT-prosessori muuntaa lähtödokumentin (doc1.xml) uuteen muotoon tulosdokumentiksi (doc2.xml) XSLT-dokumentin sisältämien sääntöjen ohjaamana. Yleensä tavoitteena on lähtödokumentin tietosisällön esittäminen jossain uudessa rakennemuodossa Uuteen dokumenttiin voidaan luoda aivan toisenlainen rakenne uusine elementteineen, attribuutteineen ja tekstisisältöineen Toisaalta uuteen dokumenttiin voidaan myös kopioida lähdedokumentin elementtejä ja attribuutteja tietosisältöineen Uuden dokumentin rakenne ja tietosisältö voi siis olla (melkein) minkälainen tahansa Sen ei tarvitse olla edes XML-dokumentti Se voi olla html-dokumentti tai pelkkä tekstidokumentti
XSLT-prosessointi (2/2) XSLTprosessori XSLTdoc. XMLdoc1. XMLdoc2. XSLT-prosessoinnin vaiheet 1. XSLT-prosessori lukee XML-dokumentin ja XSLT-tyylisivun (XSLT-stylesheet) 2. Se analysoi ja jäsentää XML-dokumentin solmupuuksi (node-tree) 3. Se käy läpi solmupuuta solmu kerrallaan aloittaen juurisolmusta (/) 4. Ohjeet/säännöt ko. solmun käsittelyyn se hakee XSLT-tyylisivun ko. solmun käsittelyyn tarkoitetusta sapluunasta/mallinteesta (template) 5. Sapluunan match-attribuutin XPath-lauseke määrittää sen solmun/solmujoukon, jonka käsittelyyn sapluunan säännöt on tarkoitettu 6. Prosessori aloittaa sääntöjen lukemisen juuri-sapluunasta (root template), joka on oltava jokaisessa XSLT-dokumentissa: <xsl:template match= / > 7. Säännöt voivat ohjata joko kirjoitusta tulosdokumenttiin tai käsiteltävän solmujoukon jatkoprosessointia ali-sapluunakutsuineen: <xsl:apply-templates select= sub-node >
Tyylisivun rakenne (1/2) XSLT-tyylisivu koostuu joukosta määrityksiä ja sapluunoita (template) Määrityksillä muokataan tyylisivun tuottamaan dokumenttiin liittyviä asioita tai määritellään muuttujia myöhempää käyttöä varten Sapluunat sisältävät dokumentin muunnossa käytettävät säännöt, sisään luetun dokumentin käsittelyohjeita ja tuotetun dokumentin elementtejä sana sapluuna" kuvaa toimintaa melko hyvin: osa tuotettavan dokumentin elementeistä on määritelty pysyvästi näiden elementtien väliin tuotetaan lisää sisältöä käsittelyohjeiden pohjalta [Frosterus] 14
Tyylisivun rakenne (2/2) Tyylisivun kaikki elementit ovat elementin <xsl:stylesheet> sisällä <xsl:stylesheet version="1.0 xmlns:xsl="http://www.w3.org/1999/xsl/transform">... </xsl:stylesheet> Tyylisivun tulostusmuoto määritellään <xsl:output> elementillä Metodiksi voidaan määritellä: xml, html tai text Indent-attribuutilla voidaan tulostus sisentää < xsl:output method="html indend= true /> Tyylisivujen sisältämät sapluunat määritellään <xsl:template > elementeillä <xsl:template match= Xpath-expression"> Muunnettavan XML-dokumentin alussa viitataan tyylisivuun prosessointiohjeella <?xml-stylesheet type="text/xsl" href="ihmeet_lec2ex1.xsl"?> 15
Juurisapluuna - root template XSLT muunnos aloitetaan juurisapluunan (root template) prosessoinnilla. <xsl:template match= / > muunnossääntöjä.</xsl:template > Se on oltava jokaisessa xslt-dokumentissa Se määrittää miten xml-dokumentin juurisolmua prosessoidaan Sen sisällä voi olla ali-sapluunoita Muunnossääntöjen prosessointi jatkuu viimeiseen juuri-sapluunan sääntöön asti Se voi sisältää muiden sapluunoiden soveltamiskäskyjä <xsl:apply-templates select= xpath-exp /> (Huom: Sapluunoista lisää myöhemmissä kalvoissa)
Esimerkki1: XSLT tyylisivu html-dokumentin luonti Ihmeet_lec2ex1.xsl [http://www.kehogo.com/examples]
template Esimerkki1: XSLT tyylisivu html-dokumentin luonti XML1: Ihmeet_lec2ex1.xml XSLT: Ihmeet_lec2ex1.xsl tulostusmuoto XSLTprosessori XML2: Ihmeet_lec2ex1.html
Esimerkki1: XSLT tyylisivu html-dokumentin luonti XSL-muunnoksen voi ajaa XML-editorilla, jolloin se tuottaa tuloksena htmltiedoston (ihmeet_lec2ex1.html), jonka voi avata katseltavaksi internet-selaimella Internet-selaimet (Firefox, Chrome, IE, jne.) osaavat myös suoraan tehdä XSLmuunnoksen, jos avattavan XML-tiedoston alussa on viittaus XSLT-tiedostoon Tulosdokumentti Ihmeet_lec2ex1.html Tulosdokumentin selainnäkymä
http://www.w3schools.com/xsl/default.asp TEKSTISISÄLTÖJEN KÄSITTELYSÄÄNNÖT
Arvojen poimiminen XSLT-tyylisivuissa yleensä poimitaan suuri joukko arvoja sisään luettavasta dokumentista ja sijoitetaan tuotettavaan dokumenttiin Elementtien tekstisisältöjä ja attribuuttien arvoja siirretään tai kirjoitetaan näkyviin Arvojen poiminta tapahtuu elementillä <xsl:value-of select="xpath-lauseke"/> elementti poimii XPath-lausekkeen mukaisen arvon ja sijoittaa sen tuotettavaan dokumenttiin Huomaa, että Xpath-lausekkeen määrittämän solmujoukon ensimmäisen solmun arvo tulostetaan mikäli arvoa ei ole, elementti ei tuota mitään Online xpath tool: http://www.xpathtester.com/xpath [Frosterus] 22
Toisto XSLT sisältää hyvin yksinkertaisen toistorakenteen se voi toistaa tietyn sapluunan osan kaikille tietyllä XPath-lausekkeella valituille solmuille ei ole mahdollisuutta toistaa asioita esimerkiksi viittä kertaa toistojen määrä riippuu aina sisään luettavasta dokumentista Toisto toteutaan elementillä <xsl:for-each> elementissä on XPath-lauseke sääntönä ja elementin sisällä oleva XSLT-koodi toistetaan kaikille säännön valitsemille elementeille: <xsl:for-each select="name"> <xsl:value-of select="@first"/>. <xsl:value-of select="@last"/>@aalto.fi <br/> </xsl:for-each> [Frosterus] 10/06/09 23
Esimerkki: XML-dokumentti Polygons_with_size.xml <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href= to_square.xsl"?> <polygons> <circle color="blue" size= 5">ympyra1</circle> <circle color="blue" size= 5">ympyra2</circle> <circle color="blue" size="5">ympyra3</circle> <circle color="blue" size= 5">ympyra4</circle> <circle color="blue" size= 5">ympyra5</circle> </polygons> ympyrä1 ympyrä2 ympyrä3 ympyrä1 ympyrä5 Kuva: Lähtödokumentin polygons_doc1.xml rakenne.
xsl:value-of & xsl:for-each xsl:value-of Huom: palauttaa vain XPathsolmujoukon ensimmäisen solmun arvon* xsl:for-each Mahdollistaa kaikkien solmujen läpikäynnin luupissa ympyrä1 ympyrä2 ympyrä3 ympyrä1 ympyrä5
Järjestäminen XSLT tarjoaa mahdollisuuden järjestää sisään luettavan dokumentin elementit uuteen järjestykseen ennen sapluunan valintaa käytetään elementtiä <xsl:sort select="..."> järjestäminen tapahtuu select-lausekkeen tuottamien arvojen pohjalta elementille voi antaa useita lisäattribuutteja järjestämisen ohjaamiseksi Järjestäminen tapahtuu joko <xsl:apply-templates> tai <xsl:for-each> elementtien sisällä <xsl:apply-templates select="sect1/title"> <xsl:sort select="text()"/> </xsl:apply-templates> Järjestämiselementtejä voi olla useita peräkkäin [Frosterus] 26
For-each & sort Kuva 1: Lähtödokumentin polygons_doc1.xml rakenne. Kuva 2: XSLT-tyylisivu.xsl. Kuva 3: Tulosdokumentin POLYGONS_doc2.xml rakenne.
Ehdolliset osiot XSLT:ssa on kaksi rakennetta ehdollisten osioiden laatimiseksi (IF ja CHOOSE) molemmissa käytetään samaa testirakennetta testinä on XPath-lauseke ja se läpäistään, jos lausekkeessa oleva ehto toteutuu lauseke evaluoituu ei-tyhjäksi joukoksi (ei erillistä ehtoa) ehtoina ovat normaalit =, <, > ja!= HUOM: < ja > pitää kirjoittaa XML-syntaksin takia < ja > Online xpath tool: http://www.xpathtester.com/xpath [Frosterus] 28
If-lauseke If-lauseke on yksinkertaisempi ehdoista sen sisällä oleva mallineen osa suoritetaan ehdon toteutuessa <xsl:if test="@target > 10"> <xsl:attribute name="target"> <xsl:value-of select="@target"/> </xsl:attribute> </xsl:if> HUOM: IF lausekkeessa ei ole else if tai edes else osaa (toteutetaan käytännössä uusilla iflausekkeilla) 29
Choose-lauseke Choose-lauseke mahdollistaa usean ehtolausekkeen yhdistämisen vain yksi ehtolausekkeista suoritetaan ensimmäisen onnistuneen testin jälkeen jatketaan choose-lausekkeen jälkeisistä elementeistä lausekkeessa voi olla myös erillinen vaihtoehto tilanteella, jossa yksikään testi ei toteutunut 30
Choose-esimerkki Choose When Otherwise 31
http://www.w3schools.com/xsl/default.asp RAKENTEIDEN LUONTISÄÄNNÖT
Elementtien Kopiointi XSLT mahdollistaa myös kopioinnin sisään luettavasta dokumentista tuotettavaan dokumenttiin kopioinnissa dokumenttisirpale (document fragment) kopioidaan sellaisenaan ei tarvita erillisiä sääntöjä jokaiselle osaselle toisaalta ei voida myöskään vaikuttaa lopputulokseen Kopiointi on osa sapluunaa kopiointi suoritetaan elementillä <xsl:copy-of> elementti voi määritellä myös XPath-lausekkeen, joka määrää kopioitavat elementit <xsl:copy-of select="..."/> jos lauseketta ei määritellä, kopioidaan nykyinen solmu elementillä <xsl:copy> kopioidaan vain nykyinen elementti ilman sen attribuutteja ja lapsia 33
Elementtien ja attribuuttien luonti XSLT mahdollistaa elementtien luonnin dynaamisesti käytetään elementtiä <xsl:element> <xsl:element name= new-element-name"> <xsl:apply-templates/> </xsl:element> Vastaavasti myös attribuutteja voidaan luoda lennossa Käyttäen elementtiä <xsl:attribute> attribuutti liitetään viimeksi määritellyn elementin sisällä ESIM1: <a> <xsl:attribute name="href"> <xsl:value-of select="substring(@src, 2) /> </xsl:attribute> <xsl:value-of select="@title"/> </a> ESIM2: <xsl:template match="circle > <xsl:element name="square"> <xsl:attribute name="color">red</xsl:attribute> </xsl:element> </xsl:template> 34
http://www.w3schools.com/xsl/default.asp SAPLUUNAT (TEMPLATES)
Sapluunat Sapluuna koostuu kahdesta osasta 1. sapluunan laukaiseva sääntö 2. sapluunan sisältö Sääntö määritetään XPath-lausekkeella Sapluunan sisällön rakenteen määrää tuotettavan dokumentin rakenne ja sisältö sapluuna voi tuottaa uusia elementtejä ja attribuutteja, muun muassa, tuotettuun dokumenttiin sapluuna voi valita sisään luetun dokumentin elementtejä kutsua uusia mallineita elementtien pohjalta käsitellä elementit itse sapluuna voi sisältää ehtoja ja toistoja http://www.w3schools.com/xsl/default.asp [Frosterus] 36
Sapluunoiden valinnan ohjaus Sapluuna voi käynnistää sapluunan haun mille tahansa XML-dokumentin osalle (solmulle tai solmujoukolle), joka määritellään Xpath-lausekkeella <xsl:apply-templates select= Xpath-lauseke /> Prosessori käsittelee solmut dokumenttijärjestyksessä (document order) Myös attribuutti, tekstisirpale tai muu XML-dokumentin osa voidaan valita yleisin tapaus on käsitellä nykyisen solmun alla (sisällä) olevat solmut: <xsl:apply-templates/> (*) voidaan myös valita vain tietyt solmut käsittelyyn: <xsl:apply-templates select="name street city postal-code"/> valinta voi kohdistua muualla oleviin solmuihin: <xsl:apply-templates select="//distant"/> Valinta voidaan tehdä myös ehdolliseksi <xsl:apply-templates select="/ancient_wonders/wonder[@build < 800]"/> http://www.w3schools.com/xsl/xsl_apply_templates.asp (*) Huom: Oletus-sapluuna: Jos kutsutaan sapluunoita ilman select-valintaa, prosessori hakee kullekin solmulle sopivimman löytämänsä sapluunan. Jos sapluunaa ei löydy käytetään oletus-sapluunaa, joka tulostaa elementtien tekstisisällöt. 37
Sapluunoiden valinnan ohjaus Huomaa, että xslt-prosesori käy läpi kaikki Xpath-lausekkeella (select) valitut solmut kutsuen niihin sopivaa sapluunaa (match) ja toteuttaa sapluunan sisältämät toiminnot (tulosdokumenttiin kirjoittamisen) jokaiselle solmujoukon solmulle Eli xsl:for-each luuppeja ei tarvitse erikseen kirjoittaa Esimerkki: Select-lauseke valitsee sapluunan <xsl:template match= circle > Tämän templaten sääntöjä sovelletaan kaikkien square-elementtien kaikkiin circle-elementteihin (7 kpl) <xsl:template match= /"> <xsl:apply-templates select="/polygons/square/circle"/> </xsl:template> <xsl:template match= square"> </xsl:template> v <xsl:template match= circle"> </xsl:template>
Esimerkki: Template Kuva 1: Lähtödokumentin polygons_doc1.xml rakenne. Kuva 1: Tulosdokumentin POLYGONS_doc2.xml rakenne.
Esimerkki: Tulosdokumentti <?xml version="1.0" encoding="utf-8"?> <POLYGONS> <square> </square> <square> </square> <square> </square> <square> </square> <square> </square> <circle color="red" size="4"/> <circle color="red" size="2"/> <circle color="red" size="5"/> <circle color="red" size="1"/> <circle color="red" size="3"/> </POLYGONS> Kuva 1: Tulosdokumentin POLYGONS_doc2.xml rakenne.
Esimerkki: Template rekursiivinen kutsu Kuva 1: Lähtödokumentin polygons_doc1.xml rakenne. Kuva 1: Tulosdokumentin POLYGONS_doc3.xml rakenne.
http://www.w3schools.com/xsl/default.asp EDISTYNEET PIIRTEET
Edistyneemmät piirteet Edellä esitelyillä toiminnoilla pystyy muuntamaan XML-dokumentin muodosta toiseen keinot kuitenkin loppuvat, jos sisään luetun dokumentin elementtejä pitää käsitellä useasti tai lopputulos riippuu luetun dokumentin attribuuttien arvoista vastaavasti XSLT-tyylisivun toimintaa saatetaan haluta ohjata ulkopuolelta Ratkaisuja on useita erilaisia toisto muuttujien käyttö ehdolliset osiot sapluunoissa erilaisten moodien käyttö sapluunoiden nimeäminen ja kutsuminen ilman säännön laukeamista [Frosterus] 43
Edistyneemmät piirteet Moodit Muuttujat ja Parametrit (Nimetyt sapluunat) (numerointi)
Moodit Joskus sama XML-dokumentin osa halutaan käsitellä useita kertoja eri konteksteissa (ks. harjoitustehtävä) hyvä esimerkki on sisällysluettelon automaattinen laatiminen sisällysluettelo rakentuu otsikoista, jotka täytyy esittää myös leipätekstin sisällä Mallineeseen voidaan liittää moodi (mode) <xsl:template match="header[@level=1]" mode="toc">... </xsl:template> mallinnetta ei voida valita, ellei myös moodia ole asetettu käynnistettäessä mallineen etsintää: <xsl:apply-templates mode="toc"/> [Frosterus] 45
Muuttujat (1/2) Tyylisivulla voi olla käytössä muuttujia muuttujat asetetaan elementillä <xsl:variable name="..."> ja niiden arvoa ei voi muuttaa myöhemmin (ks. alla) muuttujat ovat käytössä koko tyylisivulla muuttujiin viitataan syntaksilla $nimi muuttujiin voidaan viitata myös {$nimi} sapluunan elementtien sisällä, vrt. attribuutit Muuttujat ovat näppäriä laadittaessa helposti säädettäviä tyylisivuja muokattavat tiedot sijoitetaan muuttujiin, joita säätämällä tyylisivun toiminta tai tuotettava dokumentti muuttuu Vaikka muuttujan arvoa ei voi muuttaa, se voidaan määrittää uudelleen alemmalla tasolla uusi arvo piilottaa aiemman arvon aiempi arvo on käytössä palattaessa takaisin ylemmälle tasolla 46
Muuttujat (2/2) Example: <xsl:variable name="domain">aalto.fi</xsl:variable>... <xsl:attribute name="href">http://www.<xsl:value-of select="$domain"/>/</xsl:attribute>... <info domain="{$domain}">aalto</info> Example2: <xsl:variable name="bodytextsize">10pt</xsl:variable> <xsl:template match="product"> <i><font size="{$bodytextsize}"> <xsl:apply-templates/></font></i><br/> </xsl:template> 47
XSLT param (1/2) <xsl:param> Element Declares a named parameter for use within an <xsl:stylesheet> element or an <xsl:template> element. Allows specification of a default value. Attributes: name= param_name Select= expression (returns the default value) Remarks: The value specified on the <xsl:param> element is a default value for binding. When the template or style sheet containing <xsl:param> is invoked, parameters are passed that are used in place of the default values. The <xsl:param> element must be declared as a direct child of an <xsl:template> element.
XSLT param (2/2) Example: <xsl:template name="getcount"> <xsl:param name="counted"> <xsl:value-of select="count(//book)"/> </xsl:param> <xsl:element name="strong"> Total Book Count: <xsl:value-of select="$counted"/> </xsl:element> See: https://msdn.microsoft.com/en-us/library/ms256096%28v=vs.110%29.aspx
xsl:param vs. xsl:variable Difference between xsl:param and xsl:variable The value of an xsl:param could be set outside the context in which it is declared. For example: <xsl:template...> <xsl:param name="p" select="'x'" /> <xsl:variable name="v" select="'y'" /> then you know that $v will always give you the string 'y'. But for $p the string 'x' is only a default: you will see a different value if the template is invoked with either xsl:apply-templates or xsl:call-template which contains an instruction such as: <xsl:with-param name="p" select="'not x'" />
OSA 2 NIMIAVARUUDET
Tietointegraatio tiedon yhdistäminen Luennon alun esimerkissä kuvattiin tiedonsiirtoa eri organisaatioiden välillä ja tarpeesta muuntaa vaihdettavaa XML-dokumentia muodosta toiseen käyttäen XSL-muunnoksia Tietointegraatiossa ei ole kuitenkaan kysymys vain tiedon rakenteen ja esitystavan muunnoksista vaan tarpeesta yhdistää (merge) eri sisällöntuottajien kokoamaa tietoa Tiedon yhdistämisessä tulee ongelmia, kun eri lähteet käyttävät samaa termiä/nimeä eri merkityksessä (homonym) (tai eri termejä merkitsemään samaa käsitettä (synonym)) XML-dokumenttien tietoja yhdistettäessä tämä ongelma näkyisi samannimisinä elementteinä tai attribuutteina, joiden merkitys ei kuitenkaan olisi sama Eri merkintäkielien käyttämien nimien tulee siis olla täysin (globaalisti) yksikäsitteisiä, jotta tietojen yhdistäminen ei aiheuta sekaannusta.
XML Nimiavaruudet XML Namespaces Keskeisin laajennos XML speksiin. XML-dokumentti voi sisältää elementtejä, jotka noudattavat eri rakenne määrityksiä (eri XML Scheman määrittelemää kielioppia), mutta ovat saman nimisiä. Törmäykseksi sanotaan tilannetta jossa kaksi elementtiä on nimetty samoin. Nimiavaruudet poistavat törmäysten aiheuttamat ongelmat. Johdonmukaisuuden ja yksikäsitteisyyden säilyttämiseksi pitää eri merkityksen omaavat elementit erotella toisistaan omiin ryhmiinsä, vaikka niiden nimi olisikin sama. jokainen kielioppi kuuluu omaan nimiavaruuteensa dokumentin elementit kytketään nimiavaruuksiin, jolloin elementin täydellinen nimi (nimiavaruuden nimen ja lokaalin nimen yhdistelmä) on globaalisti yksikäsitteinen. oletusarvoisesti attribuutti kuuluu samaan nimiavaruuteen kuin elementti, mutta myös attribuutin nimen eteen voi liittää nimiavaruuden
XML Nimiavaruudet XML Namespaces speksi ratkaisee saman nimisten elementtien aiheuttaman ongelman lisäämällä nimiavaruuden käsitteen elementtiin. Nimiavaruus on yksilöllinen tunnistemerkkijono URI (Uniform Resource Identifier) Nimiavaruus johdetaan yleensä olemassa olevasta yksikäsitteisestä URLnimestä (Uniform Resource Locator, www-osoite), joka liittyy nimen määrittelijään* https://autsys.tkk.fi/autt/ http://www.w3.org/1999/xsl/transform http://www.w3.org/2001/xmlschema Nimiavaruuden nimen tyypillinen rakenne: Protokolla; domain-nimi [;ns-hakemisto][;ns kuvaus] [;versio] http://www.pline.org/ns/transport/1.0 *HUOM: Nimiavaruus URI:n ei tarvitse viitata mihinkään tiettyyn dokumenttiin
Nimiavaruuden määrittely Käytetään attribuuttia xmlns <pline:production_line xmlns:pline="http://www.pline.org/ns/transport/1.0"> Määritellään nimiavaruus ja sen prefix-lyhenne ja käytetään sitä elementissä Esimerkissä nimiavaruus on http://www.pline.org/ns/transport/1.0 Esimerkissä nimiavaruuden prefix-lyhenne on pline Prefix erotetaan elementistä kaksoispisteellä : <pline:module>elevator</pline:module> Yleensä nimiavaruudet määritetään dokumentin juurielementissä käytettävissä tämän jälkeen kaikissa elementeissä Laajennettua nimeä, joka on nimiavaruuden ja elementin nimen yhdistelmä, kutsutaan kvalifioiduksi nimeksi (qualified name, Qname) http://www.pline.org/ns/transport/1.0#production_line
Perusnimiavaruus ja perintä Oletusnimiavaruuden yksinkertaistaa määrittelyjä Kaikki elementit eivät välttämättä määrittele nimiavaruutta dokumentissa voidaan määritellä oletusnimiavaruus (default namespace), jolloin kaikki määrittelyalueen sisällä (elementti ja kaikki sen jälkeläiset) olevat ilman prefixiä nimetyt elementit kuuluvat ko. nimiavaruuteen. määrittely juurielementissä attribuuttilla xmlns (ilman prefixiä) <root xmlns= http://www.pline.org/ns/transport/1.0 > Aloitus-tagissa määritelty nimiavaruus on käytössä kyseisen elementin loppu-tagiin asti Jos nimiavaruuden lyhenne on sama kuin aiemmin määritellyssä, korvaa uusi nimiavaruus vanhan elementin loppu-tagiin asti
Nimiavaruus esimerkki 1 Perusnimiavaruus (default namespace) [http://www.kehogo.com/examples]
Nimiavaruus esimerkki 2 Perusnimiavaruus (default namespace) Nimiavaruuden prefix-lyhenne [http://www.kehogo.com/examples]
Nimiavaruus esimerkki 3 Perusnimiavaruus (default namespace) Nimiavaruuden prefix-lyhenne Attribuuttien nimiavaruusmäärittely xmlns:wow= http://wowwow/colossus/ [http://www.kehogo.com/examples]
OSA 3: Sisältö Välikommentti: ID ja IDREF ja IDREFS AutomationML
ID ja IDREF ja IDREFS Attribuuttityyppi ID Käytetään elementin yksikäsitteiseen identifiointiin ID-attribuutin arvon on oltava yksikäsitteinen koko xml-dokumentissa Elementillä saa olla vain yksi ID-tyypin attribuutti Sen arvon tulee noudattaa XML-nimien sääntöjä* Attribuuttityyppi IDREF Toinen elementti voi tällöin viitata yksikäsitteisesti ID:llä identifioituun elementtiin Viittaamiseen käytetään IDREF-tyyppistä attribuuttia, jonka arvon on oltava jonkun samassa dokumentissa olevan elementin ID-tyyppisen attribuutin arvo Attribuuttityyppi IDREFS Useaan ID:llä identifioituun elementtiin voi viitata IDREFS-tyypin attribuutilla Attribuutin arvona on joukko ID arvoja välilyönnillä erotettuina <production_line> <unit> <lift_module modid="lm001"> <name>päätynostin PN1</name> </lift_module > <connection fromidref= LM001" toidref= SM001"/> </unit> <unit> <starter_module modid="sm001"> <name>starter-moduuli ST1</name> </starter_module> <connection fromidref="sm001" toidref="lm001"/> </unit> <connected_modules setidrefs= LM001 SM001 /> </production_line> *HUOM: ID:n arvo (ja elementin nimi) saa alkaa vain kirjaimella tai alaviivalla. Nimi saa sisältää kirjaimia, numeroita, alaviivoja ja pisteitä mutta se ei saa sisältää välilyöntejä (white space) HUOM: Attribuutin tyyppi määritellään XML Schemassa (Ks. 3. luento)
Puurakenne Suunnattu graafi ID ja IDREF-tyypin* attribuuteilla saadaan aikaan viittauksia xml-solmupuun haarojen välillä Näin voidaan esittää puu-rakennetta monimutkaisempia tietorakenteita kuten suunnattuja verkkoja *HUOM: Attribuutin tyyppi määritellään XML Schemassa (Ks. 3. luento)
OSA 3 [AutomationML] AUTOMATIONML
AutomationML Architecture Automation Markup Language is an XML schema-based data format designed for the vendor independent exchange of plant engineering information. The goal is to interconnect engineering tools from the existing heterogeneous tool landscape in their different disciplines, e.g. mechanical plant engineering, electrical design, process engineering, process control engineering, HMI development, PLC programming, robot programming etc. [AutomationML]
Relations in AutomationML Parent-Child Relation Class-Instance Relation Inheritance Relation Instance-Instance Relation
Parent-child-relation Parent-child-relations between object instances are used to represent hierarchical object structures and describe a consist-of-relation.
(luento1: XML Esimerkki) AutomationML InstanceHierarchy (parent-child/consists-of-relation)..prosessit koostuvat osa-prosesseista
Class-Instance-Relations Class-Instance-Relations Instances represent individual objects and are characterized by a unique identifier and parameter set. An AutomationML object shall be modelled as CAEX InternalElement as part of the CAEX InstanceHierarchy tree. The source class shall be indicated in the CAEX tag RefBaseSystemUnitPath of the instance. This tag shall comprise the full path and name of the source class. Instance of
Inheritance-Relations Inheritance-Relations Inheritance between classes shall be defined according to the IEC 62424. If inheritance is required, the parent class shall be specified using the CAEX tag RefBaseClassPath comprising the full path of the class according to IEC 62424. Sub-class of
Instance-Instance-Relations Instance-Instance-Relations are relations between two interfaces of arbitrary AutomationML objects. Instance-Instance-Relations shall be stored by means of the CAEX InternalLink functionality. InternalLinks should be stored at the InternalElement which is the lowest common parent of the corresponding connected CAEX objects. Instance-Instance-Relations shall be defined only between corresponding CAEX ExternalInterfaces The ExternalInterfaces should be derived directly or indirectly from one of the AutomationML standard interface classes.
Instance-Instance-Relations Link between
Inheritance Relation Production_line_AML.aml - SystemUnitClassLib Sub-class of Sub-class of
Parent-Child Relation & Class-Instance Relation Production_line_AML.aml - InstanceHierarchy Instance of
AutomationML - Rakennehierarkia Rakennehierarkiassa, jokainen objekti/osa esitetään InternalElementnimisenä elementtinä ja kokonaisuus-osa suhde esitetään sisäkkäisinä InternalElement-elementteinä. InternalElement-elementin attribuutit ovat Name ID RefBaseSystemUnithPath
AutomationML - Luokkahierarkia Laiteluokkakirjasto SystemUnitClassLib listaa laiteluokat, joihin rakennehierarkiassa InternalElement elementteinä esitetyt laiteinstanssit viittaavat. Jokainen laiteluokka esitetään yhtenä SystemUnitClass-elementtinä ja luokkien nimet esitetään sen Name-attribuutin arvona. Luokkien perintähierarkia esitetään viittauksena attribuutin RefBaseClassPath arvolla <SystemUnitClassLib Name="ProdLineSystemUnitClassLib"> <SystemUnitClass Name="GenericModule"/> Instance of <SystemUnitClass Name="GenericConveyor"/> <SystemUnitClass Name="BANDconveyor RefBaseClassPath= "ProdLineSystemUnitClassLib/GenericConveyor"/>
XSL-muunnos: PL.xml -> AML.xml kohdedokumentin (AML.xml) InternalElement:n Name-attribuutti saa arvokseen ko. rakenneosan nimen lähdedokumentissa (PL.xml), jos se on siinä esitetty. Muussa tapauksessa Name-attribuutin arvo muodostetaan PL.xml:n ko. rakenneosan elementtinimestä täydennettynä elementin paikkanumerolla (position()).
XSL-muunnos: PL.xml -> AML.xml Esimerkki: Production_line.xml:n elementtien muunnos InstanceHierarchy:n ja InternalElement:tien attribuuttien arvoiksi <production_line> <unit> <lift_module modid="lm001"> <name>päätynostin PN1</name> <conveyor type="belt" level="down" feed="in"> <InstanceHierarchy Name="production_line > <InternalElement Name="unit_1" ID="d0e9"> <InternalElement Name="Päätynostin PN1" ID="LM001 RefBaseSystemUnitPath="ProdLineSystemUnitClassLib/lift_module"> <InternalElement Name="conveyor_1" ID="d0e9 RefBaseSystemUnitPath="ProdLineSystemUnitClassLib/BELTconveyor"/>
Harjoitustehtävä U2E2-E3 Vinkkejä Suositus: käytä template-tekniikkaa mahdollisimman paljon mieluummin kuin for-eachluuppeja, koska se XSLT:n keskeinen tekniikka Tulosdokumentin tulee koostua kahdesta pääosasta: SystemUnitClassLib InstanceHierarchy. Ne kannattaa muodostaa täysin erillisillä template-joukoilla sotkeutumisen välttämiseksi Toisistaan riippumattomat template-joukot voit toteuttaa käytäen eri nimiä modeattribuuttien arvoina Ks. Viereinen esimerkki:
Harjoitustehtävä U2E2-E3 Vinkkejä Voit käyttää xsl:variable määrityksiä lyhentämään usein toistuvia tekstipätkiä: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" indent="no" encoding="utf-8"/> <xsl:variable name="classlibpath">prodlinesystemunitclasslib</xsl:variable> <xsl:template match="/"> <xsl:element name="automationmllibrary"> <xsl:apply-templates select="production_line" mode="classlibmode"/> </xsl:element> </xsl:template> <xsl:template match="production_line" mode="classlibmode"> <xsl:element name="systemunitclasslib"> <xsl:attribute name="name"> <xsl:value-of select="$classlibpath"/> </xsl:attribute> ----------------------------------------- <xsl:attribute name="refbaseclasspath"> <xsl:value-of select="concat($classlibpath,'/','genericmodule')"/> </xsl:attribute>
Lähdeviitteet Kurssikirja: Goldberg, K.,H.2009. XML-Visual QuickStart Guide. 2.e. Peachpit Press XML. : Introduction, Ch1, Ch2, Ch3, Ch4, Ch9, Ch10, Ch11, Ch12, Ch13, Ch14, Ch15. http://www.kehogo.com/examples (E-book: Beginning XML, (4th ed.) by David Hunter et al., Wrox Press (Ch 1-3, 5,7,8 )) Muita lähteitä: W3C:n Määrittelyt: http://www.w3.org/xml/core/ http://www.w3.org/style/xsl/ http://www.w3.org/xml/schema#dev AutomationML. Part 1 AutomationML Architecture, State: May 10. Available at: https://www.automationml.org/o.red/uploads/dateien/1317722443- AutomationML%20Whitepaper%20Part%201%20-%20AutomationML%20Architecture%20V%201.4.pdf Tools Online tool: xpath, xslt, schema validate: http://www.xpathtester.com Online tool: Regular Expression Tester: http://www.freeformatter.com/regex-tester.html Command line tool: Xmlstarlet command line XML toolkit: Download for windows: http://xmlstar.sourceforge.net/download.php XML editors EditX Lite free version: http://www.freexmleditorsite.com/download.html MindFusion XML Viewer on Ilmainen editori. Sopii ainakin XSLT-muunnoksien harjoitteluun.