2010-10-15 25 views
9

Si tengo un archivo de origen de la siguiente manera:¿Cómo se hace comodín coincide con XSLT?

<animal name="fred_monkey" /> 
<animal name="jim_banana" /> 
<animal name="joe_monkey" /> 

¿Puedo hacer una expresión XPath en mi hoja de estilo que selecciona sólo los animales con la cadena '_monkey' en su nombre?

p. Ej. comodín coincidir '* _monkey'?

+0

¿Qué versión de XSLT se utilizan? –

+0

Buena pregunta, +1. Vea mi respuesta para las soluciones XSLT 1.0 y XSLT 2.0.:) –

+0

@iYasha Actualmente estoy usando 1.0, pero estoy interesado en aprender las diferencias entre los dos. –

Respuesta

26

¿Puedo hacer una expresión XPath en mi hoja de estilo que selecciona sólo los animales con la cadena '_monkey' en su nombre?

p. Ej. comodín coincidir '* _monkey'?

Esto significa comodín una cadena que termina con "_monkey", no una cadena que contiene "_monkey".

Uso:

//animal[ends-with(@name, '_monkey')] 

El anterior utiliza la función estándar XPath 2.0 ends-with() y está así disponible sólo en XSLT 2.0.

En XSLT 1.0 usa la siguiente XPath 1.0 expresión:

//animal[substring(@name, string-length(@name) -6)='_monkey'] 

No se recomienda usar el // abreviatura ya que esto puede resultar en la evaluación ineficiente. Utilice pruebas de cadena de ubicación más específicas siempre que se conozca la estructura del documento XML. Por ejemplo, si los animal elementos son todos los niños del elemento superior del documento XML, entonces el siguiente XPath (2,0 o 1,0, respectivamente) expresiones pueden ser más eficientes:

/*/animal[ends-with(@name, '_monkey')] 

y

/*/animal[substring(@name, string-length(@name) -6)='_monkey'] 

en función de las necesidades específicas de uno (por ejemplo, que realmente se quiere decir "contiene" y no "termina con"), las funciones contains(), starts-with() y substring() también pueden ser útiles:

contains(someString, someTargetString) 

starts-with(someString, someTargetString) 

substring(someString, start-index, length) = someTargetString 

Finalmente, el atributo match de no necesita contener una expresión XPath absoluta - solo se recomienda usar una expresión XPath relativa que especifique el contexto suficiente.

Por lo tanto, lo anterior se utiliza como expresiones de coincidencia será algo como:

<xsl:template match="animal[ends-with(@name, '_monkey')]"> 

y

<xsl:template match= 
    "animal[substring(@name, string-length(@name) -6)='_monkey']"> 
+0

Buena respuesta. ¡Gracias! –

+3

+1 Para una explicación extendida. –

+0

¿Cómo puedo usar esto: '' en XSLT 1.0? – Si8

Cuestiones relacionadas