Headers (XSL)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Er staat van alles en nog wat aan het begin van een xsl-bestand. Die dingen heten top-level elementen. Daar zitten een paar geinige dingen bij.

XML-shebang

XSL-documenten kunnen beginnen met een optionele XML-declaratie, bv.:

<?xml version="1.0" ?>

Dit is vermoedelijk een shebang-declaratie en niet een XML-tag. Het begint namelijk met <? en er is geen corresponderend sluit-tag

De reden om dit te doen: Dan herkent Sublime Editor het bestandstype. Da's handig voor bv. color highlighting maar vooral om code in- of uit te commentariseren met de toetscombinatie CTRL /. Plus vast nog wel meer voordelen.

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 [1]). De correcte declaratie van een XSL style sheet is bv.

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

Version

Bestaat er überhaupt een versie hoger dan 1.0? → Weinig spannend.

Namespace

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. In de lente van 2018 kwam ik ook xmlns:ext="http://exslt.org/common" tegen, maar ik weet niet waar het betrekking op heeft.

Exclude-result-prefixes

In de lente van 2018 kwam ik dit tegen:

<xsl:stylesheet 
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ext="http://exslt.org/common"
  exclude-result-prefixes="ext xsl">

Ik weet niet wat de regel exclude-result-prefixes="ext xsl" doet.

Output-specificaties

Encoding

<xsl:output encoding="UTF-8"/> spreekt voor zich.

Dit statement komt ook voor in de XML-declaratie aan het begin van het bestand. Ik denk dat ik dit echter een meer logische plek vind.

Method

Ik weet niet precies wat de declaratie

<xsl:output method="xml"/>

doet. Ik dacht dat-ie ervoor zorgt dat tags behouden blijft. Dat lijkt genuanceerder te liggen.

Indent

Declaratie

<xsl:output indent="yes"/>

werkt indentatie bij, maar het doet niets als er meerdere tags op één regel staan: Die worden niet gesplitst. Ik weet niet precies hoe je dat voor elkaar krijgt.

omit-xml-declaration

<xsl:output omit-xml-declaration="yes"/> verwijdert de typische eerste regel van het XML-bestand. Wellicht handig als laatste stap voorafgaand aan import, maar niet handig als je het document opnieuw wilt verwerken met XSL, want dan krijg je een foutmelding.

→ Dit klopt niet!

strip-space

De declaratie

<xsl:strip-space elements="*" />

verwijdert white space rondom elementen, waardoor alles op één regel belandt. Bv.:

<?xml version="1.0"?>
<Items><Item><Item_code>00000001</Item_code><Item_type>S</Item_type><item_description>Dinges_01</item_description><FreeFields><FreeTexts><free_text_1/><free_text_2>Veld_02</free_text_2><free_text_3>Veld_03</free_text_3><free_text_4/></FreeTexts></FreeFields><item_category_9><item_category_9_code/><item_category_9_description/></item_category_9><item_category_10><item_category_10_code>2</item_category_10_code><item_category_10_description>Bezig</item_category_10_description></item_category_10></Item><Item><Item_code>00000002</Item_code><Item_type>S</Item_type><item_description>Widget_01</item_description><FreeFields><FreeTexts><free_text_1/><free_text_2>Field_02</free_text_2><free_text_3>Field_03</free_text_3><free_text_4/></FreeTexts></FreeFields><item_category_9><item_category_9_code/><item_category_9_description/></item_category_9><item_category_10><item_category_10_code>2</item_category_10_code><item_category_10_description>Active</item_category_10_description></item_category_10></Item></Items>

maar het helpt ook om lege regels (dankzij filters) te verwijderen.

Als je strip-space en indent combineert, krijg je meestal goed-vormgegeven code:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*" />
<xsl:output indent="yes"/>
<?xml version="1.0"?>
<Items>
  <Item>
    <Item_code>00000001</Item_code>
    <Item_type>S</Item_type>
    <item_description>Dinges_01</item_description>
    <FreeFields>
      <FreeTexts>
        <free_text_1/>
        <free_text_2>Veld_02</free_text_2>
        <free_text_3>Veld_03</free_text_3>
        <free_text_4/>
      </FreeTexts>
    </FreeFields>
    <item_category_9>
      <item_category_9_code/>
      <item_category_9_description/>
    </item_category_9>
    <item_category_10>
      <item_category_10_code>2</item_category_10_code>
      <item_category_10_description>Bezig</item_category_10_description>
    </item_category_10>
  </Item>
  <Item>
    <Item_code>00000002</Item_code>
    <Item_type>S</Item_type>
    <item_description>Widget_01</item_description>
    <FreeFields>
      <FreeTexts>
        <free_text_1/>
        <free_text_2>Field_02</free_text_2>
        <free_text_3>Field_03</free_text_3>
        <free_text_4/>
      </FreeTexts>
    </FreeFields>
    <item_category_9>
      <item_category_9_code/>
      <item_category_9_description/>
    </item_category_9>
    <item_category_10>
      <item_category_10_code>2</item_category_10_code>
      <item_category_10_description>Active</item_category_10_description>
    </item_category_10>
  </Item>
</Items>

Merk op dat <xsl:output method="xml"/> hierbij niet gebruikt wordt.

In de praktijk

De <xsl:stylesheet>-tag is openings- en closing-tag van het hele XSL-document. Meestal indenteer ik alles wat daartussen staat.

Als de output XML-moet zijn

Steeds dezelfde header, maar met verschillende formattering:

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


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

of

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

Dit gaat me meestal te ver:

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

Als de output voor import gebruikt wordt

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

of

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

of

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

Bronnen