XPath
Az XPath arra használatos, hogy elérjünk/kiválasszunk bizonyos XML elemeket és attribútumokat.
A hagyományos értelemben vett útvonalakhoz hasonlít (a fájlrendszer is egy fa, azaz készíthető belőle egy XML). Több mint 200 beépített függvény tartozik hozzá.
Az XPath-ot erősen használja az XSLT.
XPath csomópontok (node-ok)
Az XML szerkezete node-ok egy fáját képezik.
Az XPath 7 féle csomópontot biztosít, melyek:
- element
- attribute
- text
- namespace
- processing-instruction
- comment
- document
Példa:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book>
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
A fenti példában a <bookstore> a gyökér node (root node). Az <author>J K. Rowling</author> egy element node. lang="en" egy attribute node.
Atomi értéknek nevezzük az olyan node-okat, amiknek nincs se gyerek se szülője. Pl: J K. Rowling, "en".
Node-ok kiválasztása
Leggyakoribb XPath kifejezések:
| XPath kifejezés |
Leírás |
| nodename |
Kiválaszt minden node-ot aminek 'nodename' a neve |
| / |
Kiválasztja a gyökér elemet. |
| // |
Az aktuális node-tól indítja a keresést és kiválasztja az összes egyezést. |
| . |
Kiválasztja az aktuális node-ot |
| .. |
Kiválasztja a szülő node-ot |
| @ |
Attribútum kiválasztása |
Ezek alapján nézzünk néhány példát:
| XPath kifejezés |
Leírás |
| bookstore |
Kiválasztja az összes bookstore nevű node-ot |
| /bookstore |
Kiválasztja a a gyökér bookstore elemet (A /-el kezdődő XPath mindig abszolút útvonalat jelöl) |
| bookstore/book |
Kiválasztja az összes book elemet, mely a bookstore gyereke. |
| //book |
Kiválasztja az összes book elemet, nem fontos hogy a fa-ban hol vannak. |
| bookstore//book |
Kiválasztja az összes book elemet, amely a bookstore leszármazottja (tranzitív gyereke). |
| //@lang |
Kiválasztja az összes lang nevű attribútumot. |
Predikátumok
Adott node-ok megtalálására használatos. A predikátumokat mindig szögletes zárójelben adjuk meg.
Példák:
| XPath kifejezés |
Leírás |
| /bookstore/book[1] |
Kiválasztja az az első book elemet, amely a bookstore gyereke |
| /bookstore/book[last()] |
Kiválasztja az utolsó book elemet amely a bookstore gyereke. |
| //bookstore/book[position()<3] |
Kiválasztja az első kettő book elemet. |
| //title[@lang] |
Kiválasztja az összes title elemet, aminek van lang nevű attribútuma. |
| //title[@lang='en'] |
Kiválasztja az összes title elemet, aminek van lang nevű attribútuma és lang értéke "en". |
| /bookstore/book[price>35.00] |
Kiválasztja az összes book elemet, amely a bookstore gyereke és a price elem értéke nagyobb, mint 35. |
| /bookstore/book[price>35.00]/title |
Ugyanaz, mint az előző, de a title elemeket választja ki. |
Wildcard kifejezések
A wildcard kifejezések akkor használatosak amikor ismeretlen node-ra kell illeszkedni.
| Wildcard |
Leírás |
| * |
Minden elemre illeszkedik. |
| @* |
Minden attribútumra illeszkedik. |
| node( ) |
bármilyen node-ra illeszkedik |
Példák:
| XPath kifejezés |
Leírás |
| /bookstore/* |
A bookstore összes gyerekét választja ki |
| //* |
Az összes elemet kijelöli a dokumentumban. |
| //title[@*] |
Azokat a title elemeket választja ki amiknek van legalább egy attribútuma |
Több XPath összefűzése
XPath kifejezéseket összefűzhetünk, ha használjuk a | jelet közöttük.
Példa: //book/title | //book/price : Ez kiválasztja az összes könyv title és price elemét.
XSLT
XSL: eXtensible Stylesheet Language
XSLT: XSL Transformation
Stylesheet deklaráció
Használhatjuk az stylesheet vagy a transform elemet is gyökér elemként. A kettő teljesen megegyezik. Egy korrekt gyökérelem megadása:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...
</xsl:stylesheet>
vagy
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...
</xsl:transform>
Az XML-ben hivatkozzuk meg a stylesheet-et.
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
Template elemek
Egy XSL az átalakítási szabályokat tartalmazza, melyeket template-eknek nevezünk.
Template-et a <xsl:template> elemmel hozhatunk létre.
A match attribútum segítségével választhatjuk ki, hogy milyen elemekre alkalmazzuk majd a szabályt.
A match-ben használhatjuk az XPath kifejezéseket.
Példa:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<tr>
<td>.</td>
<td>.</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
A fenti példa nem sokat csinál. Kiválasztja a gyökér elemet és ad hozzá egy HTML részletet.
Value-of elem
A <xsl:value-of> elem segítségével a kiválasztott elem értékét is lekérhetjük, így azt felhasználhatjük a kimeneti dokumentum generálása közben.
A fenti példában cseréljük le a
<tr>
<td>.</td>
<td>.</td>
</tr>
részletet az alábbira:
<tr>
<td><xsl:value-of select="catalog/cd/title"/></td>
<td><xsl:value-of select="catalog/cd/artist"/></td>
</tr>
A select attribútumban megadhatjuk, hogy milyen node-nak az értékét szeretnénk lekérni.
A bővített példa még mindig nem az igazi, mert csak egy sornyi adat kerül bele a táblázatba.
For-each elem
A ciklusok igénye esetén használjuk az <xsl:for-each> elemet! A példa bővítése:
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
A select attribútumban adhatjuk meg, hogy mely elemeket válasszuk ki, amiken majd a ciklus végigmegy.
A select-be a már látott módon adhatunk predikátumokat is, hogy csak bizonyos elemek kerüljenek bele a halmazba amin végigmegyünk.
Rendezés
<xsl:for-each select="catalog/cd">
<xsl:sort select="artist"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
A select megadja, hogy milyen node-ot használjunk a rendezéshez. For-each-en belülre kell raknunk.
Feltétel
Szimpla feltétel esetén:
<xsl:for-each select="catalog/cd">
<xsl:if test="price > 10">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
<td><xsl:value-of select="price"/></td>
</tr>
</xsl:if>
</xsl:for-each>
For-each-en belülre kell raknunk.
Több ággal rendelkező elágazás esetén használjuk a choose, when, otherwise kombinációt:
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<xsl:choose>
<xsl:when test="price > 10">
<td bgcolor="#ff00ff">
<xsl:value-of select="artist"/></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="artist"/></td>
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:for-each>
Apply template
A template alkalmazása az aktuális elemre vagy annak gyermekeire.
A selectben megadhatjuk, hogy milyen gyerekekre alkalmazzunk template-et.
<xsl:apply-templates select="title"/>
Változók
Az xsl dokumentumban változókat is hozhatunk létre.
<xsl:variable
name="name"
select="expression">
itt is meg lehet adni, hogy mi legyen az értéke. Komplett xml/html részlet is lehet.
</xsl:variable>
Az xsl változók értéke később már nem módosítható. Később a változót a nevének megadásával hivatkozhatjuk, de elé raknunk kell egy $ jelet.