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. |