Instrukcje XSLT |
|
Dokonamy teraz przeglądu instrukcji XSLT. Wszystkie one mają podobną budowę:
xsl:for-eachPozwala na przetwarzanie elementów wybranych przez atrybut Działanie instrukcji <xsl:template match="PERIODIC_TABLE"> <xsl:for-each select="ATOM"> <xsl:value-of select="."/> </xsl:for-each> </xsl:template> Spowoduje wypisanie wszystkich elementów "ATOM' z poddrzew "PERIODIC_TABLE". Efekt ten można również uzyskać poprzez: <xsl:template match="PERIODIC_TABLE"> <xsl:apply-templates select="ATOM"/> </xsl:template> <xsl:template match="ATOM"> <xsl:value-of select="."/> </xsl:template> Wzorce dla atrybutówWyobraźmy sobie, że chcemy przekształcić informację o atomach z postaci gdzie każda cecha trzymana była jako osobny element poddrzewa na wersję gdzie będą to atrybuty węzła atom: <ATOM NAME="Vanadium" ATOMIC_WEIGHT="50.9415" ATOMIC_NUMBER="23" OXIDATION_STATES="5, 4, 3, 2" BOILING_POINT="3650K" MELTING_POINT="2163K" SYMBOL="V" DENSITY="6.11 grams/cubic centimeter" /> Niestety nie da się tego zrobić w pierwszy nasuwający się sposób, ponieważ taki wzorzec nie jest poprawnym elementem XML'a <xsl:template match="ATOM"> <ATOM NAME="<xsl:value-of select='NAME'/>" ATOMIC_WEIGHT="<xsl:value-of select='ATOMIC_WEIGHT'/>" ATOMIC_NUMBER="<xsl:value-of select='ATOMIC_NUMBER'/>" /> </xsl:template> Została wprowadzona notacja {} która odpowiada <xsl:template match="ATOM"> <ATOM NAME="{NAME}"/> ATOMIC_WEIGHT="{ATOMIC_WEIGHT}" ATOMIC_NUMBER="{ATOMIC_NUMBER}" /> </xsl:template> Fraza xsl:elementZazwyczaj by umieścić element XML'a w wynikowym dokumencie wystarczy umieścić go w odpowiednim wzorcu tak jak robiliśmy to z tagami <html> czy <body>
Czasem jednak pojawia się potrzeba umieszczenia elementu którego nazwa znana jest dopiero w czasie przetwarzania dokumentu. Służy do tego
właśnie instrukcja <xsl:template match="ATOM"> <xsl:element name="{@STATE}"> <NAME><xsl:value-of select="NAME"/></NAME> </xsl:element> </xsl:template>Tworzy element o nazwie będącą wartością atrybutu STATE, a więc otrzymamy <GAS> <NAME>Hydrogen</NAME> </GAS> <SOLID> <NAME>Sodium</NAME> </SOLID> xsl:attributeTak jak <xsl:template match="ATOM"> <LI><A> <xsl:attribute name="HREF"> <xsl:value-of select="SYMBOL"/>.html </xsl:attribute> <xsl:value-of select="NAME"/> </A></LI> </xsl:template> Należy wspomnieć tu o ważnym ograniczeniu, wszystkie atrybuty muszą pojawić się przed innymni instrukcjami w węźle. xsl:attribute-setIstnieje możliwość zdefiniowana często występujących atrybutów jako zbioru dostępnego w całym arkuszu i dołączanie ich do tworzonych elementów.
Zbiór atrybutów definiuje się instrukcją <xsl:attribute-set name="cellstyle"> <xsl:attribute name="font-family"> New York, Times New Roman, Times, serif </xsl:attribute> <xsl:attribute name="font-size">12pt</xsl:attribute> </xsl:attribute-set> Korzysta się z nich poprzez wymienienie atrybutu <xsl:template match="ATOM"> <tr> <td xsl:use-attribute-sets="cellstyle"> <xsl:value-of select="NAME"/> </td> <td xsl:use-attribute-sets="cellstyle"> <xsl:value-of select="ATOMIC_NUMBER"/> </td> </tr> </xsl:template> <td xsl:use-attribute-sets="cellstyle numberstyle"> <xsl:value-of select="ATOMIC_NUMBER"/> </td> W przypadku <xsl:element name="td" use-attribute-sets="cellstyle"> <xsl:value-of select="ATOMIC_NUMBER"/> </xsl:element> xsl:processing-instructionPozwala na umieszczenie instrukcji procesora w wynikowym dokumencie <xsl:template match="PROGRAM"> <xsl:processing-instruction name="gcc">-O4 <xsl:value-of select="NAME"/> </xsl:processing-instruction> </xsl:template> xsl:commentWprowadza komentarze do wyjściowego dokumentu. <xsl:template match="ATOM"> <xsl:comment>There was an atom here once.</xsl:comment> </xsl:template> xsl:textPozwala na umieszczanie tekstu w wynikowym dokumencie. Korzyści jakie oferuje ten element są dwie:
<xsl:template match="SCRIPT"> <script language="javascript"> <xsl:text disable-output-escaping="yes"> <!-- if ( location.host.toLowerCase().indexOf("metalab") < 0 && location.host.tolowercase().indexof("sunsite") < 0) { location.href="http://metalab.unc.edu/xml/"; } } // --> </xsl:text> </script> </xsl:template> xsl:copyKopiuje bieżący węzeł, ale nie robi tego z jego atrybutami i dziećmi. Zawartość elementu Przedstawiony arkusz kopiuje dokument, ale wycinając komentarze. <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="*|@*|processing-instruction()|text()"> <xsl:copy> <xsl:apply-templates select="*|@*|processing-instruction()|text()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> xsl:numberPozwala na umieszczenie sformatowanej liczby z atrybutu value w zależności od parametru <xsl:template match="ATOM"> <td><xsl:number value="position()"/></td> <td><xsl:value-of select="NAME"/></td> </xsl:template> Jeśli parametr
Atrybut Atrybut <xsl:template match="ATOM/*"> <td><xsl:number count="*"/></td> <td><xsl:value-of select="."/></td> </xsl:template> Atrybut O tym jaki format ma przyjąć wyliczanie decydują następujące atrybuty
Atrybut
Atrybuty xsl:sortElement ten pozwala na ustalenie kolejności elementów poddawanych obróbce w kolejności innej niż w źródłowym dokumencie. Występuje on wewnątrz elementów Atrybut Dzięki atrybutowi order i wartości "descending" możliwa jest zamiana kolejności sortowania. <xsl:sort order="descending" data-type="number" select="ATOMIC_NUMBER"/> xsl:variableElement <xsl:variable name="copy99"> Copyright 1999 Elliotte Rusty Harold </xsl:variable> <xsl:variable name="Thing1"> Thing1 loves <xsl:value-of select="NAME"/> </xsl:variable> Do zmiennej odwołujemy się poprzez poprzedzenie jej nazwy znakiem $.
Zmienne mogą być globalne jeśli znajduję na pierwszym poziomie drzewa dokumentu XSLT lub lokalne jeśli zostały zadeklarowane wewnątrz elementu <BLOCK COPYRIGHT="{$copy99}"> </BLOCK > <xsl:variable name="Thing2"> Thing2 loves <xsl:value-of select="$Thing1"/> </xsl:variable> xsl-ifElement xsl-if pozwala na warunkowe wykonanie bloku wzorca. jeśli wyrażenie XPath będące wartością atrybutu test ewaluuje do true wykonywane są instrukcje zawarte w elemencie xsl-if. <xsl:template match="ATOM"> <xsl:value-of select="NAME"/> <xsl:if test="position()!=last()">, </xsl:if> </xsl:template> xsl-chooseElement <xsl:template match="ATOM"> <xsl:choose> <xsl:when test="@STATE='SOLID'"> <P style="color:black"> <xsl:value-of select="."/> </P> </xsl:when> <xsl:when test="@STATE='LIQUID'"> <P style="color:blue"> <xsl:value-of select="."/> </P> </xsl:when> <xsl:when test="@STATE='GAS'"> <P style="color:red"> <xsl:value-of select="."/> </P> </xsl:when> <xsl:otherwise> <P style="color:green"> <xsl:value-of select="."/> </P> </xsl:otherwise> </xsl:choose> </xsl:template> xsl:importPozwala na zaimportowanie arkuszy xsl z pod adresu przechowywanego w atrybucie href. Elementy takie muszą pojawić się przed elementami xsl:template. Jeśli kilka arkuszy definiuje sprzeczne reguły, obowiązuje reguła z ostatniego elemenu xsl:import, która i tak ustępuje regułom bezpośrednio zdefiniowanym w arkuszu. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="genealogy.xsl"/> <xsl:import href="standards.xsl"/> <!-- other child elements follow --> </xsl:stylesheet> xsl:includeElement ten powoduje wstawienie w miejscu jego wystąpienie reguł pobranych ze wskazanej przez atrybut href lokalizacji. Reguły te traktowane są tak jakby fizycznie znajdowały się w bieżącym arkuszu. |