Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El lenguaje de rutas XML (XPath) es compatible con la operación de conjunto |.
Operador de unión (|)
| 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 |
|---|---|
|
Un conjunto de nodos que contiene elementos |
|
Un conjunto de nodos que contiene elementos |
|
Un conjunto de nodos que contiene todos los elementos |
|
Un conjunto de nodos que contiene todos los elementos |
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 |
|
No booleano |
8 |
|
Y booleano |
9 |
|
O 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: () se 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: [] se 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: y, no
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: o, y, no
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: y, o, no
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>