Recuperación de un documento XML completo en XQuery

Posted: septiembre 22nd, 2009 under eXist, XML, XQuery.

Después de unos meses absorbido por completo con la tesis, ya tengo un poco más de tiempo para continuar con el blog. El objetivo de las siguientes entradas será proporcionar algunos códigos XQuery/XSLT de utilidad. En la entrada de hoy mostraré una función XQuery para recuperar un documento XML completo.

Estamos habituados a usar doc(«/db/examples.xml») para recuperar un documento XML en XQuery, pero que sucede si queremos recuperar el documento XML completo con sólo algunos elementos hijos o con algunos atributos concretos. En este caso es necesario hacer una función XQuery recursiva para esta operación.


01. declare namespace f='f.ns';
02. declare function f:RetrieveXML($nodes as node()*) {
03. for $x in $nodes
04. return
05.    if ($x instance of comment()) then $x
06.    else if ($x instance of processing-instruction())then $x
07.   else if ($x instance of element()) (:también $x:)
08.   then element {node-name($x)} {
09.     for $y in $x/@* (: también $x/@*:)
10.       return attribute {local-name($y)}{$y}
11.      ,
12.      for $y in $x/node()
13.        return f:RetrieveXML($y)
14.   }
15.   else if ($x instance of text()) then xs:string($x)
16.   else ()
17. };
(: Ejemplo de uso : )
18. f:RetrieveXML(doc("/db/examples.xml")/*)

La implementación se realiza mediante la instrucción instance of. En primer lugar y a partir del nodo XML recibido (línea 2) se procesan todos sus descendientes y dependiendo de su tipo se realiza un procesamiento distinto: comentario (5), instrucción de procesamiento (6), elemento (7) o texto(15). En el caso de un elemento XML se procede a crear el elemento en cuestión (element), sus atributos (attribute) y a llamar recursivamente a sus descendientes.

En el caso de los atributos o elementos se podría hacer directamente $x pero he utilizado las instrucciones element y attribute de XQuery para entender su funcionamiento.

No hay comentarios »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment