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
<?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 |
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 |
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 LanguageXSLT: 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.