XSL.doc

(127 KB) Pobierz
Reguły XSLT są wyrażane przy pomocy wzorców (templates) składaj

Reguły XSLT są wyrażane przy pomocy wzorców (templates) składających się z części pozwalającej na sprawdzenie czy dana reguła powinna zostać zastosowana do bieżącego elementu drzewa XML i z zawartości wzorca czyli tego co ma się pojawić w wynikowym drzewie po napotkaniu pasującego elementu drzewa. Elementy dokumentu XML są kolejno dopasowywane do wzorców i w ten sposób, poruszając się w głąb źródłowego drzewa, tworzone jest drzewo dokumentu wynikowego. W szczególności wynikami działania transformacji XSLT może być również HTML lub czysty tekst:

 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<html>             

<head>

<title> Zniszczony dokument </title>

</head>

<body>

<p> <b>Właśnie zignorowaliśmy treść dokumentu wejściowego</b> </p> </body>

</html>

</xsl:template>

</xsl:stylesheet>

 

Spróbujmy wkleić powyższy przykład i obejrzeć wynik. Jest on oczywiście niezależny od danych w pliku XML.

 

Wewnątrz elementu xsl:template możemy przy pomocy xsl:for-each i odpowiedniego wyrażenia Xpath wybrać, jakie elementy mają być przeznaczone do wyświetlenia przez xsl:value-of select.

 

<xsl:for-each select="osoby/osoba">

   <xsl:value-of select="imie" />

   <xsl:value-of select="nazwisko" />

</xsl:for-each>

 

Umieśćmy w odpowiednim miejscu (czyli w sekcji BODY) powyższy fragment kodu. I zobaczyć, jak będzie wyglądał wynik. Może warto dodać trochę znaczników HTML, żeby osoby były wyświetlane np. w tabeli?

 

Reguły definiowane przez element xsl:template są najważniejszą częścią arkusza XSL. Wiążą one elementy wejściowego dokumentu z wynikowymi. Każdy element xsl:template zawiera atrybut match, który decyduje o tym dla jakich węzłów wejściowego dokumentu ma zostać wykonana reguła.

Aby móc przetwarzać dokument musimy mieć możliwość zejścia w dół drzewa dokumentu, czyli powiadomić procesor XSL'a, które dzieci drzewa należy przetwarzać. Służy do tego element: <xsl:apply-templates/>

 

Przeróbmy teraz poprzedni przykład tak, aby w „ciele” dokumentu znalazło się <xsl:apply-templates/>:

O poprzednim przykładzie (z użyciem for-each) możemy chwilowo zapomnieć.

 

<body>

      <xsl:apply-templates/>

</body>

 

Poprzez umieszczenie we wzorcu tego elementu powiadamiamy parser, że ma przeglądać dzieci obecnego węzła i szukać reguł do nich pasujących a następnie je wykonać. Ponieważ kolejne wzorce również mogą zawierać element xsl:apply-template możliwe jest przejście całego drzewa. Rozważmy następujący szablon XSL:

 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 

<xsl:template match="/">

  <html><head><title>API</title></head><body>

   <xsl:apply-templates/>

  </body></html>

</xsl:template>

 

<xsl:template match="procesor">

  <p>

   <xsl:value-of select="typ"/>

   <xsl:value-of select="@predkosc"/>

  </p><hr/>

</xsl:template>

 

</xsl:stylesheet>

 

Widzimy, że:

·         Dla korzenia drzewa „/” zostanie stworzony nagłówek <HTML>,<HEAD>, <BODY>

·         Dla każdego wystąpienia elementu <procesor>, zostanie stworzony nowy paragraf <P> i zostanie wyświetlony jego typ oraz prędkość (znak @ oznacza, że jest to atrybut) oraz pojawi się pozioma linia.

 

Na podstawie powyższego przykładu, stwórzmy szablon XSL wyświetlający dane ze stworzonego wcześniej pliku XML.

 

Możemy też zrobić tak:

 

<xsl:template match="procesory/*/cena">

  <strong><xsl:value-of select="."/></strong>

</xsl:template>

 

Lub tak:

 

<xsl:for-each select="osoby/osoba">

   <xsl:value-of select="." />

</xsl:for-each>

 

W apply-templates możemy użyć atrybutu select:

 

<xsl:apply-templates select="ATOM"/>

 

Ponieważ przy wyświetlaniu parser usuwa pojedyncze spacje, warto czasem temu zapobiec:

 

<xsl:template match="/" xml:space="preserve">

 

xsl:text pozwala na umieszczanie tekstu w wynikowym dokumencie. Korzyści jakie oferuje ten element, są dwie:

·         zachowuje białe znaki,

·         pozwala na umieszczenie znaków <, >, & - w wynikowym tekście poprzez zastąpienie sekwencji &lt; &gt; czy &amp

Przykład – javascript w XSL:

 

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

 

Spróbujmy wstawić do naszego dokumentu jakiś dodatkowy tekst np. nagłówek przy pomocy xsl:text. Może się to też przydać do uzyskania np. spacji.

 

Element xsl:choose pozwala na wybór akcji jaka ma być podjęta. Zawiera on zbiór elementów xsl:when których atrybut test podlega obliczeniu i jeśli wynikiem jest true wykonywany jest blok w nich zawarty. Jeśli więcej niż jeden warunek jest prawdziwy wykonuje się pierwszy w kolejności.

 

<xsl:template match="procesor">

  <xsl:choose>

     <xsl:when test="@waga='15'">

                <P><FONT COLOR="red">

                               <xsl:value-of select="typ"/>

                  </FONT></P>

                </xsl:when>

               

                <xsl:otherwise>

                <P><FONT COLOR="blue">

                               <xsl:value-of select="typ"/>

                  </FONT></P>

                </xsl:otherwise>

  </xsl:choose>

</xsl:template>

 

W tym przykładzie inny kolor tekstu będą miały elementy o atrybucie równym 15 (czerwony) a inny pozostałe (niebieski)

 

Przeróbmy teraz swój szablon tak, aby w zależności od jakiegoś warunku (np. płci), wyświetlane osoby podlegały innemu formatowaniu (np. kolor, czcionka).

 

Gdy wpiszemy w dokumencie XML odnośnik do szablonu, będzie on interpretowany przez przeglądarkę. Poniższą linijkę wystarczy wstawić do dokumentu XML tuż po <?XML version=... Oczywiście zamiast g.xsl musimy wprowadzić nazwę (i ewentualnie ścieżkę) do szablonu XSL. W tym momencie, po otwarciu naszego dokumentu XML w przeglądarce, powinien on się pojawić w postaci  sformatowanej przez XSLT.

 

<?xml-stylesheet type="text/xsl" href="g.xsl" ?>

 

Doprowadź do sytuacji, w której Twój dokument sformatowany przez XSL będzie wyświetlany przez przeglądarkę internetową, bez programu XML Cooktop.

 

 

Zgłoś jeśli naruszono regulamin