XSL - Attributen verwerken
Het probleem
Ik wil XML-code importeren in een database. Daarbij komen alle eind-nodes overeen met kolomnamen. Daarvoor moeten tags uniek zijn. Dat heb ik hier geregeld. Nu het volgende probleem: Wat doe ik met attributen? → Die wil ik omfietsen naar aparte tags, om ze op dezelfde manier te kunnen importeren als de andere tags --
Maar niet altijd: Er zijn twee situaties:
Testdata
<?xml version="1.0"?> <Items> <Item code="00000001" type="S"> <Description>Dinges_01</Description> <FreeFields> <FreeTexts> <FreeText number="1"/> <FreeText number="2">Veld_02</FreeText> <FreeText number="3">Veld_03</FreeText> <FreeText number="4"/> </FreeTexts> </FreeFields> </Item> <Item code="17900080" type="S"> <Description>Widget_02</Description> <FreeFields> <FreeTexts> <FreeText number="1"/> <FreeText number="2">Field_02</FreeText> <FreeText number="3">Field_03</FreeText> <FreeText number="4"/> </FreeTexts> </FreeFields> </Item> </Items>
Situatie (1): Attribuutnaam wordt nieuw element
Concreter: Ik wil een tag-met-attributen zoals
<Item code="00000001" type="S">
transformeren naar
<item> <item_code>00000001</item_code> <item_type>S</item_type>
Situatie (2): Attribuutwaarde wordt nieuw element
En data zoals
<FreeText number="1"/> <FreeText number="2">Veld_02</FreeText> <FreeText number="3">Veld_03</FreeText> <FreeText number="4"/>
moet worden:
<FreeText_number_01/> <FreeText_number_02>Veld_02</FreeText_number_02> <FreeText_number_03>Veld_03</FreeText_number_03> <FreeText_number_04/>
al zou de oplossing in de vorige paragreef hier ook prima werken.
Terminologie
Het is nogal lastig denken over een probleem, als je het niet eens kunt benoemen. Hierbij wat terminologie, onderhevig aan nieuwe inzichten:
In:
<Item code="00000001" type="S" searchcode="00000001"> <Description>Widget</Description> </item>
Hebben de onderdelen deze namen:
* <item>, <description> - Dit zijn tags * <description> - Eindnode * code="00000001" - Attribuut * code - Attribuutnaam * 00000001 - Attribuutwaarde.
Match op tagnaam
Om attributen te manipuleren, heb je in oa. deze aanpakken:
- Match op tag-naam
- Match op attribuutnaam
- Match op attribuutwaarde.
Bronnen
- https://stackoverflow.com/questions/5332266/xslt-copy-attributes-from-child-element
- https://stackoverflow.com/questions/5941233/how-to-copy-specific-attribute-using-xslt
- https://stackoverflow.com/questions/45882396/in-xslt-how-to-copy-all-attributes-from-all-child-nodes-to-root-node-of-xml
- https://stackoverflow.com/questions/19016023/xslt-copy-attribute-into-a-new-element-in-the-child - Dit is precies mijn probleem
- http://dh.obdurodon.org/identity.xhtml