XSL(T): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
Regel 85: Regel 85:
 
Als je dit XML-bestand opent in een browser, kun je het resultaat zien.
 
Als je dit XML-bestand opent in een browser, kun je het resultaat zien.
  
== Templates ==
+
== Templates & template rules ==
  
 
* [https://www.w3schools.com/xml/xsl_templates.asp]
 
* [https://www.w3schools.com/xml/xsl_templates.asp]

Versie van 16 apr 2018 20:07

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

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.

Style sheet declaration

De root van een XML style sheet (=XSLT-bestand) is een xsl:stylesheet- of xsl:transform-element (deze twee termen zijn synoniem [2]). De correctie declaratie van een XSL style sheet is

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

of

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

Om toegang te krijgen tot XSLT elementen, attributen en functionaliteiten, moet je een XSLT namespace declareren aan het begin van het document. De declaratie

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

verwijst naar de officiële W3C XSLT namespace.

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

  • [3]
  • 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

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

Voorbeeld: Intendatie bijwerken

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />

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

</xsl:stylesheet>

value-of select

[4] 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).

for-each

Zo doe je loops:

<xsl:template match="/">

	<xsl:for-each select="eExact/Items/Item" >   ← Dit is een binair element. Er hoort dus een apart afsluit-element bij

		<xsl:value-of select="Description"/>   ← Dit is een enkelvoudig element, met een schuine streep voor het sluit-teken

	</xsl:for-each> ← Dit is het afsluit-element


</xsl:template>

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

Bronnen