Ik loop nu al een tijdje te klooien maar kom er niet uit, vandaar mijn vraag aan jullie.
Ik heb een MS SQL database met daarin een tabel met een duizendtal records. Elk record bestaat uit een kolom met een id en een kolom met XML data.
Een willekeurig record in de kolom met XML data zou er zo uit kunnen zien:
Nu wil ik graag met een SQL query de XML aanpassen voor het attribuut @invariant, en wel volgens de volgende regels:
- Per unieke occ (occurence), tag combinatie kan er maar 1x @invariant=true voorkomen
- Indien een <field> gevuld is met @lang=en-US moet @invariant=true worden, eventuele overige velden met dezelfe tag, occ combinatie moeten op @invariant=false blijven staan. (Zie tag=aa in XML code)
- Indien een <field> gevuld is met @lang=nl-NL, en geen @lang=en-US bevat, moet @invariant=true worden, eventuele overige velden met dezelfe tag en occ moeten op @invariant=false blijven staan. (Zie tag=ac in XML code)
- Indien een tag en occ combinatie maar 1 @lang attribuut bevat moet @invariant=true worden. (Zie tag=ae in XML code). Dus onafhankelijk van de waarde van @lang.
Na uitvoering van 1 (of meerdere) SQL query zou de XML er dan zou uit moeten komen zien:
Aangezien ik niet zo'n query held ben loop ik hier al een tijdje mee te klooien.
Waar ik tegen aanloop is de toepassing van de regels en dat alles binnen een loop, aangezien je niet meerdere nodes tegelijkertijd kan bewerken met replace-value-of.
Mijn probeersel, zonder regels...
Jullie hulp zou ik zeer waarderen!
Ik heb een MS SQL database met daarin een tabel met een duizendtal records. Elk record bestaat uit een kolom met een id en een kolom met XML data.
Een willekeurig record in de kolom met XML data zou er zo uit kunnen zien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| <record id="1"> <field tag="aa" occ="1" lang="nl-NL" invariant="false">Jan</field> <field tag="aa" occ="1" lang="en-US" invariant="false">John</field> <field tag="aa" occ="1" lang="de-DE" invariant="false">der Jan</field> <field tag="aa" occ="2" lang="nl-NL" invariant="false">Jan2</field> <field tag="aa" occ="2" lang="en-US" invariant="false">John2</field> <field tag="ab" occ="1">Blabla</field> <field tag="ac" occ="1" lang="de-DE" invariant="false">Rechnung</field> <field tag="ac" occ="1" lang="nl-NL" invariant="false">rekening</field> <field tag="ad" occ="1">Vulling</field> <field tag="ae" occ="1" lang="nl-NL" invariant="false">stoeptegel</field> </record> |
Nu wil ik graag met een SQL query de XML aanpassen voor het attribuut @invariant, en wel volgens de volgende regels:
- Per unieke occ (occurence), tag combinatie kan er maar 1x @invariant=true voorkomen
- Indien een <field> gevuld is met @lang=en-US moet @invariant=true worden, eventuele overige velden met dezelfe tag, occ combinatie moeten op @invariant=false blijven staan. (Zie tag=aa in XML code)
- Indien een <field> gevuld is met @lang=nl-NL, en geen @lang=en-US bevat, moet @invariant=true worden, eventuele overige velden met dezelfe tag en occ moeten op @invariant=false blijven staan. (Zie tag=ac in XML code)
- Indien een tag en occ combinatie maar 1 @lang attribuut bevat moet @invariant=true worden. (Zie tag=ae in XML code). Dus onafhankelijk van de waarde van @lang.
Na uitvoering van 1 (of meerdere) SQL query zou de XML er dan zou uit moeten komen zien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| <record id="1"> <field tag="aa" occ="1" lang="nl-NL" invariant="false">Jan</field> <field tag="aa" occ="1" lang="en-US" invariant="true">John</field> <field tag="aa" occ="1" lang="de-DE" invariant="false">der Jan</field> <field tag="aa" occ="2" lang="nl-NL" invariant="false">Jan2</field> <field tag="aa" occ="2" lang="en-US" invariant="true">John2</field> <field tag="ab" occ="1">Blabla</field> <field tag="ac" occ="1" lang="de-DE" invariant="false">Rechnung</field> <field tag="ac" occ="1" lang="nl-NL" invariant="true">rekening</field> <field tag="ad" occ="1">Vulling</field> <field tag="ae" occ="1" lang="nl-NL" invariant="true">stoeptegel</field> </record> |
Aangezien ik niet zo'n query held ben loop ik hier al een tijdje mee te klooien.
Waar ik tegen aanloop is de toepassing van de regels en dat alles binnen een loop, aangezien je niet meerdere nodes tegelijkertijd kan bewerken met replace-value-of.
Mijn probeersel, zonder regels...
code:
1
2
3
4
5
6
7
8
| update databasetabel set xmlkolom.modify ( ' replace value of (/record/field/@invariant=false) with "true" ' ) |
Jullie hulp zou ik zeer waarderen!