Procesory XSLT:
Xalan (Java, projekt Apache)
Xalan (C++, projekt Apache)
libxml (C, Linux, projekt Gnome)
Sablotron (C, różne platformy)
Internet Explorer i wiele programów pod Windows korzysta z biblioteki MSXML.
Dokumentacja JAXP - standard określa m.in. jaki interfejs powinny mieć procesory XSLT w Javie.
API pakietu javax.xml.transform - standardowy pakiet do transformacji w Javie 1.4.
W naszym labie działa takie polecenie:
java org.apache.xalan.xslt.Process -XSL szablon.xsl -IN wejscie.xml -OUT wynik.html
Do tworzenia poszczególnych węzłów dokumentu wynikowego służą odpowiednie
elementy szablonu:
<xsl:element name="elem"> <xsl:attribute name="atryb">wartość atrybutu</xsl:attribute> <xsl:text>Zawartość tekstowa</xsl:text> <xsl:text disable-output-escaping="yes"><![CDATA[ \begin{tabular}{|l|l|r|}\hline one & two & three \end{tabular} ]]></text> </xsl:element> <xsl:comment>To będzie komentarz</xsl:comment> <xsl:processing-instruction target="xml-stylesheet">type="text/css" href="styl.css"</xsl:processing-instruction>
Można też po prostu wpisywać fragmenty wynikowego dokumentu jako XML (ale nie wszystko da się tak wyrazić).
<elem atryb="wartość atrybutu"> Zawartość tekstowa <xsl:text disable-output-escaping="yes"><![CDATA[ \begin{tabular}{|l|l|r|}\hline one & two & three \end{tabular} ]]></text> </elem> <xsl:comment>To będzie komentarz</xsl:comment> <xsl:processing-instruction target="xml-stylesheet">type="text/css" href="styl.css"</xsl:processing-instruction>
Aby utworzyć węzeł taki sam jak węzeł bieżący, można użyć instrukcji copy. Domyślnie kopiowanie jest powierzchowne, aby skopiować również atrybuty i podelementy trzeba to zrobić "ręcznie" wewnątrz copy. Węzłem bieżącym może być nie tylko element, ale też np. atrybut, węzeł tekstowy.
<xsl:template match="*|@*" <xsl:copy> <xsl:apply-templates select="*|@*"/> </xsl:copy </xsl:template>
XSLT dostarcza konstrukcji do pisania wyrażeń warukowych (if, choose>) oraz iterowania po węzłach z wartości typu node-set (for-each). Wewnątrz for-each zmienia się węzeł bieżący.
<xsl:if test="$x < 1">x jest mniejsze od 1</xsl:if> <xsl:choose> <xsl:when test="$x = 1">x równe 1</xsl:when> <xsl:when test="$x = 2">x równe 2</xsl:when> <xsl:otherwise>x różne od 1 i 2</xsl:otherwise> </xsl:choose> <xsl:for-each select="row[position() >= 2]">kolejny wiersz</xsl:for-each>
Aby wstawić do dokumentu wynikowego wartość wyrażenia XPath, można użyć instrukcji value-of (wstawia tekst) lub copy-of (wstawia drzewo). Niektóre atrybuty elementów XSLT oczekują wartości będących wyrażeniami XPath. Są to np. select - wyrażenia typu node-set, test - wyrażenia typu boolean. W pozostałych atrybutach można wstawić wartość tekstową wyrażenia XPath pisząc {wyrażenie}.
<xsl:for-each select="./tekst"> <p class="{@styl}"><xsl:value-of select="."/></p> </xsl:for-each> <xsl:template match="fragment_html"> <xsl:copy-of select="*"/> </xsl:template>
Arkusz XSLT można sparametryzować parametrami :). Trzeba je zadeklarować na najwyższym poziomie arkusza. Do ich wartości można się później odwoływać za pomocą $nazwa.
Można też deklarować "zmienne" i odwoływać się do ich wartości, z tym że są to zmienne "deklaratywne" analogicznie do konstrukcji let x = wyrażenie in wyrażenie z języków funkcyjnych.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="x" select="0"/> <xsl:template match="/"> ... <xsl:variable name="y" select="number/@val"/> ... <xsl:if test="$x > $y">liczba w dokumencie jest mniejsza od parametru</xsl:if> </xsl:template> </xsl:stylesheet>
Sposób tworzenia dokumentu wynikowego zależy od inwencji autora XSLT :), ale można wyróżnić dwa zasadnicze style:
przykład adresy
przykład studenci
przykład arkusz do tej strony