Obsah
XPath je syntaxe pro specifikaci částí XML dokumentů (uzly, množiny uzlů, sekvence uzlů; nelze specifikovat části textových uzlů).
XPath používá syntaxi obdobnou jako cesty v souborovém systému.
XPath používá knihovnu standardních funkcí (evt. uživatelsky definovaných - v XPath 2.0 nebo i XPath 1.x, ale proprietárně - podle procesorů)
XPath je od v 1.0 základem pro XSLT, od 2.0 i pro XQuery
XPath syntaxe není XML (bylo by příliš "upovídané")
XPath 1.0 i 2.0 jsou doporučeními W3C (W3C Recommendation) - http://www.w3.org/TR/xpath
Transformace (XSLT)
slouží k výběru uzlů, které se mají zpracovávat
V "selekční části" XML dotazovacích jazyků (XQuery)
V některých modelovacích jazycích (Schematron, XML Schema)
...
Cesta (path) určuje (tj. „naviguje nás na“) lokaci v dokumentu. Cesty jsou konstruovány podobně jako cesty v systému souborů, tj. jako
[20] PathExpr ::= AbsolutePathExpr | RelativePathExpr [22] AbsolutePathExpr ::= ("/" RelativePathExpr?) | ("//" RelativePathExpr) [23] RelativePathExpr ::= StepExpr (("/" | "//") StepExpr)* [24] StepExpr ::= AxisStep | GeneralStep [25] AxisStep ::= (Axis? NodeTest StepQualifiers) | AbbreviatedStep
Osy (jedn. číslo axis, množné axes) jsou množiny prvků dokumentu, vymezené (obvykle relativně) vůči kontextu.
Kontext je tvořen především dokumentem a aktuálním (kontextovým) uzlem (KU).
obsahuje dceřinné uzly kontextového (aktuálního) uzlu
obsahuje všechny potomky kontextového (aktuálního) uzlu (dále jen KU). Nepočítají se mezi ně atributy!!!
obsahuje rodičovský uzel KU (existuje-li)
obsahuje všechny předky - rodiče, "prarodiče", atd. až kořenový element (pokud KU není sám kořenový)
obsahuje všechny následující sourozence KU (pro NS a atributy je tato osa prázdná)
dtto, ale obsahuje předchozí sourozence
obsahuje všechny uzly nacházející se po KU (mimo atributů, potomků a NS uzlů
dtto, ale obsahuje předchozí uzly (ale mimo předky, attributy, NS!)
obsahuje atributy (jen pro uzly - elementy)
obsahuje všechny NS uzly KU (jen pro uzly - elementy)
obsahuje samotný KU
obsahuje sjednocení os descendant
a
self
obsahuje sjednocení os ancestor
a
self
Příklad 6. //b/following-sibling::*
<?xml version="1.0"?> <a> <b/> <b> <c> <d/> </c> </b> <b> <c/> </b> </a>
Příklad 7. //b/preceding-sibling::*
<?xml version="1.0"?> <a> <b/> <b> <c> <d/> </c> </b> <b> <c/> </b> </a>
Příklad 8. /a/b/c/following::*
<?xml version="1.0"?> <a> <b/> <b> <c> <d/> </c> <e/> </b> <b> <c/> </b> </a>
Příklad 9. /a/b/e/preceding::*
<?xml version="1.0"?> <a> <b/> <b> <c> <d/> </c> </b> <b> <d/> <e/> </b> </a>
Určeny k selekci (výběru) z uzlů specifikovaných např. cestou
př.: /article/para[3]
- vybere třetí odstavec v
článku
Nejjednodušším výrazem v predikátu je specifikace pozice (blízkosti) (proximity position) - viz výše
para
vybere všechny dceřinné
elementy kontextového uzlu jmenující se para
*
selects all element children of
the context node
text()
selects all text node
children of the context node
@name
selects the name attribute
of the context node
@*
selects all the attributes of
the context node
para[1]
selects the first para
child of the context node
para[last()]
selects the last
para child of the context node
*/para
selects all para
grandchildren of the context node
/doc/chapter[5]/section[2]
selects the second section of the fifth chapter of the
doc
chapter//para
vybere všechny
element para, jež jsou následníky chapter
//para
vybere všechny elementy
para z dokumentu
//olist/item
vybere všechny
elementy item, které mají za rodiče olist.
vybere kontextový uzel
.//para
vybere všechny
elementy-potomky kontextového uzlu, které nesou značku
para
..
vybere rodičovský uzel od
kontextového
../@lang
vybere atribut lang
rodičovského uzlu od kontextového
XPath na W3C: http://www.w3.org/TR/xpath
Zvon XPath Tutorial: http://zvon.org/xxl/XPathTutorial/Output/index.html
XPath Tutorial na W3Schools: http://www.w3schools.com/xpath/xpath_intro.asp
Již finální specifikace - http://www.w3.org/TR/xpath20/
Změna pohledu na hodnoty vrácené XPath výrazem: vše jsou sekvence (byť jednoprvkové)
->odstraňuje problémy s "pořadím" uzlů v množině
Zavádí podmíněné výrazy a cykly
Zavádí možnost uživatelských funkcí (psaných jako dynamicky vyhodnocované výrazy v XPath)
Lze použít existenční a obecné kvantifikátory, např.
exist student/name="Fred"
nebo all
student/@id
Dále viz např. http://www.saxonica.com/, kde nalezneme i XPath/XSLT/XQuery procesor Saxon.
Původní specifikace (W3C Recommendation) XML 1.0 na W3C: http://www.w3.org/XML/
4th Edition (aktualizace, opravy, ne změny) na Extensible Markup Language (XML) 1.0 (Fourth Edition)
výborná komentovaná verze téhož na XML.COM (Annotated XML): http://www.xml.com/pub/a/axml/axmlintro.html
XML 1.1 (Second Edition) - změny indukované zavedením UNICODE 3, lepší možnosti normalizace, upřesnění postupu manipulace se znaky ukončení řádku. XML 1.1 není už vázaný na konkrétní verzi UNICODE, ale vždy na verzi poslední.
Jakou verzi specifikace bychom měli v nových aplikacích používat?
Odpověď dává W3C XML Core Working Group:
Opakování: každý XML dokument MUSÍ být správně utvořený (well formed)
Nové: XML dokument může být platný (valid) dokument:
Platný podle specifikace znamená přísnější omezení než správně utvořený.
Obvykle se validitou myslí soulad s DTD (Document Type Definition) dokumentu nebo
(moderněji) - soulad s XML Schematem, případně jinými schématy (RelaxNG, Schematron).
Specifikace XML Schema - http://www.w3.org/XML/Schema
Tutoriál Using W3C XML Schema: http://www.xml.com/pub/a/2000/11/29/schemas/part1.html - stručný
XML Schema Tutorial - http://www.w3schools.com/schema/default.asp - obsáhlejší
vynikající komplexní tutoriál na http://www.xfront.com
Dát silnější prostředek pro specifikaci modelu XML dat než je DTD; mít možnost:
<xs:element name="element_name"> ... definice typu - je přímo zde - tzv. "local" nebo daná odkazem - tzv. "global" </xs:element>
Neobsahuje dceřinné elementy, lze použít jako typ obsahu elementu nebo atributu
Lze definovat restrikcí z existujícího typu
<xs:simpleType name="TypeName"> <xs:restriction base="BaseTypeName"> ... </xs:restriction> </xs:simpleType>
<xs:simpleType name="nameType"> <xs:restriction base="xs:string"> <xs:maxLength value="32"/> </xs:restriction> </xs:simpleType>
Restrikce obsahu regulárním výrazem
<xs:simpleType name="isbnType"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{10}"/> </xs:restriction> </xs:simpleType>
Zhruba odpovídá konceptu "union" v C
Lze spojovat bázový typ a výčet hodnot
<xs:simpleType name="isbnType"> <xs:union> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{10}"/> </xs:restriction> </xs:simpleType> <xs:simpleType> <xs:restriction base="xs:NMTOKEN"> <xs:enumeration value="TBD"/> <xs:enumeration value="NA"/> </xs:restriction> </xs:simpleType> </xs:union> </xs:simpleType>
Lze definovat typ jako seznam hodnot oddělených bílými znaky
Dalším odvozením lze omezit počet prvků seznamu
<xs:simpleType name="isbnTypes"> <xs:list itemType="isbnType"/> </xs:simpleType> <xs:simpleType name="isbnTypes10"> <xs:restriction base="isbnTypes"> <xs:minLength value="1"/> <xs:maxLength value="10"/> </xs:restriction> </xs:simpleType>
<xs:complexType name="TypeName"> <xs:sequence> <xs:element ...> ... <xs:attribute ...> </xs:sequence> </xs:complexType>
při definici složeného typu lze použít skupiny (group)
<xs:group name="GroupName"> <xs:sequence> <xs:element ... /> ... </xs:sequence> </xs:group>
<xs:attributeGroup name="AttributesGroupName"> <xs:attribute ... use="required"/> ... </xs:attributeGroup>
Příklad použití skupin elementů a atributů
<xs:complexType name="bookType"> <xs:sequence> <xs:group ref="mainBookElements"/> <xs:element name="character" type="characterType" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attributeGroup ref="bookAttributes"/> </xs:complexType>
Předepisuje výskyt dceřinných elementů v určitém pořadí
<xs:element name="element_name"> <xs:complexType> <xs:sequence> .../... </xs:sequence> .../... </xs:complexType> </xs:element>
sequence označuje model obsahu připouštějící výskyt dané posloupnosti (sekvence) dceřinných elementů
xs je prefix vázaný na NS s URL http://www.w3.org/2001/XMLSchema
Předepisuje výskyt jednoho z dceřinných elementů nebo skupin elementů
<xs:element name="element_name"> <xs:complexType> <xs:choice> .../... </xs:choice> .../... </xs:complexType> </xs:element>
Předepisuje výskyt dceřinných elementů bez určeného pořadí
Smí být jen na nejvyšší úrovni definice obsahu
Dceřinné elementy nesmí mít kardinalitu větší než 1
<xs:complexType name="bookType"> <xs:all> <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string"/> <xs:element name="character" type="characterType" minOccurs="0" maxOccurs="unbounded"/> </xs:all> <xs:attribute name="isbn" type="isbnType" use="required"/> </xs:complexType>
<xs:element name="book"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="isbn" type="isbnType"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>
Nelze validovat textový obsah (textové dceřinné uzly)
Lze validovat dceřinné elementy
<xs:element name="book"> <xs:complexType mixed="true"> <xs:all> <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string"/> </xs:all> <xs:attribute name="isbn" type="xs:string"/> </xs:complexType> </xs:element>
Možnost specifikace integritních omezení:hodnota je jedinečná -
xs:unique
hodnota je klíčem -
xs:key
hodnota je odkazem na klíč -
xs:keyref
Anotace je (lidsky čitelná) poznámka-komentář ke schématu
Může též obsahovat informace pro zpracování - viz příklad - xs:appinfo
Další obsah není předepsán (omezen) - viz příklad - bind, class
<xs:annotation>
<xs:documentation xml:lang="en">Top level element.</xs:documentation>
<xs:documentation xml:lang="fr">Element racine.</xs:documentation>
<xs:appinfo source="http://example.com/foo/">
<bind xmlns="http://example.com/bar/">
<class name="Book"/>
</bind>
</xs:appinfo>
</xs:annotation>
<xs:include schemaLocation="character.xsd"/>
<xs:redefine schemaLocation="character12.xsd"> <xs:simpleType name="nameType"> <xs:restriction base="xs:string"> <xs:maxLength value="40"/> </xs:restriction> </xs:simpleType> </xs:redefine>
<xs:schema targetNamespace="http://example.org/ns/books/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:bk="http://example.org/ns/books/" elementFormDefault="qualified" attributeFormDefault="unqualified"> .../... </xs:schema>
Umožní připustit i něco, co předem neznáme
<xs:complexType name="descType" mixed="true"> <xs:sequence> <xs:any namespace="http://www.w3.org/1999/xhtml" processContents="skip" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType>
Vznikl na Univerzitě v Aarhusu, DK
Podobně jako RELAX NG je jednodušší než XML Schema
viz http://www.brics.dk/~amoeller/XML/
Spíše akademický charakter, skutečnými soupeři zůstávají XML Schema a RELAX NG