XPath - Guía rápida
Antes de aprender XPath, primero debemos entender XSL que significa Eextensible Styleheet Language. Es similar a XML como CSS lo es a HTML.
Necesidad de XSL
En el caso de documentos HTML, las etiquetas están predefinidas, como tabla, div, span, etc. El navegador sabe cómo agregarles estilo y mostrarlas usando estilos CSS. Pero en el caso de documentos XML, las etiquetas no están predefinidas. Para comprender y diseñar un documento XML,World Wide Web Consortium (W3C)desarrolló XSL que puede actuar como un lenguaje de hoja de estilo basado en XML. Un documento XSL especifica cómo un navegador debe representar un documento XML.
Las siguientes son las partes principales de XSL:
XSLT - utilizado para transformar documentos XML en varios otros tipos de documentos.
XPath - utilizado para navegar por documentos XML.
XSL-FO - utilizado para formatear documentos XML.
¿Qué es XPath?
XPath es una recomendación oficial del World Wide Web Consortium (W3C). Define un lenguaje para buscar información en un archivo XML. Se utiliza para recorrer elementos y atributos de un documento XML. XPath proporciona varios tipos de expresiones que se pueden utilizar para consultar información relevante del documento XML.
Structure Definitions - XPath define las partes de un documento XML como elemento, atributo, texto, espacio de nombres, instrucción de procesamiento, comentario y nodos de documento
Path Expressions - XPath proporciona potentes expresiones de ruta para seleccionar nodos o listas de nodos en documentos XML.
Standard Functions - XPath proporciona una amplia biblioteca de funciones estándar para la manipulación de valores de cadena, valores numéricos, comparación de fecha y hora, manipulación de nodos y QName, manipulación de secuencias, valores booleanos, etc.
Major part of XSLT - XPath es uno de los elementos principales del estándar XSLT y debe tener conocimientos para trabajar con documentos XSLT.
W3C recommendation - XPath es una recomendación oficial del World Wide Web Consortium (W3C).
Se deben tener en cuenta los siguientes puntos al trabajar con XPath:
- XPath es el componente principal del estándar XSLT .
- XSLT no puede funcionar sin XPath.
- XPath es la base de XQuery y XPointer.
Una expresión XPath generalmente define un patrón para seleccionar un conjunto de nodos. XSLT utiliza estos patrones para realizar transformaciones o XPointer para fines de direccionamiento.
La especificación XPath especifica siete tipos de nodos que pueden ser el resultado de la ejecución de la expresión XPath.
- Root
- Element
- Text
- Attribute
- Comment
- Instrucción de procesamiento
- Namespace
XPath usa una expresión de ruta para seleccionar un nodo o una lista de nodos de un documento XML.
A continuación se muestra la lista de rutas y expresiones útiles para seleccionar cualquier nodo / lista de nodos de un documento XML.
S.No. | Expresión y descripción |
---|---|
1 | node-name Seleccione todos los nodos con el nombre de pila "nombre de nodo" |
2 | / La selección comienza desde el nodo raíz |
3 | // La selección comienza desde el nodo actual que coincide con la selección |
4 | . Selecciona el nodo actual |
5 | .. Selecciona el padre del nodo actual |
6 | @ Selecciona atributos |
7 | student Ejemplo: selecciona todos los nodos con el nombre "estudiante" |
8 | class/student Ejemplo: selecciona todos los elementos de los estudiantes que son hijos de la clase |
9 | //student Selecciona todos los elementos del alumno sin importar dónde se encuentren en el documento |
Ejemplo
En este ejemplo, hemos creado un documento XML de muestra, Students.xml y su documento de hoja de estilo. students.xsl que usa las expresiones XPath bajo select atributo de varias etiquetas XSL para obtener los valores de rollo no, nombre, apellido, apodo y marcas de cada nodo de estudiante.
estudiantes.xml
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
estudiantes.xsl
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/">
<html>
<body>
<h2>Students</h2>
<table border = "1">
<tr bgcolor = "#9acd32">
<th>Roll No</th>
<th>First Name</th>
<th>Last Name</th>
<th>Nick Name</th>
<th>Marks</th>
</tr>
<xsl:for-each select = "class/student">
<tr>
<td> <xsl:value-of select = "@rollno"/></td>
<td><xsl:value-of select = "firstname"/></td>
<td><xsl:value-of select = "lastname"/></td>
<td><xsl:value-of select = "nickname"/></td>
<td><xsl:value-of select = "marks"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Verificar la salida
En este capítulo, veremos la expresión XPath en detalles que cubren los tipos comunes de nodos, XPath define y maneja.
S.No. | Tipo de nodo y descripción |
---|---|
1 | Raíz Nodo de elemento raíz de un documento XML. |
2 | Elemento Nodo de elemento. |
3 | Texto Texto de un nodo de elemento. |
4 | Atributo Atributo de un nodo de elemento. |
5 | Comentario Comentario |
La ruta de ubicación especifica la ubicación del nodo en el documento XML. Esta ruta puede ser absoluta o relativa. Si la ruta de ubicación comienza con el nodo raíz o con '/', entonces es una ruta absoluta. A continuación se muestran algunos de los ejemplos de ubicación de los elementos utilizando una ruta absoluta.
/class/student - seleccione los nodos de los estudiantes dentro del nodo raíz de la clase.
<xsl:for-each select = "/class/student">
/class/student/firstname - seleccione el nombre de un nodo de estudiante dentro del nodo raíz de la clase.
<p><xsl:value-of select = "/class/student/firstname"/></p>
Ejemplo
En este ejemplo, creamos un documento XML de muestra students.xml y su documento de hoja de estilo students.xsl que usa las expresiones XPath.
A continuación se muestra el XML de muestra utilizado.
estudiantes.xml
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
estudiantes.xsl
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/" >
<html>
<body>
<h3>Details of each Students. </h3>
<table border = "1">
<tr bgcolor = "#9acd32">
<th>Roll No</th>
<th>First Name</th>
<th>Last Name</th>
<th>Nick Name</th>
<th>Marks</th>
</tr>
<tr>
<td><xsl:value-of select = "/class/student[1]/@rollno"/></td>
<td><xsl:value-of select = "/class/student[1]/firstname"/></td>
<td><xsl:value-of select = "/class/student[1]/lastname"/></td>
<td><xsl:value-of select = "/class/student[1]/nickname"/></td>
<td><xsl:value-of select = "/class/student[1]/marks"/></td>
</tr>
<tr>
<td>
<xsl:value-of select = "/class/student/@rollno"/>
</td>
<td><xsl:value-of select = "/class/student[2]/firstname"/></td>
<td><xsl:value-of select = "/class/student[2]/lastname"/></td>
<td><xsl:value-of select = "/class/student[2]/nickname"/></td>
<td><xsl:value-of select = "/class/student[2]/marks"/></td>
</tr>
<tr>
<td>
<xsl:value-of select = "/class/student[3]/@rollno"/>
</td>
<td><xsl:value-of select = "/class/student[3]/firstname"/></td>
<td><xsl:value-of select = "/class/student[3]/lastname"/></td>
<td><xsl:value-of select = "/class/student[3]/nickname"/></td>
<td><xsl:value-of select = "/class/student[3]/marks"/></td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Verificar la salida
La ruta de ubicación especifica la ubicación del nodo en el documento XML. Esta ruta puede ser absoluta o relativa. Si la ruta de ubicación comienza con el nodo que hemos seleccionado, entonces es una ruta relativa.
A continuación se muestran algunos ejemplos de ubicación de los elementos mediante una ruta relativa.
firstname - seleccione el nombre relacionado con los nodos de los estudiantes.
<p><xsl:value-of select = "firstname"/></p>
Ejemplo
En este ejemplo, creamos un documento XML de muestra students.xml y su documento de hoja de estilo students.xsl que usa las expresiones XPath.
A continuación se muestra el XML de muestra utilizado.
estudiantes.xml
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
estudiantes.xsl
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/" >
<html>
<body>
<h3>Details of each Students. </h3>
<table border = "1">
<tr bgcolor = "#9acd32">
<th>Roll No</th>
<th>First Name</th>
<th>Last Name</th>
<th>Nick Name</th>
<th>Marks</th>
</tr>
<xsl:for-each select = "/class/student">
<tr>
<td><xsl:value-of select = "@rollno"/></td>
<td><xsl:value-of select = "firstname"/></td>
<td><xsl:value-of select = "lastname"/></td>
<td><xsl:value-of select = "nickname"/></td>
<td><xsl:value-of select = "marks"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Verificar la salida
Como la ruta de ubicación define la ubicación de un nodo utilizando una ruta absoluta o relativa, los ejes se utilizan para identificar elementos por su relación como parent, child, sibling, etc. Los ejes se denominan así porque se refieren al eje en el que los elementos se encuentran en relación con un elemento.
A continuación se muestra la lista de varios valores de eje.
S.No. | Eje y descripción |
---|---|
1 | ancestor Representa los antepasados del nodo actual, que incluyen a los padres hasta el nodo raíz. |
2 | ancestor-or-self Representa el nodo actual y sus antepasados. |
3 | attribute Representa los atributos del nodo actual. |
4 | child Representa a los hijos del nodo actual. |
5 | descendant Representa los descendientes del nodo actual. Los descendientes incluyen a los hijos del nodo hasta el nodo hoja (no más hijos). |
6 | descendant-or-self Representa el nodo actual y sus descendientes. |
7 | following Representa todos los nodos que vienen después del nodo actual. |
8 | following-sibling Representa los siguientes hermanos del nodo de contexto. Los hermanos están al mismo nivel que el nodo actual y comparten su padre. |
9 | namespace Representa el espacio de nombres del nodo actual. |
10 | parent Representa el padre del nodo actual. |
11 | preceding Representa todos los nodos que vienen antes del nodo actual (es decir, antes de su etiqueta de apertura). |
12 | self Representa el nodo actual. |
A continuación se muestran algunos ejemplos sobre los usos de los ejes.
firstname - seleccione el nombre relacionado con los nodos de los estudiantes.
<p><xsl:value-of select = "firstname"/></p>
<xsl:value-of select = "/class/student/preceding-sibling::comment()"/>
Ejemplo
En este ejemplo, creamos un documento XML de muestra students.xml y su documento de hoja de estilo students.xsl que usa las expresiones XPath.
A continuación se muestra el XML de muestra utilizado.
estudiantes.xml
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
<!-- Comment: This is a list of student -->
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
estudiantes.xsl
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/" >
<html>
<body>
<xsl:value-of select = "/class/student/preceding-sibling::comment()"/>
<br/>
<xsl:text>First Student: </xsl:text>
<xsl:value-of select = "/class/student/child::firstname" />
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Verificar la salida
En este capítulo, veremos los operadores y funciones XPath en detalles que cubren XPath comúnmente usado defines y handles. XPath define operadores y funciones en nodos, cadenas, números y tipos booleanos.
A continuación se muestra la lista sobre la que vamos a discutir.
S.No. | Operadores / Funciones y descripción |
---|---|
1 | Operadores de comparación Operadores de comparación para comparar valores. |
2 | Operadores booleanos Operadores booleanos para comprobar las funciones 'y', 'y' no '. |
3 | Funciones / operadores numéricos Operadores / Funciones sobre números. |
4 | Funciones de cadena Varias funciones de cadena. |
5 | Funciones / operadores de nodo Varias funciones y operadores que actúan sobre los nodos. |
XPath define los siguientes comodines en los nodos que se utilizarán con las expresiones XPath.
S.No. | WildCard y descripción |
---|---|
1 | * utilizado para coincidir con cualquier nodo. |
2 | . utilizado para hacer coincidir el nodo actual en contexto. |
3 | @* utilizado para coincidir con cualquier atributo |
4 | node() utilizado para hacer coincidir el nodo de cualquier tipo |
Ejemplo
Este ejemplo crea una tabla del elemento <student> con sus detalles, iterando sobre cada estudiante.
estudiantes.xml
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
estudiantes.xsl
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/">
<html>
<body>
<h2>Students</h2>
<xsl:apply-templates select = "class/*" />
</body>
</html>
</xsl:template>
<xsl:template match = "class/*">
<xsl:apply-templates select = "@rollno" />
<xsl:apply-templates select = "firstname" />
<xsl:apply-templates select = "lastname" />
<xsl:apply-templates select = "nickname" />
<xsl:apply-templates select = "marks" />
<br />
</xsl:template>
<xsl:template match = "@rollno">
<span style = "font-size = 22px;">
<xsl:value-of select = "." />
</span>
<br />
</xsl:template>
<xsl:template match = "firstname">
First Name:<span style = "color:blue;">
<xsl:value-of select = "." />
</span>
<br />
</xsl:template>
<xsl:template match = "lastname">
Last Name:<span style = "color:green;">
<xsl:value-of select = "." />
</span>
<br />
</xsl:template>
<xsl:template match = "nickname">
Nick Name:<span style = "color:red;">
<xsl:value-of select = "." />
</span>
<br />
</xsl:template>
<xsl:template match = "marks">
Marks:<span style = "color:gray;">
<xsl:value-of select = "." />
</span>
<br />
</xsl:template>
</xsl:stylesheet>
Verificar la salida
Predicado se refiere a la expresión XPath escrita entre corchetes. Se refiere a restringir los nodos seleccionados en un conjunto de nodos para alguna condición. Por ejemplo,
S.No. | Predicado y descripción |
---|---|
1 | /class/student[1] Seleccione el primer elemento de estudiante que sea hijo del elemento de clase. |
2 | /class/student[last()] Seleccione el último elemento del alumno que sea hijo del elemento de la clase. |
3 | /class/student[@rolllno = 493] Seleccione el elemento del alumno con el rollo no 493. |
4 | /class/student[marks>85] Seleccione el elemento del alumno con notas> 85. |
Ejemplo
Este ejemplo crea una tabla del elemento <student> con sus detalles, iterando sobre cada estudiante. Calcula la posición del nodo del estudiante y luego imprime los detalles del estudiante junto con el número de serie.
estudiantes.xml
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
estudiantes.xsl
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/">
<html>
<body>
<h2>Students</h2>
<table border = "1">
<tr bgcolor = "#9acd32">
<th>Roll No</th>
<th>First Name</th>
<th>Last Name</th>
<th>Nick Name</th>
<th>Marks</th>
</tr>
<xsl:for-each select = "/class/student[1]">
<tr>
<td><xsl:value-of select = "@rollno"/></td>
<td><xsl:value-of select = "firstname"/></td>
<td><xsl:value-of select = "lastname"/></td>
<td><xsl:value-of select = "nickname"/></td>
<td><xsl:value-of select = "marks"/></td>
</tr>
</xsl:for-each>
<xsl:for-each select = "/class/student[last()]">
<tr>
<td><xsl:value-of select = "@rollno"/></td>
<td><xsl:value-of select = "firstname"/></td>
<td><xsl:value-of select = "lastname"/></td>
<td><xsl:value-of select = "nickname"/></td>
<td><xsl:value-of select = "marks"/></td>
</tr>
</xsl:for-each>
<xsl:for-each select = "/class/student[@rollno = 493]">
<tr>
<td><xsl:value-of select = "@rollno"/></td>
<td><xsl:value-of select = "firstname"/></td>
<td><xsl:value-of select = "lastname"/></td>
<td><xsl:value-of select = "nickname"/></td>
<td><xsl:value-of select = "marks"/></td>
</tr>
</xsl:for-each>
<xsl:for-each select = "/class/student[marks > 85]">
<tr>
<td><xsl:value-of select = "@rollno"/></td>
<td><xsl:value-of select = "firstname"/></td>
<td><xsl:value-of select = "lastname"/></td>
<td><xsl:value-of select = "nickname"/></td>
<td><xsl:value-of select = "marks"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>