Aquí es la correcta XSLT 1.0 manera de hacer coincidir (en XSLT 2.0 utilizan los partidos() con una expresión regular real como el argumento pattern
):
Coincidencia de un elemento cuyo nombre contiene 'line'
:
<xsl:template match="*[contains(name(), 'line')]">
<!-- Whatever processing is necessary -->
</xsl:template>
Coincidencia de un elemento cuyo nombre termina en 'line'
:
<xsl:template match="*[substring(name(), string-length() -3) = 'line']">
<!-- Whatever processing is necessary -->
</xsl:template>
@Tomalak proporcionó otra forma XSLT 1.0 de buscar nombres que terminan con una cadena dada. Su solución utiliza un carácter especial que garantiza que nunca estará presente en ningún nombre. Mi solución se puede aplicar para encontrar si cualquier cadena (no solo el nombre de un elemento) termina con otra cadena dada.
En XSLT 2.x:
Uso: matches(name(), '.*line$')
para que coincida con los nombres que terminan con la cadena "line"
Esta transformación:
cuando se aplica en el documento Theis XML:
<greeting>
<aaa>Hello</aaa>
<bblineb>Good</bblineb>
<ccc>Excellent</ccc>
<dddline>Line</dddline>
</greeting>
copias a la salida sólo el elemento, cuyo nombre termina con la cadena "line"
:
<dddline>Line</dddline>
Mientras esta transformación (usa matches(name(), '.*line')
):
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="*[matches(name(), '.*line')]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="*[not(matches(name(), '.*line'))]">
<xsl:apply-templates select="node()[not(self::text())]"/>
</xsl:template>
</xsl:stylesheet>
copias a la salida de todos los elementos, cuyos nombres contienen la cadena "line"
:
<bblineb>Good</bblineb>
<dddline>Line</dddline>
La próxima vez, por favor, acabo de leer la caja al lado del cuadro de texto, donde dice *" Cómo formatear: sangrar el código por 4 espacios "*. Entonces no tiene que usar '<' etc ... –
Buena pregunta (+1). Vea mi respuesta, que en este momento contiene la única solución completamente correcta para sus dos preguntas relacionadas. :) –