Operaciones fijas
This page is specific to:.NET Framework Version:2.03.5
Operaciones fijas

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 nodos 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.

1

( )

Grupo

2

[ ]

Filtros

3

/

//

Operaciones de ruta

4

&lt;

&lt;=

&gt;

&gt;=

Comparaciones

5

=

!=

Comparaciones

6

|

Unión

7

not()

No booleano

8

and

Y booleano

9

or

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. Prueba

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 más 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>
© 2009 Microsoft Corporation. Reservados todos los derechos.   Términos de uso | Marcas Registradas | Privacidad
Page view tracker
Evalúe la versión ligera de la biblioteca
x
La versión ligera está basada en ScriptFree (ancho de banda bajo) y se han añadido características que nos han solicitado, como un cuadro de búsqueda y la selección del lenguaje de código predeterminado.
¿Le gusta el cuadro de búsqueda?
¿Le gustan los bloques de código por fichas?
¿En qué medida considera útil este tema?
Díganos algo más.
Gracias
x
Nos está ayudando a mejorar MSDN Online.
Comentarios
Cambiar vista
Clásica
Ligera
ScriptFree
Cambiar vista