Operaciones Set
El lenguaje de rutas XML (XPath) es compatible con la operación set |.
Operador de unión (|)
El | u operador de unión devuelve la unión de sus dos operandos, que deberán ser conjuntos de nodos.Por ejemplo, //author | //publisher devuelve un conjunto de nodos que combina todos los nodos //author y todos los nodos //publisher.Los operadores de unión múltiples pueden encadenarse para combinar varios conjuntos de nodos.Por ejemplo, //author | //publisher | //editor | //book-seller devuelve un conjunto de nodo que contiene todos los //author, //publisher, //editor y //book-seller elements.El operador de unión conserva el orden del documento y no devuelve duplicados.
Ejemplos
Expresión |
Hace referencia a |
---|---|
first-name | last-name |
Un conjunto de nodos que contiene elementos <first-name> y elementos <last-name> en el contexto actual. |
(bookstore/book | bookstore/magazine) |
Un conjunto de nodos que contiene elementos <book> o <magazine> dentro de un elemento <bookstore>. |
book | book/author |
Un conjunto de nodos que contiene todos los elementos <book> y todos los elementos <author> dentro de los elementos <book>. |
(book | magazine)/price |
Un conjunto de nodos que contiene todos los elementos <price> de los elementos <book> o <magazine>. |
Ejemplo
El ejemplo siguiente muestra la acción del operador de unión.
Archivo XML (test.xml)
<?xml version="1.0"?>
<test>
<x a="1">
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
</x>
</test>
Archivo XSLT (test.xsl)
La siguiente hoja de estilos XSLT selecciona todos los elementos <x> cuyo atributo a es igual a 2, más aquellos elementos <x> que no tienen atributos.
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<!-- Suppress text nodes not covered in subsequent template rule. -->
<xsl:template match="text()"/>
<!-- Handles a generic element node. -->
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="*|@*" />
<xsl:if test="text()">
<xsl:value-of select="."/>
</xsl:if>
</xsl:element>
</xsl:template>
<!-- Handles a generic attribute node. -->
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="/test">
<xsl:apply-templates select="//x[@a=2] | //x[not(@*)]"/>
</xsl:template>
</xsl:stylesheet>
La transformación produce el siguiente resultado:
<x a="2" b="B">
<x>
<y>31</y>
<y>y32</y>
</x>
</x>
<x>
<y>y31</y>
<y>y32</y>
</x>
Prioridad
En la siguiente tabla se muestra el orden de prioridad (desde la prioridad más alta a la más baja) entre los operadores booleanos y de comparación.
Prioridad |
Operadores |
Descripción |
---|---|---|
1 |
( ) |
Grupo |
2 |
[ ] |
Filtros |
3 |
/ // |
Operaciones de ruta |
4 |
< <= > >= |
Comparaciones |
5 |
= != |
Comparaciones |
6 |
| |
Unión |
7 |
not() |
NOT booleano |
8 |
and |
AND booleano |
9 |
or |
OR booleano |
Ejemplo
El ejemplo siguiente muestra la acción de la prioridad del operador enumerado anteriormente.
Archivo XML (test.xml)
<?xml version="1.0"?>
<test>
<x a="1">
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
</x>
<x a="1">
<x a="2">
<y>y21</y>
<y>y22</y>
</x>
</x>
<x a="1">
<y>y11</y>
<y>y12</y>
</x>
<x>
<y>y03</y>
<y>y04</y>
</x>
</test>
Archivo XSLT básico (test.xsl)
Se utilizará este archivo XSLT básico como punto de partida para la serie de ilustraciones que vienen a continuación.
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<!-- Suppress text nodes not covered in subsequent template rule. -->
<xsl:template match="text()"/>
<!-- Handles a generic element node. -->
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="*|@*" />
<xsl:if test="text()">
<xsl:value-of select="."/>
</xsl:if>
</xsl:element>
</xsl:template>
<!-- Handles a generic attribute node. -->
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Caso 0:Ejecución de pruebas
Se puede añadir la siguiente regla de plantilla a la hoja de estilos XSLT.
<xsl:template match="/test">
<xsl:apply-templates select="*|@*/>
</xsl:template>
Esto producirá un documento XML idéntico al original, sin la instrucción de procesamiento <?xml version="1.0"?>.
Los siguientes casos muestran formas diferentes de escribir esta regla de plantilla.El propósito es mostrar el orden en el que los operadores XPath se enlazan al elemento.
Caso 1: () enlaza mejor que []
La siguiente regla de plantilla selecciona el primer elemento <y> en el orden del documento, a partir de todos los elementos <y> en el documento origen.
<xsl:template match="/test">
<xsl:apply-templates select="(//y)[1]"/>
</xsl:template>
El resultado es el siguiente:
<y>y31</y>
Caso 2: [] enlaza mejor que / o //
La siguiente regla de plantilla selecciona todos los elementos <y> que están primero entre todos sus elementos relacionados.
<xsl:template match="/test">
<xsl:apply-templates select="//y[1]"/>
</xsl:template>
El resultado es el siguiente:
<y>y31</y>
<y>y21</y>
<y>y11</y>
<y>y03</y>
Caso 3: and, not
La siguiente regla de plantilla selecciona todos los elementos <x> que no tienen elementos secundarios <x>, que tienen un elemento primario <x> y que no tienen ningún atributo.
<xsl:template match="/test">
<xsl:apply-templates select=
"//x[./ancestor::*[name()='x'] and *[name()!='x'] and not(@*)]"/>
</xsl:template>
El resultado es un elemento único <x> enumerado abajo con sus secundarios:
<x>
<y>y31</y>
<y>y32</y>
</x>
Caso 4: or, and, not
La siguiente regla de plantilla selecciona cada elemento <x> que es secundario de un elemento <x> o que no es primario del elemento <x> y que no tiene atributos.
<xsl:template match="/test">
<xsl:apply-templates select=
"//x[./ancestor::*[name()='x'] or *[name()!='x'] and not(@*)]"/>
</xsl:template>
El resultado es un conjunto de nodos que contiene los siguientes elementos <x>, enumerados a continuación con sus secundarios:
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
<x>
<y>y31</y>
<y>y32</y>
</x>
<x a="2">
<y>y21</y>
<y>y22</y>
</x>
<x>
<y>y03</y>
<y>y04</y>
</x>
Caso 5: and, or, not
La siguiente regla de plantilla selecciona cada elemento <x> que es secundario de un elemento <x> pero no primario de un elemento <x> o que no tiene atributos.
<xsl:template match="/test">
<xsl:apply-templates select=
"//x[./ancestor::*[name()='x'] and *[name()!='x'] or not(@*)]"/>
</xsl:template>
El resultado es un conjunto de nodos que contiene los siguientes elementos <x>, enumerados a continuación con sus secundarios:
<x>
<y>y31</y>
<y>y32</y>
</x>
<x a="2">
<y>y21</y>
<y>y22</y>
</x>
<x>
<y>y03</y>
<y>y04</y>
</x>