Les Expressions régulières dans xsl:template match attribut
Je veux juste savoir si il est possible d'utiliser des expressions régulières dans la match
attribut de la xsl:template
élément.
Par exemple, supposons que j'ai la suite du document XML:
<greeting>
<aaa>Hello</aaa>
<bbb>Good</bbb>
<ccc>Excellent</ccc>
<dddline>Line</dddline>
</greeting>
Maintenant le XSLT pour transformer le document ci-dessus:
<xsl:stylesheet>
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="matches(node-name(*),'line')">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
Lorsque j'essaie d'utiliser la syntaxe matches(node-name(*),'line$')
dans le match
attribut de la xsl:template
élément, il récupère un message d'erreur. Puis-je utiliser des expressions régulières dans la match
attribut?
Merci beaucoup
- La prochaine fois, s'il vous plaît lire la case à côté de la zone de texte, où il est dit "Comment format: indenter le code par 4 espaces". Ensuite, vous n'avez pas à utiliser
<
etc... - Bonne question (+1). Voir ma réponse, qui, à cette époque contient la seule à être totalement correct solution à vos deux questions connexes. 🙂
Vous devez vous connecter pour publier un commentaire.
Ici est la bonne XSLT 1.0 moyen de l'appariement des (en XSLT 2.0, utilisez les allumettes() fonction avec un réel RegEx comme le
pattern
argument):Correspondant à un élément dont le nom contient
'line'
:Correspondant à un élément dont le nom se termine en
'line'
:@Tomalak fourni un autre XSLT 1.0 façon de trouver des noms qui se terminent par une chaîne donnée. Sa solution utilise un caractère spécial qui est garanti de ne pas toujours être présente dans n'importe quel nom. Ma solution peut être appliqué pour déterminer si une chaîne (pas seulement le nom d'un élément) se termine avec une autre chaîne.
Dans XSLT 2.x :
Utilisation:
matches(name(), '.*line$')
de comparer les noms qui se terminent par la chaîne"line"
Cette transformation:
lorsqu'il est appliqué sur theis document XML:
Copies à la sortie de l'élément, dont le nom se termine par la chaîne
"line"
:Alors que cette transformation (utilise
matches(name(), '.*line')
):copies à la sortie de tous les éléments, dont le nom contient la chaîne de
"line"
:En XSLT 1.0 (et 2.0, trop), pour votre exemple (c'est pas une regex, tout de même):
et pour parvenir à une fin de chaîne de match:
Dans XSLT 2.0, vous pouvez bien sûr utiliser le
matches()
fonction à la place decontains()
.name()
. Donc, si vous ne pouvez pas utiliser XPath 2.0 (et regex), ce serait une façon de jumeler un nom qui contient la chaîne de'line'
à sa fin, au lieu de n'importe où. L'OP semble vouloir, car il mentionne la regex'line$'
, et il n'a pas indiqué le XSLT version qu'il utilise. Je pourrais avoir de l'espace utilisé, ou tout autre caractère qui est illégal dans les noms. Il n'est donc pas à tous les vides de sens ou incorrect. 😉