Semistructured data, XML en querytalen > XML Querytalen > Vergelijking van de querytalen > Tag variables
Zoals al eerder vermeld is, kan het zijn dat een XML-document niet altijd met een DTD geleverd wordt. Om hier toch zinnige queries op uit te voeren, is het gebruik van elementvariabelen nodig. In de volgende query wordt er gezocht naar boeken waarbij een element tag hoort die voldoet aan de reguliere expressie *or (bijvoorbeeld author of editor) en waarvan de waarde Suciu is. Voor het resultaat wordt de originele tag gebruikt.
CONSTRUCT <bib> {
WHERE
<bib>
<book>
<title>$t</title>
<$a>Suciu</>
</book>
</bib> IN "www.bn.com/bib.xml",
$a LIKE '*or'
CONSTRUCT
<book>
<title>$t</title>
<$a>Suciu</>
</book>
} </bib>
Om de juiste tags te vinden wordt gebruik gemaakt van de variabele $a. De controle wordt uitgevoerd in de LIKE clausule. In de binnenste CONSTRUCT clausule wordt gebruik gemaakt van een lege sluittag (</>). Dit is omdat niet bekend is hoe deze sluittag er eigenlijk uitziet, daar niet duidelijk is wat voor waarde de variabele $a heeft. Het is ook mogelijk om tags te gebruiken als waarde van een element. Zo zou er dus in de binnenste CONSTRUCT clausule een nieuw element profession geïntroduceerd kunnen worden met als waarde de variabele $a (<profession>$a</profession>).
select xml(bib:
(select xml(book: {title: t, xml(LabelOf(a)): l})
from bib.book b, b.%or@a l , b.title t
where l = "Suciu"))
De functie LabelOf retourneert de string representatie van het pad naar de variabele a. Deze variabele wordt vervolgens gecontroleerd op de reguliere expressie %or om de juiste elementen te selecteren.
XQL ondersteunt geen tag variabelen en is dus niet in staat om deze query uit te voeren.
| << vorige | volgende >> | Robert Bouma, 19-04-2002 |