XSL(T)

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

XSL Staat voor eXtensible Stylesheet Language. Het is een verzameling programmeertalen om XML-documenten te manipuleren. Oorspronkelijk was het bedacht als tegenhanger van CSS. Dus een taal die uitlegt hoe je een bepaald type XML-documenten weergeeft. Die functie heeft het nog steeds, naast andere toepassingen.

XSL bestaat uit een aantal onderdelen:

  • XSLT - Zie hieronder
  • XPath - The XML Path Language: Een expressietaal voor oa. XSLT om onderdelen van XML-documenten te benaderen, ontwikkeld door de W3C XQuery en XSLT Working Groups
  • XSL-FO - XSL Formatting Objects: Een taal om XML-documenten op te maken. In 2013 opgevolgd door CSS3
  • XQuery - Een taal om XML-documenten te querien (zegt [1]).

Introductie

XSLT oftewel XSL Tranformations Language (afgekort XSLT, niet XSLTL) is een taal om XML-documenten om te fietsen naar andere XML-documenten:

  • XSLT pas je toe in zogenaamde style sheets
  • XSLT transformeert niet zozeer elementen, maar node sets, oftewel source trees naar result trees
  • XSLT processors passen style sheets toe op een source tree. Alle gebruikelijke programmeertalen beschikken over bibliotheken die dit doen.
  • XSLT is een declaratieve programmeertaal [2], itt. een imperatieve programmeertaal. Je beschijft dus relatief eerder wat dan hoe. Net als CSS (denk aan floats) of SQL (dat bewerkingen op complete sets uitvoert, als het de kans krijgt, tenzij je cursors gebruikt, die weer imperatief zijn)
  • Daarnaast is XSLT functioneel[3]: Programmeren gaat middels expressies of declaraties itt. statements. Het vermijd changing-state en mutable data. Ik denk dat daarmee bedoeld wordt, dat je niet snel dingen zoals a=a+1 zult tegenkomen. Verder worden bronnen standaard niet overschreven, maar wordt uitvoer naar aparte bestanden weggeschreven
  • Alle dingen met <xsl:...> heten elementen, commando's, expressies of declaraties.

Commentaarregels

Zie Commentaarregels (XSL).

Header - top-level elementen

Zie Headers (XSL)

Voorbeeld: Indentatie bijwerken

In dit voorbeeld wordt input zonder transformatie doorgezet naar output, met één hele handige uitzondering: De indentatie wordt bijgewerkt:

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

   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="@*|node()">

      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>

   </xsl:template>

</xsl:stylesheet>

Voorbeeld: Gebruik voor opmaak

Voorbeeld van XSLT als opmaaktaal voor een XML-document:

<?xml version="1.0" encoding="UTF-8"?>

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

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

De XML-velden zijn hier geïncorporeerd in een groter geheel, dat uit HTML bestaat.

Dit is hoe je vanuit zo'n XML-document kunt verwijzen naar een bijbehorend XSL stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
.
.
</catalog>

Als je dit XML-bestand opent in een browser, kun je het resultaat zien.

Templates & template rules

[4]:

  • Templates lijken de basis-bouwstenen van XSL(T) te zijn. Een template-element bestaat uit één of meer regels om een template te genereren: Een boom met elementen
  • Het match-attribuut zorgt voor de selectie van elementen uit de bron. De waarde van een match-attribuut is een XPath-expressie
  • Match-waarde "/" selecteert het hele document. Voorbeeld:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:template match="/">

   </xsl:template>

</xsl:stylesheet>

Met alleen maar een template- & match-element, krijg je echter nog geen output: Je moet aangeven wat er precies gekopiëerd moet worden naar de nieuwe template.

Template rules zoals xsl:template zijn voorbeelden van transformaties: Source-trees die voldoen aan het gegeven match-attribute, worden overgenomen in de result-tree.

Identity Transformation

Zie XSL - Identity Transformation

value-of select

[5] Deze template

<xsl:template match="/">

 <xsl:value-of select="eExact/Items/Item"/>

</xsl:template>

Kopiëert het eerste onderdeel wat hoort onder de gegeven boom. In dit geval zitten daar iets van 10 velden onder, dus de waarden van die 10 velden voor het eerste record, worden geretourneerd.

  • XPath-uitdrukkingen zijn case-sensitief
  • Als je de hoofd-tag van een document kiest (hier eExact), dan krijg je de hele boom (niet handig trouwens).
  • Het value-of-statement kopiëert de waarde van de betreffende tags. De tags zelf worden niet meegenomen. Belangrijk om die nuance te zien!

for-each

[6]:

  • Loops doe je met for-each
  • De waarde van de bijbehorende elementen wordt uitgevoerd. Je krijgt dus geen XML-code. Ook niet als je dat wel zo specificeert in de header
  • Belangrijk dat je het complete pad specificeert vanaf de root. In dit geval dus inclusief eExact.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">

   <xsl:for-each select="eExact/Items/Item">
 
      <xsl:value-of select="Description"/>

   </xsl:for-each>
  			
</xsl:template>

</xsl:stylesheet>

Hierin kun je filteren. Zie [7] voor details.

Bronnen

Identity transformation