Compartir a través de


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

&lt;

&lt;=

&gt;

&gt;=

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>