Headers (XSL)
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"/>