Jazyk XML
description
Transcript of Jazyk XML
Jazyk XML
• Jazyk pro tvorbu strukturovaných dokumentů
• Syntaxí velmi podobný HTML
Hlavní cíle návrhu:
• Snadná editace - jazyk je textový
• Snadné strojové zpracování - jednoduchá syntaxe
Základní syntaxe XML
<prvek atribut1= ”hodnota1” atribut2=”hodnota2” … >
… obsah prvku ...
</prvek>
<prvek … atributy … />
Zkrácený zápis - pokud je obsah prvku prázdný
Textový jazyk, k vymezení logických částí (prvků) se používají následující značky (tagy):
Speciální znaky< … < ,> … > ,& … & ," … ” ,
' … ’ ,
  … znak s číslem 160 v Unicode (zde tvrdá mezera)
Stromová reprezentace
<dokument>
<odstavec sirka=“50“>
bla bla bla
</odstavec>
<odstavec>
ble ble
</odstavec>
</dokument>
dokument
text(‘\n‘)
odstavec( @sirka = 50 )
text(‘\n bla bla bla\n‘)
odstavec
text(‘\n ble ble\n‘)
text(‘\n‘)
XML dokument: Odpovídající strom:
Základy Xpath (1)• Výrazy popisující ”cestu” ve stromu
• Jednotlivé kroky se oddělují lomítky a mohou být:• název prvku, např. odstavec• text() - odpovídá text(…)v stromu• . - odkaz na sebe sama• .. - odkaz na otce
Výraz A/B se chápe jako „B je synem A“Výraz A//B se chápe jako „B je potomkem A“
Cesty mohou být absolutní (popisují cestu od kořene, začínají lomítkem) relativní (popisují cestu od pevně zvoleného uzlu, nezačínají lomítkem)
• * - libovolný prvek
Příklady Xpath (1)
dokument
text(‘\n‘)
odstavec( @sirka = 50 )
text(‘\n bla bla bla\n‘)
odstavec
text(‘\n ble ble\n‘)
text(‘\n‘)
• /dokument
• /dokument/odstavec
• /dokument/text()
• /text()
• //odstavec
Základy Xpath(2)
Na konci každého kroku se mohou objevit predikáty:
•A[ i ] - i-tý uzel splňující A, např. text()[2].
•A[ podmínka ] - takové A, že splňuje danou podmínku.
• a[@href=”neco.html”] - dotaz na hodnotu atributu
• je-li i záporné, počíta se od konce
• div[title!=”nic”] - dotaz na text prvku• tr[position() mod 2=1] - volání spec. fcí.
position() - kolikátý uzel to jelast() - kolik uzlů celkem existujecount(A) - kolik uzlů vytvoří výraz A
Příklady Xpath(2)
dokument
text(‘\n‘)
odstavec( @sirka = 50 )
text(‘\n bla bla bla\n‘)
odstavec
text(‘\n ble ble\n‘)
text(‘\n‘)
• //odstavec[1]
• //text()[-2]
• //odstavec[@sirka=50]
• //text()[position() = last()]
• //text()[position()mod 2 = 1]
Princip XSLT
XML xml2html.xsl
xml2wml.xsl
HTML
WMLdalší XML
Jak funguje XSLT procesorTransformací uzlu budeme rozumět proces, při němž:
• Pokud taková neexistuje, použije se implicitní
• Vytvoříme nový strom(les) podle příkazů uvnitř a ten vrátíme jako výsledek
Transformací dokumentu pak bude transformace kořene stromu dokumentu.
• Vybereme vyhovující šablonu
Formát XSLT souboru
XSLT je instancí XML, tj. jedná se o XML soubory, ale XSLT jim dává význam
<?xml version=”1.0”?>
<xsl:stylesheet version=”1.0” xmlns=”http://www.w3.org/1999/XSL/Transform”>
… šablony ...
</xsl:stylesheet>
Šablony - xsl:template<xsl:template match=”...výraz...”>
… příkazy ...
</xsl:template>
Šablona je vyhovující (pro uzel u), pokud:
• výraz je absolutní cesta a odpovídá uzlu u
• výraz je relativní cesta a existuje uzel v, tak, že výraz odpovídá relativní cestě z v do uzlu u
• je-li více kandidátů, vybere se ta, která byla v XSLT napsána jako poslední
Příkazy v šablonách• textové uzly se okopírují• prvky, které nezačínají na ‘xsl:’, se také okopírují• prvky, které začínají na ‘xsl:’, jsou speciální
• <xsl:apply-templates/> provede transformace synů a vrátí takto získané stromy
• další uvidíme později
Implicitní pravidla
• textové uzly se okopírují
• u prvků je chování identické s šablonou s jediným příkazem <xsl:apply-templates/>
PříkladV XML si budeme uchovávat informace o zaměstnancích - pro začátek jméno a příjmení
<zamestnanci>
<zamestnanec>
<jmeno>Josef</jmeno>
<prijmeni>Novak</prijmeni>
</zamestnanec>
… další zaměstnanci ...
</zamestnanci>
První řešení
<xsl:stylesheet …… >
<xsl:template match=”zamestnanec”>
<xsl:apply-templates/> <br/>
</xsl:template>
</xsl:stylesheet>
Problémy• Pokud zaměníme pořadí jmena a prijmeni v XML, ovlivní
to výstup
• Pokud mezi jmenem a prijmenim v XML, nebude mezera, jméno a příjmení se slijí
• Pokud přidáme další položky pro zaměstnance(e-mail apod.), přestane to fungovat.
xsl:apply-templatesPokud specifikujeme atribut select, provede se rekurze jen na uzly, které vyhovují cestě uvedené v select.
• select=”p” - vybere všechny synovské odstavce
• select=”.//p” - vybere všechny odstavce, které jsou potomky aktuálního uzlu
• select=”/dokument” - vybere prvek dokument, který je kořenem stromu. NEBEZPEČNÉ!
• select=”p[2]” - vybere druhý synovský odstavec
xsl:value-ofVrátí text, který vznikne vynecháním značek v obsahu prvního uzlu, který bude vybrán atributem select
• <xsl:value-of select=”.”> - vrátí text z akt. uzlu
• <xsl:value-of select=”p”> - vrátí text z 1. synovského odstavce
• <xsl:value-of select=”@href”> - vrátí hodnotu atributu href
Vylepšené řešení<xsl:stylesheet …… >
<xsl:template match=”zamestnanec”>
<xsl:value-of select=”jmeno”/>
<xsl:value-of select=”prijmeni”/>
<br/>
</xsl:template>
</xsl:stylesheet>
Změna designu<xsl:stylesheet …… >
<xsl:template match=”zamestnanec”>
<li> <xsl:value-of select=”jmeno”/>
<xsl:value-of select=”prijmeni”/> </li>
</xsl:template>
<xsl:template match=”zamestnanec”>
<ul><xsl:apply-templates/></ul>
</xsl:template>
</xsl:stylesheet>
xsl:attribute
• přidá atribut k prvku, do kterého je vnořen
• jméno se získá z atributu name, hodnota z obsahu prvku
<xsl:template match="email"> <a> <xsl:attribute name="href"> mailto:<xsl:value-of select="."/> </xsl:attribute> <xsl:value-of select="."/> </a> </xsl:template>
Automatické číslováníVýhodné, pokud obsah často měníme - nezapomeneme na to
Použijeme funkci position()
<xsl:template ...>
<xsl:value-of select=”position()”>
… pokračování ...
Volání pojmenovaných šablon
Šablonu lze pojmenovat pomocí atributu name - musí být unikátní v dokumentu
K volání slouží xsl:call-template
<xsl:template name=“id1“>
… obsah …
<xsl:template … >
<xsl:call-template name=“id1“>
...
Parametry při volání šablon
Parametr se deklaruje ve volané šabloně:
<xsl:param name=”p1”>implicitní hodnota</xsl:param>
Hodnota se specifikuje při volání
<xsl:call-template name=”t1”>
<xsl:with-param name=”p1”>jiná hodnota</xsl:param>
</xsl:call-template>
K hodnotě proměnné se dostaneme přes $p1