Los pasos de localización (location steps) te permiten navegar dentro de la jerarquía del documento XML y, de esa manera, seleccionar un conjunto de nodos que están relacionados en alguna forma con el nodo de contexto.
Un paso de navegación se compone de tres partes: una línea o eje, un nodo test y un predicado, que es opcional.
Aquí se produce una confusión porque la expresión de los pasos de localización se pueden simplificar mediante una sintaxis abreviada, por tanto, la persona que empieza en XPath se podrá encontrar expresiones que, en principio, no entienda. Aquí, en esta entrada, voy a proponer la notación no simplificada, la cual, a pesar de que se usa menos, es más fácil de entender al ser más intuitiva.
Sin perjuicio de que añada al blog una entrada que recoja esta notación simplificada, la puedes encontrar en decenas de sitios de la red, casi siempre en inglés.
Por tanto, el salto de localización tal como
axis::nodetest[predicado]se compone de tres partes:
- Axis
- Especifica una relación entre el nodo de contexto y otros nodos del árbol. Las líneas están predifinidas de antemano en la especificación XPath. Ejemplos son las líneas child, parent, ancestror, etc. Todas ellas siguen el modelo de la familia: hijos, padres, hermanos, antepasados, etc. Para tener noción de cuales son estas líneas busca en cualquier manual de XPaht, aunque tengo intención de añadir una entrada con las líneas XPath. También las puedes localizar fácilmente en la red. En algunas páginas se incluyen instructivos gráficos para saber que nodos se seleccionan cuando se utilizan cada una de las líneas.
- Nodetest.
- Especifica los tipos de nodos o el nombre de los nodos que serán seleccionados inicialmente por el salto de localización. El axis y el nodetest de unen para crear una sintaxis del tipo: "dame los hijos de los nodos llamados cliente", o "dame los nodos que contengan texto que sean descendientes del nodo de contexto", etc.
- Predicado
- Supone una condición opcional del tipo "where" usada en SQL. Viene a significar un refinamiento en la búsqueda que inicialmente han dado las dos expresiones anteriores. El predicado es opcional, es decir, no hará falta usarlo si las expresiones axis y nodetest ya han definido el conjunto de nodos del árbol XML que buscamos. El predicado se encierra entre corchetes([])
El siguiente ejemplo no contiene predicado que según dije al comienzo de la entrada es el tercer elemento del paso de localización y es opcional.
En la cláusula "select" de la hoja de transformación contiene un paso que utiliza en el nodetest varios nombres de elementos que se encuentran jerarquizados entre ellos.
El la cláusula "value-of" de la hoja de transformación se utiliza en el nodetest una clase de nodo, en este caso text().
Entrada:
<?xml version="1.0" encoding="UTF-8"?> <!-- New document created with EditiX at Sun Jul 01 22:32:22 BST 2012 --> <!--Varios pueblos y ciudades de cada una de las Islas Canarias, con división entre islas occidentales y orientales --> <canarias> <islas_occidentales> <isla nombre="La Palma" capital="Santa Cruz de la Palma"> <gentilicio_masculino>palmero</gentilicio_masculino> <superficie>708,32</superficie> <sitio nombre="Tazacorte"> <gentilicio_masculino>bagañete</gentilicio_masculino> <superficie>11,36</superficie> </sitio> <sitio nombre="Villa de Mazo"> <gentilicio_masculino>mazuco</gentilicio_masculino> <superficie>71,17</superficie> </sitio> <sitio nombre="Santa Cruz de la Palma"> <gentilicio_masculino>santacrucero</gentilicio_masculino> <superficie> 43,38</superficie> </sitio> </isla> <isla nombre="El Hierro" capital="Valverde de El Hierro"> <gentilicio_masculino>herreño</gentilicio_masculino> <superficie>268,71</superficie> <sitio nombre="El Pinar"> <gentilicio_masculino>piñero</gentilicio_masculino> <superficie>84,95</superficie> </sitio> <sitio nombre="Valverde de El Hierro"> <gentilicio_masculino>valverdecino</gentilicio_masculino> <superficie>103,65</superficie> </sitio> </isla> <isla nombre="La Gomera" capital="San Sebastián de la Gomera"> <gentilicio_masculino>gomero</gentilicio_masculino> <superficie>369,76</superficie> <sitio nombre="Alajeró"> <gentilicio_masculino>lagartero</gentilicio_masculino> <superficie>49,42</superficie> </sitio> <sitio nombre="San Sebastián de la Gomera"> <gentilicio_masculino/> <superficie>113,59</superficie> </sitio> </isla> <isla nombre="Tenerife" capital="Santa Cruz de Tenerife"> <gentilicio_masculino>tinerfeño</gentilicio_masculino> <superficie>2034,38</superficie> <sitio nombre="Güímar"> <gentilicio_masculino>güimarero</gentilicio_masculino> <superficie>102,93</superficie> </sitio> <sitio nombre="La Orotava"> <gentilicio_masculino>orotavense o villero</gentilicio_masculino> <superficie>207,31</superficie> </sitio> <sitio nombre="Santa Cruz de Tenerife"> <gentilicio_masculino>santacrucero o chicharrero</gentilicio_masculino> <superficie>150,56</superficie> </sitio> </isla> </islas_occidentales> <islas_orientales> <isla nombre="Lanzarote" capital="Arrecife de Lanzarote"> <gentilicio_masculino>lanzaroteño</gentilicio_masculino> <superficie>845,94</superficie> <sitio nombre="Haría"> <gentilicio_masculino>hariano</gentilicio_masculino> <superficie>106,59</superficie> </sitio> <sitio nombre="Arrecife de Lanzarote"> <gentilicio_masculino>arrecifeño</gentilicio_masculino> <superficie>22,72</superficie> </sitio> </isla> <isla nombre="Fuerteventura" capital="Puerto del Rosario"> <gentilicio_masculino>majorero</gentilicio_masculino> <superficie>1659,74</superficie> <sitio nombre="Betancuria"> <gentilicio_masculino>bentacuriano</gentilicio_masculino> <superficie>103,64</superficie> </sitio> <sitio nombre="Puerto del Rosario"> <gentilicio_masculino>puertense</gentilicio_masculino> <superficie>289,95</superficie> </sitio> </isla> <isla nombre="Gran Canaria" capital="Las Palmas de Gran Canaria"> <gentilicio_masculino>grancanario o, coloquialmente, canarión</gentilicio_masculino> <superficie>1560,1</superficie> <sitio nombre="La Aldea de San Nicolás"> <gentilicio_masculino>aldeano</gentilicio_masculino> <superficie>123,58</superficie> </sitio> <sitio nombre="Las Palmas de Gran Canaria"> <gentilicio_masculino>de las Palmas</gentilicio_masculino> <superficie>100,55 </superficie> </sitio> </isla> </islas_orientales> </canarias>
Hoja de transformación:
<?xml version="1.0" encoding="UTF-8"?> <!-- New document created with EditiX at Sun Jun 17 18:55:04 BST 2012 --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:apply-templates select="child::canarias/child::islas_occidentales/child::isla/child::gentilicio_masculino"/> </xsl:template> <xsl:template match="child::isla"> <xsl:element name="gentilicio"> <xsl:value-of select="child::text()"/> </xsl:element> </xsl:template> </xsl:stylesheet>
Salida:
<gentilicio>palmero</gentilicio> <gentilicio>herreño</gentilicio> <gentilicio>gomero</gentilicio> <gentilicio>tinerfeño</gentilicio>
No hay comentarios:
Publicar un comentario