Transformacje opisywane przez XSLT są zapisywane jako poprawny dokument XML'a, który może zawierać zarówno elementy należące do specyfikacji języka XSLT (które zawsze należą do przestrzeni nazw xsl) jaki i elementy użytkownika. Transformacja wyrażona w XSLT zawiera zbiór reguł opisujących przekształcenie jednego drzewa XML w nowe.
Reguły te wyrażane są 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.
Poza dokumentami XML'a wynikami działania transformacji XSL może być również HTML lub czysty tekst.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
  <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>
			

Przykład ten spowoduje, że każdy dokument XMLa zostanie przekształcony w plik HTML, zawierający tylko tytuł i jeden paragraf:

<html>
  <head><title> Zniszczony dokument </title></head>
  <body>
   <p>
    <b>Właśnie zignorowaliśmy treść dokumentu wejściowego</b>
   </p>
  </body>
</html>
			

Przykład ten ma bardzo skromne możliwości, ale pozwala na wskazanie najważniejszych elementów dokumentu XSL. W przykładzie obecna jest tylko jedna reguła:

<xsl:template match="/">
...
</xsl:template >

Ta reguła pasuje do korzenia każdego dokumentu (match="/"). Zostaje wykonana jej treść, czyli wynikowy dokument zostanie utworzony w oparciu o zawartość węzła <xsl:template>. Ponieważ nie zawiera on żadnych instrukcji języka XSL będą tylko skopiowane wszystkie elementy zawarte we wzorcu. Dzięki czemu powstanie nagłówek dokumentu HTML i jego treść.

xsl:template

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.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> 
  <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>
			

Zawartość elementu xsl:template to właśnie opis reguły do wykonania, może ona zawierać instrukcje XSL'a (tagi z przestrzeni nazw xsl), jak i dowolne elementy, które zostaną po prostu skopiowane do wynikowego drzewa.

xsl:apply-templates

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

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

<?xml version="1.0"?>
<?xml-stylesheet type="text/xml" href="14-2.xsl"?>
<PERIODIC_TABLE>
  <ATOM STATE="GAS">
    <NAME>Hydrogen</NAME>
    <SYMBOL>H</SYMBOL>    
    <ATOMIC_NUMBER>1</ATOMIC_NUMBER>
    <ATOMIC_WEIGHT>1.00794</ATOMIC_WEIGHT>
    <BOILING_POINT UNITS="Kelvin">20.28</BOILING_POINT>
    <MELTING_POINT UNITS="Kelvin">13.81</MELTING_POINT>
    <DENSITY UNITS="grams/cubic centimeter"><!-- At 300K -->
      0.0899
    </DENSITY>
  </ATOM>
  <ATOM STATE="GAS">
    <NAME>Helium</NAME>
    <SYMBOL>He</SYMBOL>    
    <ATOMIC_NUMBER>2</ATOMIC_NUMBER>
    <ATOMIC_WEIGHT>4.0026</ATOMIC_WEIGHT>
    <BOILING_POINT UNITS="Kelvin">4.216</BOILING_POINT>
    <MELTING_POINT UNITS="Kelvin">0.95</MELTING_POINT>
    <DENSITY UNITS="grams/cubic centimeter"><!-- At 300K -->
      0.1785
    </DENSITY>
  </ATOM>
</PERIODIC_TABLE>

oraz następujący arkusz xsl'a:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <xsl:apply-templates/>
    </html>
  </xsl:template>

  <xsl:template match="PERIODIC_TABLE">
    <body>
      <xsl:apply-templates/>
    </body>
  </xsl:template>

  <xsl:template match="ATOM">
    An Atom
  </xsl:template>
</xsl:stylesheet>

Jeśli użyjemy tego arkusza będą dokonywane następujące czynności:

  • Korzeń dokumentu zostanie porównany z wzorcami i zostanie wybrany pasujący (czyli pierwsza reguła)
  • Wypisany zostanie tag <html>
  • Zostaną poddane obróbce dzieci korzenia, pierwsze dwa elementy nie pasują do wzorców, za to węzeł PERIODIC_TABLE tak
  • Zostanie wypisany tag <body>
  • Zostaną poddane obróbce dzieci bieżącego węzła, pasują one do ostatniego wzorca
  • Dla każdego dziecka zostanie wypisany tekst "An Atom"
  • Wypisany zostanie tag </body>
  • Wypisany zostanie tag </html>
Wynikiem będzie więc dokument:

<html><body>

    An Atom

    An Atom

</body></html>
			

Aby móc precyzować dla jakich dzieci bieżącego elementu mają być poszukiwane wzorce można użyć atrybutu select elementu xsl:apply-templates. Jeśli ostatnią regułę zastąpimy:

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

To jako wynik dostaniemy dokument:

<html><body>

  Hydrogen

  Helium

</body></html>
			

xsl:value-of

Tag xsl:value-of zwraca wartość elementu określonego przez atrybut select. I tak poprzedni przykład da się zrealizować przy pomocy:

<xsl:template match="ATOM">
  <xsl:value-of select="NAME"/>
</xsl:template>
			

Wartością xsl:value-of jest zawsze napis, którego treść zależy od zawartości elementu i jego rodzaju. Dla węzłów będzie to konkatenacja wszystkich napisów znajdujących się pomiędzy tagiem otwierającym i zamykającym elementu.
Dla węzła atom będzie więc to:

Hydrogen
  H    
  1
  1.00794
  1
  20.28
  13.81
  
    0.0899
			

Sposób wyliczanie wartości w zależności od rodzaju węzła zawiera tabela:

Rodzaj węzła Zwracana wartość
Korzeń Wartość korzenia
Element Konkatenacja wszystkich tekstów w elemencie i jego dzieciach
Tekst Tekst węzła, czyli on sam
Atrybut Znormalizowana wartość atrybutów
Namespace URI dla namespace
Instrukcja procesora Zawartość instrukcji bez, <? or ?>
Komentarz Tekst komentarza, <!-- and --> not included