Headers (XSL)

Uit De Vliegende Brigade
Versie door Jeroen Strompf (overleg | bijdragen) op 10 mei 2018 om 11:15 (→‎omit-xml-declaration)
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Naar navigatie springen Naar zoeken springen

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