XSL - Attributen verwerken

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

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:

  1. Match op tag-naam
  2. Match op attribuutnaam
  3. Match op attribuutwaarde.

Bronnen