XSLT 1.0 n'a pas de recherche de texte robuste et de remplacement. Vous pouvez ajouter quelque chose qui utilise contains
, substring-before
, et substring-after
, mais vous devez utiliser un modèle récursif pour gérer le cas où la chaîne que vous essayez de corriger a plusieurs occurrences de la sous-chaîne.
Cela fonctionne, en supposant que votre transformation qui se déplace et renomme éléments est une variante de l'identité de transformation:
<xsl:template match="text()">
<xsl:call-template name="replace">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
</xsl:template>
<xsl:template name="replace">
<xsl:param name="text"/>
<xsl:choose>
<xsl:when test="contains($text, 'bar')">
<xsl:call-template name="replace">
<xsl:with-param name="text" select="concat(
substring-before($text, 'bar'),
'myBar',
substring-after($text, 'bar'))"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Notez que partout où vous copiez la valeur d'un élément à l'aide value-of
, vous devez être en utilisant apply-templates
; changer ceci:
<xsl:template match="someElement">
<renamedElement>
<xsl:value-of select="."/>
<renamedElement>
</xsl:template>
dans ce:
<xsl:template match="someElement">
<renamedElement>
<xsl:apply-templates select="text()"/>
<renamedElement>
</xsl:template>
Faire plusieurs remplacements est un peu plus compliqué.Vous devez étendre le modèle replace
de prendre searchFor
et replaceWith
arguments, ce qui est assez facile, puis le faire dans le modèle text()
:
<xsl:variable name="pass1">
<xsl:call-template name="replace">
<xsl:with-param name="text" select="."/>
<xsl:with-param name="searchFor">bar</xsl:with-param>
<xsl:with-param name="replaceWith">myBar</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="pass2">
<xsl:call-template name="replace">
<xsl:with-param name="text" select="."/>
<xsl:with-param name="searchFor">bar</xsl:with-param>
<xsl:with-param name="replaceWith">myBar</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$pass2"/>
Dans XSLT 2.0, qui prend en charge en utilisant des expressions régulières sur les nœuds de texte, cette est beaucoup plus facile. Vous créez toujours un modèle qui correspond à text()
, mais il a juste un appel à replace
. Voir this article pour beaucoup d'informations, si vous êtes assez chanceux pour pouvoir utiliser XSLT 2.0.
adam_0: Une bonne pratique consiste à poser une autre question. En outre, fournissez l'échantillon d'entrée et la sortie désirée dans votre nouvelle question. –
J'ai créé une nouvelle question: http://stackoverflow.com/questions/3620298/substituting-values-over-many-xml-elements-xslt-2-0 et enlevé la deuxième question –