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.