Professional Documents
Culture Documents
Curso 2010/2011
Alumno:
Carmelo Cascone
-1 -
Indice
1. Introducción .................................................................................4
2. XPath ...........................................................................................5
Nodo contexto..............................................................................................8
Ejemplos.....................................................................................................14
3. XSLT ..........................................................................................16
4. XQuery .......................................................................................25
For..............................................................................................................27
Return........................................................................................................28
Let..............................................................................................................29
-2 -
-3 -
1. Introducción
XML (Extensible Markup Language) incluye tecnologías que permiten tanto con-
sultar como transformar los documentos XML, entre estas tecnologías destacan:
Diversas tecnologías XML, como XSLT y XQuery, utilizan XPath como elemento
de soporte.
-4 -
2. XPath
XPath usa una notación con barras inclinadas (/) similar al terminal de UNIX.
Esto es para que XPath se pueda utilizar Uniformed Resource Identifiers (URIs),
tales como URLs. De aquí viene el nombre de XPath: el uso de una notación de
caminos como en las URLs.
Las expresiones XPath pueden incluir predicados. Los predicados contienen expre-
siones booleanas, las cuales comprueban cada nodo en el contexto del conjunto de
nodos. Si cumple la condición, el nodo es mantenido en el conjunto como nodo
identificado, en otro caso el nodo es descartado. Los predicados son usados en re-
ducciones del conjunto resultado. Las expresiones XPath pueden referenciar atri-
butos de los elementos XML.
XPath también proporciona funciones, las cuales pueden resultar muy útiles.
-5 -
2.1. Tipos de nodos
‣ Element: existe un nodo de tipo elemento por cada elemento del documento
fuente XML.
‣ Attribute: son los definidos como atributos en el documento XML. Los nodos
atributo siempre pertenecen a algún elemento, nunca aparecen solos y no con-
tienen a ningún otro nodo.
‣ Text: los datos de tipo carácter en el documento XML se consideran como no-
dos de texto. Dentro de cada nodo de texto se agruparán el mayor número de
caracteres posibles, por lo que un nodo de texto jamás tendrá un following o
preceding sibling de tipo nodo de texto.
-6 -
</book>
</bookstore>
ERRNVWRUH
ERRN
WLWOH
ODQJHQ
DXWKRU
\HDU
SULFH
-7 -
2.2. Location Path
‣ /usr/home/docs/
Esta instrucción UNIX hace referencia a un único directorio: docs el cual cuelga de el
conjunto de directorios /usr/home.
‣ /bookstore/book/author
Esta expresión XPath referencia a todos los elementos author que cuelguen directamente de
cualquier elemento book que cuelgue del nodo bookstore.
Hay que tener en cuenta que una expresión en XPath no devuelve los elementos
que cumplen con el patrón que representa dicha expresión, pero devuelve una re-
ferencia a dichos elementos; es decir, una expresión XPath nos devuelve una lista
de apuntadores a los elementos que encajan en el patrón. Dicha lista puede estar
vacía o contener uno o más nodos.
-8 -
tentes en el directorio /usr/bin con independencia del directorio en que estemos
colocados al dar la orden.
En los location path ocurre lo mismo. A menos que se indique un camino explíci-
to, se entenderá que el location path parte del nodo que en cada momento se esté
procesando.
Ejemplo:
‣ /bookstore/book/author
Ejemplo:
‣ /bookstore/child::book/author[position() = 2]
Axis
El axis es la parte del location path que nos permite definir la relaccion de paren-
tesco entre el nodo contexto actual y el nuevo node-set que se quiere selecionar,
por ejemplo es posible definir relaciones como “los padres de.. los hijos de.. los
atributos de.. etc..”).
-9 -
$;,6
12'2
5HODFLyQHQWUH 18(92
&217(;72
ORVGRV 12'(6(7
$&78$/
Ejemplo:
‣ /bookstore/child::book = /bookstore/child
AXIS Descripción
::attribute Selecciona un atributo del nodo contexto. Como solo los no-
dos de tipo elemento pueden tener atributos, si el nodo de
contexto no es de tipo elemento, el conjunto de nodos resul-
forma abreviata @ tante estará vacío.
- 10 -
::ancestor Selecciona todos los elementos hasta la raíz incluida, situa-
dos por encima del nodo contexto.
::preceding-sibling Selecciona todos los nodos anteriores hijos del mismo padre
que el nodo de contexto. (hermano anterior)
::following Selecciona todos los nodos con el mismo nombre que apare-
cen “por completo”, es decir, con sus descendientes, después
del nodo de contexto. (siguiente)
::following-sibling Selecciona todos los nodos siguientes hijos del mismo padre
que el nodo de contexto. (hermano siguiente)
Node Test
Los node test son algo así como funciones que nos van a ayudar a restringir lo que
nos devuelve una expresión XPath. Se utilizan para definir la tipología, o direc-
tamente el nombre, del nodo que queremos seleccionar, a partir de todos los no-
dos disponibles por el axis especificado. Por ejemplo: “todos los nodos de tipo tex-
to que son hijos de..” o “todos los nodos de tipo <author> que descendiendan
de..”).
- 11 -
comment() Cualquier nodo de tipo comentario
‣ child::book
Selecciona todos los nodos book que son hijos del nodo actual.
‣ attribute::lang
‣ child::*
‣ attribute::*
‣ child::text()
Selecciona todos los nodos de tipo texto que son hijos del nodo actual.
‣ child::node()
‣ descendant::book
‣ ancestor::book
‣ ancestor-or-self::book
Selecciona todos los nodos book ancestros del nodo actual, y el actual si es también un
nodo book.
‣ child::*/child::price
Selecciona todos los nodos nietos de tipo price del nodo actual.
- 12 -
Predicate
Ejemplo:
‣ /bookstore/book/title[@lang = "en"]
‣ /bookstore/book[position() = 2]
Aparte de estos operadores, XPath, define funciones estándar para realizar opera-
ciones en nodos, cadenas (strings), valores numéricos y valores boléanos. Los
nombres y la sintaxis de esta funciones son muy parecidos a otros lenguajes de
programación
- 13 -
2.2.4. Ejemplos
En este ejemplos se hace referencia a un documento XML que describe una libre-
ría, con al interior diversos tipos de elementos tales como libros, vídeos y música
así como es mostrado en la figura abajo.
bookstore.xml
<bookstore>
<book>
<title lang="es">...</title>
<aututhor>…</author>
…
</book>
…
<movie>
<title>…</title>
<director>…</director>
…
</movie>
…
<music>
<title>...</title>
<artist>...</artist>
<genre>...</genre>
…
</music>
…
</bookstore>
‣ /bookstore/child::book/child::title
‣ /bookstore/book[@available]
‣ /bookstore/*/title[@lang = 'it']
‣ //genre/..
Selecciona todos los nodos que tengan algun hijo de tipo genre.
- 14 -
‣ //music[position() = last()]/node()
‣ /bookstore/*[title[@lang='es']][@available]/..
Selecciona todos los elementos (book, movie o music) que tengan un hijo de tipo title
con atributo lang = es y que tengan el atributo available declarado.
‣ count(/bookstore/*)
Devuelve la suma total del precio de todas las peliculas de Woody Allen.
‣ substring("xml is great", 1, 3)
- 15 -
3. XSLT
'RFXPHQWR
;0/
'RFXPHQWR
3URFHVDGRU;6/ +70/
7HPSODWH
;6/
- 16 -
Una hoja de estilos XSLT se compone de templates, reglas que ajustan especifica-
ciones a las partes de un documento XML y permiten la transformación del su
contenido. Ofrece una gran variedad de opciones para extraer datos de un docu-
mento XML y sobre la manipulación de los mismos.
- 17 -
3.1. Estructura de hojas de estilo
Una hoja de estilos XSLT es un documento XML, que debe estar bien formado.
Se guardan como archivo independiente con extensión .xsl. Una vez escrita la hoja
de estilos XSLT usando elementos definidos en el espacio de nombres XSLT, es
possible referenciar esa hoja de estilos en el documento XML a trasformar utili-
zando la etiqueta xml-stylesheet.
La hoja de estilos es un documento XML, por este motivo debe comenzar con una
declaración XML <?xml version=“1.0”?>. El elemento raíz de la hoja de estilo
XSLT es el elemento stylsheet. Este elemento contendrá a todos los demás, y debe
ir precedido por el alias XSL correspondiente al espacio de nombres para hojas de
estilo XSLT. Los nombres de los elementos a utilizar en la hoja de estilos, proce-
den de un mismo espacio de nombre, y por lo tanto deben escribirse precedidos
por el correspondiente alias.
<xsl:stylesheet version="1.0"
<xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
…
</xsl:stylesheet>
- 18 -
3.1.1. Elementos de selección
xsl:template
El elemento template indica qué instancias de los elementos del documento XML
se van a transformar y cómo se deben transformar cada una de ellas. El atributo
match indica el juntos de nodos XML que se quiere transformar (patrón). En el
mismo documento XSL puede haber diferentes template asociados al mismo o di-
ferente patrón XPath. Diferentes template producen diferentes salidas.
Ejemplo:
<xsl:template match="/">
<html>
<head>
<title>Ejemplo Muy Simple</title>
</head>
<body>
<center><h2>Patrón ajustado con el NODO RAÍZ</h2></center>
</body>
</html>
</xsl:template>
Aplicando esta hoja de estilos a un documento XML, la regla se aplicará a todas las
instancias del elemento raíz, es decir una sola vez.
El procesador XSL trabaja con el documento XML y la hoja de estilos XSL. Ini-
cialmente busca un patrón que coincida con una regla template (la búsqueda es
jerárquica). Como al documento XML es accedido elemento por elemento, el atri-
buto match (patrón) de cada template es comparado con cada elemento. El proce-
sador de XSL accede al documento XML de arriba a abajo, de modo que el proce-
so de correspondencia es secuencial. Una vez determinado el template correcto,
produce la salida tras ejecutar el cuerpo del template. Finalmente comprueba si
hay más templates que coincidan con el patrón o ha de finalizar.
<xsl:template match="/bookstore">
<html>
- 19 -
<head><title>Book Store</title></head>
<body>
<center><h2>Hello this is a Book Store</h2></center>
<b>Lista de los libros:</b>
<ul>
<xsl:apply-templates select="book"/>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="book">
<xsl:for-each select=".">
<li><xsl:value-of select="title" /></li>
</xsl:for-each>
</xsl:template>
Ejemplo de salida:
xsl:output
Este elemento define el tipo de salida asociada a la hoja de estilos. Una misma
hoja puede tener múltiples elementos de este tipo. Generalmente es declarado in-
mediatamente después del elemento xsl:stylesheet.
- 20 -
Sintaxis:
<xsl:output
method = "xml"|"html"|"text"
version = nmtoken
encoding = "cadena de codificación" />
Ejemplo:
Ejemplo:
xsl:value-of
Nos permite trabajar con los contenidos de los nodos. Nos devuelve la primera
instancia resultado de la consulta que encaje con el patrón.
Ejemplo:
<xsl:value‐of select="book/title/@lang"/>
- 21 -
xsl:for-each
Con este elemento es possible iterar a través del conjunto de nodos seleccionados.
Tiene un atributo select que selecciona los nodos a través de la expresión XPath.
Una vez los nodos son seleccionado la declaración interior del elemento
xsl:for-each se ejecuta para cada nodo.
Ejemplo:
<xsl:template match="book">
<xsl:for-each select="author">
<xsl:value-of select="." />
</xsl:for-each>
</xsl:template>
xsl:sort
Permite ordenar los resultados obtenidos al procesar el junto de nodos obtenido a
través de un xsl:foreach.
Ejemplo:
<xsl:for-each select="book">
<xsl:sort select="author" />
<xsl:value-of select="title"/>
</xsl:for-each>
xsl:if
Este elemento chequea condiciones y es similar a un la declaración “if” de otros
lenguajes de programación. Especifica la condición que se quiere comprobar en el
atributo test. Si la evaluación es verdadera entonces el cuerpo del elemento es eje-
cutada.
- 22 -
Ejemplo:
<xsl:for-each select="book">
<xsl:if test="author = 'J K Rowling'" />
<xsl:value-of select="title"/>
</xsl:if>
</xsl:for-each>
Ejemplo:
<xsl:for-each select="book">
<xsl:choose>
<xsl:when test="title/@lang = 'it'" />
Titulo Italiano: <xsl:value-of select="title"/>
</xsl:when>
<xsl:when test="title/@lang = 'es'" />
Titulo Español: <xsl:value-of select="title"/>
</xsl:when>
<xsl:otherwise />
<xsl:value-of select="title"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
- 23 -
3.1.3. Transformación de XML a XML
El lenguaje XSL incluye también elementos particulares para trasformar docu-
mentos xml en otros documentos XML. Esto tipo de transformación son muy úti-
les porque permiten de crear nuevos documentos XML que incluyen datos de
otros documentos cambiando el formato y adaptarlos para aplicaciones específicas.
Ejemplo:
<xsl:element name="title">
<xsl:attribute name="lang">en</xsl:attribute>
<xsl:text>Harry Potter</xsl:text>
</xsl:element>
Salida:
- 24 -
4. XQuery
- 25 -
4.1. Características de XQuery
- 26 -
4.2. Consultas XQuery
Una consulta en XQuery es una expresión que lee una secuencia de datos en XML
y devuelve como resultado otra secuencia de datos en XML. Un detalle importan-
te es que, a diferencia de lo que sucede en SQL, en XQuery las expresiones y los
valores que devuelven son dependientes del contexto. Aunque XQuery y SQL
puedan considerarse similares, el modelo de datos sobre el que se sustenta XQuery
es muy distinto del modelo de datos relacional sobre el que sustenta SQL, ya que
XML incluye conceptos como jerarquía y orden de los datos que no están presen-
tes en el modelo relacional.
4.2.1. For
La cláusula for es la sentencia principal de una consulta XQuery. Es utilizada pa-
ra vincular una o más variables a expresiones escritas en XPath, creando un flujo
de tuplas en el que cada tupla está vinculada a una de las variable.
Ejemplo de consulta:
for $x in doc("books.xml")/bookstore/book
return $x/title
Salida:
En el ejemplo anterior de cláusula for, la variable $x toma como valor cada uno
de los nodos book que contenga el archivo “books.xml”. Cada uno de esos nodos
book, será una tupla vinculada a la variable $x.
- 27 -
4.2.2. Return
La cláusula return es utilizada para construir el resultado de la consulta. La sali-
da se obtendrá en formato XML y con la estructura que se indique dentro de esta
cláusula.
Ejemplo de consulta:
for $x in doc("books.xml")/bookstore/book/title
return
<book>
{$x}
</book>
Salida:
<book>
<title lang="en">Harry Potter</title>
</book>
<book>
<title lang="it">La Divina Commedia</title>
</book>
…
- 28 -
Ejemplo:
for $x in doc("books.xml")/bookstore/book
where $x/price > 30
order by $x/title
return $x/title
Salida:
4.2.4. Let
La clausula let es utilizada para vincular una variable al resultado completo de
una expresión XPath. A diferencia de una for, cuando se utiliza una let todas las
tuplas resultantes de la expresión XPath son asociadas la variable.
Ejemplo de consulta:
let $p := doc("books.xml")/bookstore/book
return
<books>{$p/title}</books>
Salida:
<books>
<title lang="en">Harry Potter</title>
<title lang="it">La Divina Commedia</title>
<title lang="en">Learning XML</title>
<title lang="en">XQuery Kick Start</title>
</books>
En este caso la return es repetida solo una vez, a demostración que utilizando una
let lo que se almacena en la variable es todo el resultado de la expresión XPath.
A seguir un ejemplo mas complejo que describe como utilizar una for y una let en
la misma consulta, produciendo un resultado símil a una join en SQL.
- 29 -
Ejemplo:
for $b in $books/bookstore/book,
$ob in $otherbooks/bookstore/book
return
<book>
{$b/title, $b/price}
</book>
Salida:
<book>
<title lang="en">Harry Potter</title>
<price>29.90</price>
</book>
<book>
<title lang="it">La Divina Commedia</title>
<price>30.95</price>
</book>
- 30 -
Ejemplo:
for $b in doc("books.xml")/bookstore/book
return
if ($b/@lang="it") then
<italian>{data($b/title)}</italian>
else
<english>{data($b/title)}</english>
Salida:
<english>Harry Potter</english>
<italian>La Divina Commedia</italian>
<english>Learning XML</english>
<english>XQuery Kick Start</english>
Ejemplo: movies.xml
<movie>
<title>La Dolce Vita</title>
<actors>
<name>Marcello Mastroianni</name>
<name>Anita Ekberg</name>
<name>Alain Curry</name>
...
<actors>
</movie>
<movie>
<title>Otto e mezzo</title>
- 31 -
<actors>
<name>Marcello Mastroianni</name>
<name>Claudia Cardinale</name>
<name>Sandra Milo</name>
...
<actors>
</movie>
Consulta:
<actor>
<name>Marcello Mastroianni</name>
<movie>
{
for $m in doc("movies.xml")/moviestore/movie
return
$b/title
}
</movie>
</actor>
Salida:
<actor>
<name>Marcello Mastroianni</name>
<movies>
<title>La Dolce Vita</title>
<title>Otto e Mezzo</title>
</movies>
</actor>
- 32 -