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.


y5Bw1U3u1o-S0IvDp5H6vkQZYCQEiK4ecQ.pngTutorial 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 


TmQoYNCKD8lwKPbKbOa9XBG8AfUirfvi8g.pngXPATH 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 es el acrónimo de el XML Path Language, que es el lenguaje de rutas usado para encontrar información en un documento XML dado que permite construir expresiones que recorren y procesan el documento XML. 
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:


DQ0LLlHdsI3iI3Ms1xkm83Fb22QoP0oydQ.png

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

<?xml version="1.0"

encoding="ISO-8859-1"?>

  

<bookstore>

  

<book>

 <title lang="eng">Harry Potter</title>

 <price>29.99</price>

</book>

  

<book>

 <title lang="eng">Learning XML</title>     

 <price>39.95</price>

</book>

  

</bookstore>

TmQoYNCKD8lwKPbKbOa9XBG8AfUirfvi8g.pngNodos 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 .



UzXEgbYT51k2jOWtwYfgKPJK9HWJ5Lp-yA.png

Por ejemplo, la siguiente expresión: /bookstore/book[price<30]/title

Aplicado al siguiente mensaje:

EILqTbzD3hr6LAXnEkqltmm_Fh6fURkTIA.png

nos devolvería:

 


<?xml version="1.0" encoding="UTF-8"?>

<root>

 <title lang="eng">Harry Potter</title>

</root>

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





TmQoYNCKD8lwKPbKbOa9XBG8AfUirfvi8g.pngSintaxis 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:

  • bookstore/book
  • //book
  • bookstore//book

Darían el mismo resultado:

<book>

  <title lang="eng">Harry Potter</title>

  <price>29.99</price>

</book>

<book>

  <title lang="eng">Learning XML</title>

  <price>39.95</price>

</book>

 



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]

<book>

  <title lang="eng">Harry Potter</title>

  <price>29.99</price>

</book>

 

Ejemplo de Predicado + Función: 

/bookstore/book[last()]

<book>

  <title lang="eng">Learning XML</title>

  <price>39.95</price>

</book>



Ejemplo de Predicado + Función + Operador: 

/bookstore/book[position()<3]

<book>

  <title lang="eng">Harry Potter</title>

  <price>29.99</price>

</book>

<book>

  <title lang="eng">Learning XML</title>

  <price>39.95</price>

</book>



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
Selecciona todos los nodos de tipo elemento de nombre <Nombre>

attribute() 
attribute(<Nombre>)

Selecciona todos los atributos
Selecciona todos los atributos de nombre <Nombre>

Filtro
Descripción




Ejemplo de filtro: 

/bookstore/*

<book>

  <title lang="eng">Harry Potter</title>

  <price>29.99</price>

</book>

<book>

  <title lang="eng">Learning XML</title>

  <price>39.95</price>

</book>



Otro ejemplo de filtro:  //title[@*]

 
<title lang="eng">Harry Potter</title>

<title lang="eng">Learning XML</title>

 

Ejemplo de selección múltiple: //book/title | //book/price

 
<title lang="eng">Harry Potter</title>

<price>29.99</price>

<title lang="eng">Learning XML</title>

<price>39.95</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.


-r4EtCTgH9QlFc5Gxa_I9cPKWMNOJgbOQQ.png



ancestor 
ancestor-or-self

Selecciona todos los antepasados del nodo actual (padres, abuelos, ...)
Selecciona todos los antepasados del nodo actual y el propio nodo

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 

<price>29.99</price>

<price>39.95</price>

 

Ejemplo de expresiones con ejes considerando que nos encontramos en el nodo raíz: 

descendant-or-self::node()/attribute::lang 

lang="eng"

lang="eng"

 

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