Voici la façon XSLT 1.0 correcte de l'appariement (en XSLT 2.0 utilisent les résultats() fonction avec un vrai RegEx comme argument pattern
):
correspondants d'un élément dont le nom contient 'line'
:
<xsl:template match="*[contains(name(), 'line')]">
<!-- Whatever processing is necessary -->
</xsl:template>
correspondants d'un élément dont le nom se termine 'line'
:
<xsl:template match="*[substring(name(), string-length() -3) = 'line']">
<!-- Whatever processing is necessary -->
</xsl:template>
@Tomalak fourni une autre manière XSLT 1.0 de trouver des noms se terminant par une chaîne donnée. Sa solution utilise un caractère spécial garanti pour ne jamais être présent dans aucun nom. Ma solution peut être appliquée pour trouver si n'importe quelle chaîne (pas seulement le nom d'un élément) se termine avec une autre chaîne donnée.
Dans XSLT 2.x:
Utilisez: matches(name(), '.*line$')
pour faire correspondre les noms qui se terminent par la chaîne "line"
Cette transformation:
lorsqu'il est appliqué sur le document XML Theis:
<greeting>
<aaa>Hello</aaa>
<bblineb>Good</bblineb>
<ccc>Excellent</ccc>
<dddline>Line</dddline>
</greeting>
copies à la sortie que l'élément dont le nom se termine par la chaîne "line"
:
<dddline>Line</dddline>
Bien que cette transformation (utilise 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>
copies à la sortie de tous les éléments, dont les noms contiennent la chaîne "line"
:
<bblineb>Good</bblineb>
<dddline>Line</dddline>
La prochaine fois, s'il vous plaît il suffit de lire la case à côté de la zone de texte, où il est dit * » Comment formater: indentation du code de 4 espaces "*. Ensuite, vous ne devez pas utiliser '<' etc ... –
Bonne question (+1). Voir ma réponse, qui à ce moment contient la seule solution complètement correcte à vos deux questions connexes. :) –