XSL(T): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
 
(30 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 7: Regel 7:
 
* XSL-FO - XSL Formatting Objects: Een taal om XML-documenten op te maken. In 2013 opgevolgd door CSS3
 
* 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 [https://www.w3schools.com/xml/xsl_languages.asp]).
 
* XQuery - Een taal om XML-documenten te querien (zegt [https://www.w3schools.com/xml/xsl_languages.asp]).
 +
 +
== Introductie ==
  
 
'''XSLT''' oftewel ''XSL Tranformations Language'' (afgekort XSLT, niet XSLTL) is een taal om XML-documenten om te fietsen naar andere XML-documenten:
 
'''XSLT''' oftewel ''XSL Tranformations Language'' (afgekort XSLT, niet XSLTL) is een taal om XML-documenten om te fietsen naar andere XML-documenten:
Regel 13: Regel 15:
 
* XSLT transformeert niet zozeer ''elementen'', maar ''node sets'', oftewel ''source trees'' naar ''result trees''
 
* 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 processors'' passen style sheets toe op een source tree. Alle gebruikelijke programmeertalen beschikken over bibliotheken die dit doen.
 +
* XSLT is een ''declaratieve'' programmeertaal [https://en.wikipedia.org/wiki/Declarative_programming], 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''[https://en.wikipedia.org/wiki/Functional_programming]: 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 <code><xsl:...></code> heten ''elementen'', ''commando's'', ''expressies'' of ''declaraties''.
  
== Style sheet declaration ==
+
== Commentaarregels ==
  
De ''root'' van een XML style sheet (=XSLT-bestand) is een <code>xsl:stylesheet</code>- of <code>xsl:transform</code>-element (deze twee termen zijn synoniem  [http://www.xml.com/pub/2000/06/07/transforming/index.html]). De correctie declaratie van een XSL style sheet is
+
Zie [[Commentaarregels (XSL)]].
  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
== Header - top-level elementen ==
  
of
+
Zie [[Headers (XSL)]]
  
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
== Voorbeeld: Indentatie bijwerken ==
  
Om toegang te krijgen tot XSLT elementen, attributen en functionaliteiten, moet je een ''XSLT namespace'' declareren aan het begin van het document. De declaratie
+
In dit voorbeeld wordt input zonder transformatie doorgezet naar output, met één hele handige uitzondering: De indentatie wordt bijgewerkt:
  
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+
<pre>
 +
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
verwijst naar de officiële W3C XSLT namespace.
+
  <xsl:output method="xml" indent="yes"/>
 +
 
 +
  <xsl:template match="@*|node()">
 +
 
 +
      <xsl:copy>
 +
        <xsl:apply-templates select="@*|node()"/>
 +
      </xsl:copy>
 +
 
 +
  </xsl:template>
 +
 
 +
</xsl:stylesheet>
 +
</pre>
  
 
== Voorbeeld: Gebruik voor opmaak ==
 
== Voorbeeld: Gebruik voor opmaak ==
Regel 87: Regel 104:
 
== Templates & template rules ==
 
== Templates & template rules ==
  
* [https://www.w3schools.com/xml/xsl_templates.asp]
+
[https://www.w3schools.com/xml/xsl_templates.asp]:
 +
 
 
* ''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
 
* ''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''
 
* Het ''match''-attribuut zorgt voor de selectie van elementen uit de bron. De waarde van een match-attribuut is een ''XPath-expressie''
Regel 96: Regel 114:
 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
<xsl:template match="/">
+
  <xsl:template match="/">
</xsl:template>
+
 
 +
  </xsl:template>
  
 
</xsl:stylesheet>
 
</xsl:stylesheet>
Regel 106: Regel 125:
 
''Template rules'' zoals <code>xsl:template</code> zijn voorbeelden van transformaties: Source-trees die voldoen aan het gegeven match-attribute, worden overgenomen in de result-tree.
 
''Template rules'' zoals <code>xsl:template</code> zijn voorbeelden van transformaties: Source-trees die voldoen aan het gegeven match-attribute, worden overgenomen in de result-tree.
  
== Voorbeeld: Intendatie bijwerken ==
+
== Identity Transformation ==
 
 
In dit voorbeeld wordt input zonder transformatie doorgezet naar output, met één hele handige uitzondering: De intendation wordt bijgewerkt:
 
  
<pre>
+
Zie [[XSL - Identity Transformation]]
<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>
 
</pre>
 
  
 
== value-of select ==
 
== value-of select ==
Regel 138: Regel 143:
 
* XPath-uitdrukkingen zijn case-sensitief
 
* 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).
 
* 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 ==
 
== for-each ==
  
Zo doe je loops:
+
[https://www.w3schools.com/xml/xsl_for_each.asp]:
 +
 
 +
* 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''.
  
 
<pre>
 
<pre>
 +
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 +
<xsl:output method="xml" indent="yes"/>
 +
 
<xsl:template match="/">
 
<xsl:template match="/">
  
<xsl:for-each select="eExact/Items/Item" >   ← Dit is een binair element. Er hoort dus een apart afsluit-element bij
+
  <xsl:for-each select="eExact/Items/Item">
 +
 +
      <xsl:value-of select="Description"/>
  
<xsl:value-of select="Description"/>   ← Dit is een enkelvoudig element, met een schuine streep voor het sluit-teken
+
  </xsl:for-each>
 +
 
 +
</xsl:template>
  
</xsl:for-each> ← Dit is het afsluit-element
+
</xsl:stylesheet>
 
 
 
 
</xsl:template>
 
 
</pre>
 
</pre>
  
Regel 165: Regel 179:
 
* https://www.w3schools.com/xml/xsl_languages.asp - Leest prettig
 
* https://www.w3schools.com/xml/xsl_languages.asp - Leest prettig
 
* https://www.w3schools.com/xml/xsl_templates.asp
 
* https://www.w3schools.com/xml/xsl_templates.asp
 +
 +
=== Identity transformation ===
 +
 +
* https://stackoverflow.com/questions/5941233/how-to-copy-specific-attribute-using-xslt
 +
* http://www.dpawson.co.uk/xsl/sect2/identity.html

Huidige versie van 20 apr 2018 om 16:20

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