2009-03-05 18 views
23

Quiero realizar una serie de operaciones en elementos que coinciden con el nombre "A" o "B". Estoy pensando en algo como esto a continuación, pero no funciona.XSLT: ¿Cómo representar O en un atributo de "coincidencia"?

<xsl:template match= " 'A' or 'B'" > 
    <!-- whatever I want to do here --> 
</xsl:template> 

No se pudo encontrar la referencia de idioma XSLT adecuada para ello. ¡Por favor ayuda! ¡¡Gracias!!

+0

Ver también: http://stackoverflow.com/q/14057312/20477 25 – w5m

Respuesta

23

general A | B es la forma correcta de hacer esto. Pero el personaje de la tubería es básicamente una unión de dos expresiones XPath completas. Puede ser molesto para usarlo en un caso como este:

/red/yellow/blue/green/gold | red/orange/blue/green/gold 

ya que estás repitiendo la totalidad de la expresión a excepción de la pequeña pieza de él es que el cambio.

En casos como este, a menudo tiene sentido utilizar un predicado y la función name() lugar:

/red/*[name() = 'yellow' or name()='orange']/blue/green/gold 

Esta técnica le da acceso a una gama mucho más amplia de operaciones lógicas. También es (concebiblemente) más rápido, ya que el navegador XPath solo tiene que atravesar los nodos que está probando una vez.

+0

La mejor y más completa respuesta para mí – Grafit

6

<xsl:template match= " 'A' or 'B'" >

Hay algunos problemas con este perfil de compatibilidad:

  1. Una plantilla Partidos en nodos, no cadenas. Por lo tanto, los nombres de los elementos que se emparejarán no se deben especificar como cadenas entre comillas.

  2. El XPath operator "or" actúa en dos valores booleanos, no en los nodos. Lo que es necesario aquí es another XPath operator -- the union operator "|".

Teniendo en cuenta lo anterior, uno va a especificar correctamente la regla de plantilla como:

<xsl:template match= "A | B" > 
    <!-- whatever I want to do here --> 
</xsl:template> 
10

Creo que es más conveniente utilizar este XPath

/red/(yellow | orange)/blue/green/gold 

en lugar de

/red/*[name() = 'yellow' or name()='orange']/blue/green/gold 
+0

Esto no funciona en un atributo 'match' para' template'. Es válido XPATH pero no es un patrón válido. –

Cuestiones relacionadas