Ik probeer met XQuery een XML document om te zetten naar een ander XML document. Ik heb daarin een document met elementen van de vorm <foo x="y" /> die omgezet moeten worden naar <bar x="y">. Dit werkt op zich prima met dit soort code:
De uitvoer is dan, zoals verwacht, <output><bar x="aap"/><bar x="noot"/><bar x="mies"/></output>.
Echter, soms is het attribuut "x" niet aanwezig. In dat geval wil ik eigenlijk dat het attribuut ook in de gegenereerde elementen weglaten. Bovenstaande code genereert dan echter een leeg attribuut, dus <bar x=""/> in plaats van gewoon <bar/>.
Nu heb ik daar de volgende work-around voor gevonden:
Dit genereert de gewenste uitvoer (<output><bar x="aap"/><bar/><bar x="mies"/></output>) maar het blijft een lelijke hack; niet echt duidelijk om te lezen, en misschien ook niet zo efficient (al is dat van secundair belang). De vraag is dus: is er een betere manier om dit te doen?
XQuery:
1
2
3
4
5
| let $doc := <input><foo x="aap"/><foo x="noot"/><foo x="mies"/></input> return <output>{ for $foo in $doc/foo return <bar x="{$foo/@x}" /> }</output> |
De uitvoer is dan, zoals verwacht, <output><bar x="aap"/><bar x="noot"/><bar x="mies"/></output>.
Echter, soms is het attribuut "x" niet aanwezig. In dat geval wil ik eigenlijk dat het attribuut ook in de gegenereerde elementen weglaten. Bovenstaande code genereert dan echter een leeg attribuut, dus <bar x=""/> in plaats van gewoon <bar/>.
Nu heb ik daar de volgende work-around voor gevonden:
XQuery:
1
2
3
4
5
6
7
| let $doc := <input><foo x="aap"/><foo/><foo x="mies"/></input> return <output>{ for $foo in $doc/foo return <bar> { let $x := $foo/@x where $x return <dummy x="{$x}"/>/@x }</bar> }</output> |
Dit genereert de gewenste uitvoer (<output><bar x="aap"/><bar/><bar x="mies"/></output>) maar het blijft een lelijke hack; niet echt duidelijk om te lezen, en misschien ook niet zo efficient (al is dat van secundair belang). De vraag is dus: is er een betere manier om dit te doen?