Exemples XQuery

Voici quelques exemples de requêtes XQueries utilisant le document XML suivant :

<?xml version="1.0" encoding="UTF-8"?>
<kml >
<Response>
<name>-122.857000,49.138000</name>
<Placemark id="p1">
<address>7455 132 St, Surrey, BC, Canada</address>
<Point><coordinates>-122.856695,49.137818,0</coordinates></Point>
</Placemark>
</Response>
</kml>

Puisque le nœud de premier niveau contient la déclaration d'espace de nommage 'xmlns', l'espace de noms doit être déclaré dans la requête et il doit être utilisé pour spécifier chaque élément. La requête :

declare namespace x='http://earth.google.com/kml/2.0';
/x:kml

donne le résultat suivant :

`_result' has value '<kml ><Response><name>-122.857000,49.138000</name><Placemark id="p1"><address>7455 132 St, Surrey, BC, Canada</address><Point><coordinates>-122.856695,49.137818,0</coordinates></Point></Placemark></Response></kml>'

Si le nœud au plus niveau n'a pas d'attribut de nom d'espace (c'est-à-dire <kml>), alors l'expression Xpath suivante produira le même résultat :

/kml

L'expression XPath ci-dessous renvoie la chaîne XML sans tenir compte de l'espace de nommage.

/*

De même, la profondeur de la requête peut être spécifiée en utilisant le jocker '*';

/*/*/*/*/*
`_result' has value `<coordinates >-122.856695,49.137818,0</coordinates>'

Une expression XPath commençant par '//' spécifie que la recherche part de n'importe quel noeud correspondant à l'élément qui suit immédiatement.

declare namespace x='http://earth.google.com/kml/2.0';
//x:Point
`_result' has value `<Point ><coordinates>-122.856695,49.137818,0</coordinates></Point>'

La requête suivante retourne tous les noeuds :

//*

Sept éléments sont retournés, correspondant à la valeur des éléments kml, response, name, Placemark, address, Point and coordinates.

Pour retrouver la valeur d'un attribut, il faut utiliser la syntaxe :

declare namespace x='http://earth.google.com/kml/2.0';
string(//x:Placemark/@id)
donne comme résultat `p1'

Dans tous les exemples ci-dessus, la requête était une simple expression XPath. XQuery prend également en charge des opérations plus complexes à l'aide des mots-clés "for", "let", "where", "order by" et "return". La source XML peut également être spécifiée dans la requête à l'aide de la fonction 'doc("file.xml")'.

declare namespace x='http://earth.google.com/kml/2.0';
for $node in doc("address.xml")//x:Placemark
where $node/@id = 'p1'
return concat( $node/address/text(),
" is located at " ,
$node/Point/coordinates/text() )
`_result' has value `7455 132 St, Surrey, BC, Canada is located at -122.856695,49.137818,0'

Voici quelques exemples de requêtes XQuery en mise à jour utilisant le document XML suivant :

<parcels>
<parcel>
<parcelLocation>
<parcelBounds>
<topLeft>49.37238665158286 -123.17986965179443 </topLeft>
<bottomRight> 49.37064012679701 -123.17738056182861</bottomRight>
</parcelBounds>
<parcelRef>49.3715203830451 -123.17888259887695 </parcelRef>
</parcelLocation>
<parcelOwner>
<owner>
<name>Alice Wight</name>
<address type="mail">1037 West 36 Ave, Vancouver, BC, CANADA</address>
<address type="email">alice.wight@example.com</address>
</owner>
</parcelOwner>
</parcel>
</parcels>

La requête suivante renomme les éléments "topLeft" et "bottomRight" quelle que soit leur position dans le document.

rename node //topLeft as "upperLeft",
rename node //bottomRight as "lowerRight"

Les lignes :

<topLeft>49.37238665158286 -123.17986965179443 </topLeft>
<bottomRight> 49.37064012679701 -123.17738056182861</bottomRight>

sont remplacées par :

<upperLeft>49.37238665158286 -123.17986965179443 </upperLeft>
<lowerRight> 49.37064012679701 -123.17738056182861</lowerRight>

Supposons qu'un format qui utilise une enveloppe homespun soit modifié pour utiliser l'enveloppe gml. Voici une XQuery pour effectuer cette modification :

declare namespace gml = "http://www.opengis.net/gml" ;
for $node in //parcelBounds
return (
delete node $node,
insert node <gml:envelope>
<gml:pos>{$node/topLeft/text()}</gml:pos>
<gml:pos>{$node/bottomRight/text()}</gml:pos>
</gml:envelope> as first into $node/..
)

Les lignes :

<parcelBounds>
<topLeft>49.37238665158286 -123.17986965179443 </topLeft>
<bottomRight> 49.37064012679701 -123.17738056182861</bottomRight>
</parcelBounds>

sont remplacées par :

<gml:envelope xmlns:gml="http://www.opengis.net/gml">
<gml:pos>49.37238665158286 -123.17986965179443 </gml:pos>
<gml:pos> 49.37064012679701 -123.17738056182861</gml:pos>
</gml:envelope>

Supposons qu'Alice Wight ait vendu sa parcelle à Henry Cooper. La requête suivante mettra à jour les informations pertinentes dans le fichier "parcelles.xml" (qui contient l'échantillon XML original) :

for $node in doc("parcels.xml")//owner where $node/name = "Alice Wight"
return (
remplace la valeur du noeud $node/name par "Henry Cooper",
replace value of node $node/address[@type='mail']
with "2062 West 38 Ave, Vancouver, BC, CANADA",
replace value of node $node/address[@type='email']
with "henry.cooper@example.com"
)

Dans le fichier "parcels.xml", les lignes :

<owner>
<name>Alice Wight</name>
<address type="mail">1037 West 36 Ave, Vancouver, BC, CANADA</address>
<address type="email">alice.wight@example.com</address>
</owner>

Seront remplacées par :

<owner>
<name>Henry Cooper</name>
<address type="mail">2062 West 38 Ave, Vancouver, BC, CANADA</address>
<address type="email">henry.cooper@example.com</address>
</owner>