i2factory usa internamente la tecnología de expresiones XPATH, que nos permite buscar información específica en documentos XML.
Este artículo pretende servir de punto de entrada del lenguaje de rutas XPATH para aquellos usuarios no avanzados o desconocedores de este estándar. Aunque no es estrictamente imprescindible, es muy recomendable que el usuario de i2factory tenga conocimientos de estos lenguajes, al menos a un nivel básico.
Además, en las transformaciones XSLT que usa la tarea Translator para poder traducir el esquema de un mensaje XML entrante al esquema de un nuevo mensaje XML saliente, se usan frecuentemente expresiones XPATH, por lo que es muy conveniente controlar este lenguaje para poder editar o implementar a mano transformaciones XSLT.
Tutorial oficial de W3C y webs para hacer tests
Este artículo está basado en la información online publicada por W3C sobre XPATH e incluye un resumen del tutorial oficial. Te recomendamos que visites los sitios webs de la W3C si la información contenida en este artículo te resulta insuficiente. Existen también varias webs online en la que puedes probar tus expresiones XPATH para comprobar que estén correctas.
Prueba por ejemplo: http://www.freeformatter.com/xpath-tester.html o http://www.xpathtester.com
XPATH Versión 2.0 y referencias
i2factory soporta la versión 2.0 de XPATH y XSLT desde la versión 2.0.6 release de i2factory core. Existen más funciones definidos para XPAth. La W3School ofrece una recopilación de referencia aquí.
¿Qué es XPATH?
XPath identifica partes de un documento XML concreto, y permite acceder a dichas partes como pueden ser sus atributos, elementos, etc. XPath es una sintaxis donde se usan expresiones de rutas para navegar en los documentos XML. Permite buscar y seleccionar teniendo en cuenta la estructura jerárquica del XML. Además continente una librería de funciones estándar para enriquecer el lenguaje de expresiones y hacerlo más potente.
A nivel organizativo, Xpath es un elemento importante en la tecnología XSLT, dado que permite a las plantillas de transformaciones acceder y navegar por la información relevante de un documento XML. Sin conocimientos en XPath no serás capaz de crear documentos XSLT.
Árbol de nodos
Los documentos XML son tratados como árboles de nodos por XPath. El elemento más arriba del árbol es llamado el nodo raiz.
Se usan expresiones de ruta para seleccionar nodos o conjuntos de nodos en un documento XML aprovechando su estructura
jerárquica. Lo entenderás mejor con un ejemplo,abajo tienes la estructura en árbol del XML de ejemplo de la derecha:
En el ejemplo de arriba podemos encontrar los siguientes nodos:
- <bookstore> sería el elemento del nodo raiz
<price>29.99</price> sería un nodo elemento
lang="en" sería un nodo atributo
Como valores atómicos (nodos que no tienen hijos o padres) tenemos
por ejemplo Harry Potter o "eng"
Los nodos pueden ser de diferente tipo:
- Elemento (color negro)
- Atributo (color rojo)
- Texto, o valor del elemento XML (color azul)
- Comentarios
- Instrucción
- Espacio de Nombres
- Nodos documentos
Ejemplo de librería
|
Nodos usados en i2factory Aunque i2factory permite usar cualquier expresión de XPath correctamente formada sobre cualquier mensaje XML válido y es posible hacer uso de todos los tipos de nodos, en la práctica los más usados por la herramienta son los Elementos, los Textos (valores de los elementos) y también los Atributos, aunque estos últimos en menor medida (ver el porqué en artículo XML). De hecho, el editor gráfico y el depurador de i2factory Studio sólo muestran visualmente los elementos y sus valores. < book > < title >Harry Potter</ title > < author >J K. Rowling</ author > < year >2005</ year > < price >29.99</ price > </ book > |
XPATH en i2factory
La función principal de XPath en i2factory es la configuración y parametrización de gran mayoría de las tareas de integración que componen la solución que queremos diseñar.
El uso normal será el de usar expresiones XPath para poder acceder los nodos del mensaje y sus valores. Tienes un ejemplo de ello a la derecha:
Para un uso estándar, no es necesario conocer en mucha profundidad XPath ni tampoco escribir las expresiones XPath a mano ya que puedes usar el asistente de construcción de expresiones XPath para configurar visualmente la mayoría de las tareas de integración, aunque para configuraciones más complejas o para editar una transformación XSLT a mano, sí que necesitarás conocimientos más avanzados de XPath .
Por ejemplo, la siguiente expresión: /bookstore/book[price<30]/title
Aplicado al siguiente mensaje:
nos devolvería:
<? xml version = "1.0" encoding = "UTF-8" ?>
|
En los próximos apartados de este artículo te resumimos los aspectos más importantes que necesitas saber de XPath en caso de que el asistente visual no te permita configurar la expresión que necesitas.
Selección de nodos
Rutas y pasos
XPath usa expresiones de rutas para seleccionar nodos o conjuntos de nodos (node-sets) en un documento XML. El nodo es seleccionado siguiendo rutas o pasos. Cada paso es evaluado contra los nodos en el conjunto de nodos actual (en ell punto en el que se encuentre en ese momento)
-
Rutas: una secuencia de Pasos que nos permite seleccionar nodos, y puede ser una ruta relativa o absoluta:
/Paso1/Paso2/Paso3... (ruta absoluta)
Paso1/Paso2/Paso3 ... (ruta relativa)
-
Es posible seleccionar más de una ruta al mismo tiempo, por ejemplo:
Ruta1 | Ruta2 | Ruta3
-
Pasos: un Paso se compone de un Eje, un Filtro y cero o más Predicados que se evalúan con respecto a los nodos seleccionados en el Paso anterior.
-
Eje::Filtro[Predicado]
- Los Ejes definen la relación de árbol entre los nodos seleccionados y el nodo actual.
- Los Filtros identifican un nodo dentro de un Eje
- Los Predicados ayudan a refinar la búsqueda del conjunto de nodos a seleccionar (puede haber 0 o más predicados)
-
Expresiones de ruta abreviadas
Las expresiones de ruta abreviadas (combinan Ejes, Filtros y Predicados) más útiles son las mostradas a continuación:
Expresión |
Descripción |
---|---|
nombreNodo | Selecciona todos los nodos con el nombre "nombreNodo" |
/ |
Selecciona desde el nodo raiz. Nota: Si la ruta comienza con una barra (/) siempre representa una ruta absoluta al elemento. |
// | Selecciona los nodos del documento desde el nodo actual que encaja con la selección sin importar dónde se encuentren |
. | Selecciona el nodo actual |
.. | Selecciona el padre del nodo actual |
@ | Selecciona atributos |
Siempre que se omita el eje, se entiende que se referencia a los hijos del nodo actual |
Sintaxis XPath La sintaxis que emplea XPath se parece mucho a las expresiones que usamos para navegar por los sistemas de archivos tradicionales o las direcciones webs (usando el caracter "/" para navegar). XPath ya se usa actualmente en la mayoría de lenguajes de programación.
|
En el ejemplo de la librería, las siguientes expresiones de ruta:
Darían el mismo resultado: |
Predicados, funciones y operadores
Predicados
Los Predicados son usados para buscar un nodo específico o un nodo que contiene un determinado valor.
Se introducen siempre entre corchetes [ ] y podemos utilizar operadores y funciones.
Funciones
Xpath proporciona una serie de funciones para proporcionar más flexibilidad al lenguaje. se pueden clasificar según el tipo de valor que devuelven:
Tipo devuelto |
Nombres de funciones existentes |
---|---|
Booleanos | boolean, contains, false, lang, not, starts-with, true |
Números | ceiling, count, floor, last, number, position, round, string-length, sum |
Cadenas | concat, local-name, name, namespace-uri, normalize-space, string, substring, substring-after, substring-before, translate |
Conjunto de nodos | id |
Operadores
Operadores |
Ejemplos |
---|---|
Aritméticos: +, -, *, div, mod |
6+4, 6-4, 6*4, 8 div 4, 5 mod 2 |
Comparadores: =, !=, <, <=, >, >=, |
price=9.80, price!=9.80, price<9.80, price<=9.80, price>9.80, price>=9.80 |
Lógicos: or, and |
price=9.80 or price=9.70, price>9.80 and price<10 |
Ejemplo de Predicado: /bookstore/book[1]
Ejemplo de Predicado + Función: /bookstore/book[last()] |
Ejemplo de Predicado + Función + Operador: /bookstore/book[position()<3] |
Filtros y rutas múltiples
Filtro
Los Filtros permiten filtrar y restringir el conjunto de nodos seccionados a aquellos que cumplen cierta condición, o también pueden ser usados para seleccionar nodos XML desconocidos.
* |
Selecciona cualquier elemento nodo |
node() |
Selecciona cualquier nodo de cualquier tipo |
text() |
Selecciona todos los nodos de tipo texto |
@* |
Selecciona cualquier nodo atributo |
comment() |
Selecciona todos los comentarios |
element() element(<Nombre>) |
Selecciona todos los nodos de tipo elemento |
attribute() attribute(<Nombre>) |
Selecciona todos los atributos |
Filtro |
Descripción |
---|
Ejemplo de filtro: /bookstore/* |
Otro ejemplo de filtro: //title[@*]
Ejemplo de selección múltiple: //book/title | //book/price
|
Selección de varias rutas
Usando el operador "|" en una expresión XPath puedes seleccionar múltiples rutas.
Ejes y notación abreviada
Ejes
Los Ejes nos permiten definir un conjunto de nodos a partir de su relación de parentesco con el
nodo actual.
ancestor ancestor-or-self |
Selecciona todos los antepasados del nodo actual (padres, abuelos, ...) |
attribute |
Selecciona todos los atributos del nodo actual |
child |
Selecciona todos hijos del nodo del nodo actual Nota: sino se especifica nada, child es el eje por defecto) |
descendant descendant-or-self |
Selecciona todos descendientes del nodo actual ( hijos, nietos,... ) Selecciona todos descendientes del nodo actual y el propio nodo |
following following-sibling |
Selecciona todos nodos escritos después del nodo contexto en el documento (es decir, todo lo que haya en el documento XML tras la etiqueta de cierre del nodo actual) Selecciona todos nodos escritos después del nodo contexto en el nodo padre |
namespace |
Selecciona todos nombres de espacio del nodo actual |
parent |
Selecciona el padre del nodo actual |
preceding preceding-sibling |
Selecciona todos nodos escritos antes del nodo contexto en el documento (excepto ancestros, nodos atributo y nodos de nombres de espacio) Selecciona todos Nodos escritos antes del nodo contexto en el nodo padre |
self |
Nodo actual |
Ejemplo de expresiones con ejes considerando que nos encontramos en el nodo raíz:
child::*/child::*/child::price
Ejemplo de expresiones con ejes considerando que nos encontramos en el nodo raíz:
descendant-or-self::node()/attribute::lang
Ejemplo de expresiones con ejes considerando que nos encontramos en el nodo raíz:
child::book
Notación abreviada de expresiones Eje::Filtro[Predicado]
Expresión |
Expresión Abreviada equivalente |
---|---|
child:: |
Siempre que se omita el eje, se entiende que se referencia a los hijos del nodo actual |
descendant-or-self::node() |
// |
self::node() |
. |
parent::node() |
.. |
attribute:: |
@ |
[position()=<número>] |
[<número>] |
* |
Todos los nodos excepto los de tipo texto, comentario e instrucción |