XQL
Este tutorial estudia las consultas XQL más sencillas, que por otra parte son las más empleadas. Aquí se presentará una visión general del lenguaje XQL, todo lo precisa que sea posible.
Una simple cadena se toma como un elemento nombre. Por ejemplo, esta consulta devuelve todos los elementos <table>:
table
El operador hijo ("/") indica jerarquía. Esta consulta devuelve los elementos <author> que son hijos de los elementos <front>:
front/author
La raíz de un documento puede ser indicada mediante un operador "/":
/novel/front/author
Nota: en XQL, la raíz de un documento se refiere a la entidad de un documento, en el sentido técnico de XML, lo que equivale básicamente al documento mismo. Esto no es lo mismo que el elemento raíz, que es el elemento que contiene al resto de elementos en el documento. La raíz del documento siempre contiene al elemento raíz, pero además puede contener un tipo, instrucciones de procesamiento y comentarios. En este ejemplo, <novel> sería el elemento raíz.
La rutas se describen siempre de arriba a abajo, y salvo que se indique de otro modo, se devuelve el elemento de la ruta de más a la derecha. Por ejemplo, en el ejemplo de arriba, se devolvería el elemento <author>.
El contenido de un elemento o del valor de un atributo debe especificarse usando el operando de igualdad ("="). Lo siguiente devolvería todos los autores con nombre "Theodore Seuss Geisel".
front/author='Theodore Seuss Geisel'
Los nombres de atributos comienzan con "@". Se les trata como hijos de los elementos a los que pertenecen.
front/author/address/@type='email'
El operador descendiente ("//") indica que pueden intervenir cualquier número de niveles. A continuación se muestran todas las direcciones dentro de front:
front//address
Cuando el operador descendiente se encuentra al comienzo de la ruta, equivale a todos los nodos descendientes del documento. Esta consulta encontrará todas las direcciones en el documento:
//address
El operador filtro ("[]") filtra la serie de nodos de su izquierda sobre la base de las condiciones de dentro de los paréntesis. Lo siguiente devuelve las direcciones. Cada una de estas direcciones debe tener un atributo llamado "tipo" con el valor "correo electrónico":
front/author/address[@type='email']
Observese que "address[@type='email']" devuelve direcciones, pero "address/@type='email'" devuelve tipos de atributos de tipo.
Pueden combinarse múltiples condiciones usando operadores booleanos.
front/author='Theodore Seuss Geisel'[@gender='male' and @shoesize='9EEEE']
Los paréntesis se utilizan también para subíndices, que indican la posición dentro de un documento. A continuación se refiere a las secciones 0, 3, 4, 5, y 8, además de la última sección:
section[0, 3 to 5, 8, -1]
Condiciones y subíndices no pueden aparecer en los mismos paréntesis, pero sí en diferentes en la misma consulta. Lo siguiente se refiere a las tres primeras secciones, cuyo nivel de los atributos tiene el valor "3", en otras palabras, devuelve las tres primeros "nivel 3" secciones:
section[@level='3'][0 to 2]
Ahora que sabemos lo básico, echemos un vistazo a un documento y probemos algunas consultas XQL sobre el mismo. El siguiente es un documento de factura. Tradicionalmente, las facturas a menudo se almacenan en bases de datos, pero las facturas son los documentos y los datos. XQL está diseñado para funcionar en ambos documentos y datos, siempre que estén representados en XML mediante un interfaz. Este documento será la base de la muestra de consultas que siguen:
<?xml version="1.0"?>
<invoicecollection>
<invoice>
<customer>
Wile E. Coyote, Death Valley, CA
</customer>
<annotation>
Customer asked that we guarantee return rights if these items should fail in desert conditions.
This was approved by Marty Melliore, general manager.
</annotation>
<entries n=2>
<entry quantity=2 total_price="134.00">
<product maker="ACME" prod_name="screwdriver"
price="80.00"/>
</entry>
<entry quantity=1 total_price="20.00">
<product maker="ACME" prod_name="power wrench"price="20.00"/>
</entry>
</entries>
</invoice>
<invoice>
<customer>
Camp Mertz
</customer>
<entries n=2>
<entry quantity=2 total_price="32.00">
<product maker="BSA" prod_name="left-handed smoke shifter" price="16.00"/>
</entry>
<entry quantity=1 total_price="13.00">
<product maker="BSA" prod_name="snipe call"price="13.00"/>
</entry>
</entries>
</invoice>
</invoicecollection>
Ahora echemos un vistazo a algunas consultas de muestra. Supongamos que queremos ver sólo los clientes de la base de datos. Podríamos hacer la siguiente consulta:
//customer
Si quisieramos conocer todos los productos fabricados por la BSA:
//product[@maker='BSA']
Los filtros son útiles para especificar condiciones en rutas que no son las mismas que se devuelven. Por ejemplo, a continuación se enumeran los pedidos ordenados por Camp Mertz:
//invoice[customer='Wile E. Coyote, Death Valley,
CA']//


