2010-12-10 25 views
3

Je veux usw XSLT remplacer la fonction de remplacer les mots dans un texte avecUtilisez xslt remplacer la fonction pour remplacer un mot par un élément

<strong>word</strong>. 

j'ai écrit le modèle suivant:

<xsl:template name="make-bold"> 
    <xsl:param name="text"/> 
    <xsl:param name="word"/> 
    <xsl:variable name="replacement"> 
    <strong><xsl:value-of select="$word"/></strong> 
    </xsl:variable> 
    <xsl:value-of select="replace($text, $word, $replacement)" /> 
</xsl:template> 

Malheureusement , et ne sont pas rendus, bien que le reste fonctionne.

Quelqu'un peut-il m'aider?

Best, Suidu

Répondre

0

hmm est est parce qu'ici il sa la valeur de chaîne qui est remplacée, vous pouvez essayer d'utiliser l'ensemble de nœuds?

je ne peux pas tester comme je n'utiliser xslt 2.0 mais vous pouvez essayer un modèle récursif-à-dire

<xsl:template match="yourtextelement"> 
    <xsl:call-template name="MaketextStrong"> 
</xsl:template> 

<xsl:template name="MaketextStrong"> 
    <xsl:param name="text" select="."/> 
    <xsl:choose> 
    <xsl:when test="contains($text, 'texttomakestrong')"> 
     <xsl:value-of select="substring-before($text, 'texttomakestrong')"/> 
     <strong>texttomakestrong</strong> 
     <xsl:call-template name="break"> 
      <xsl:with-param name="text" select="substring-after($text, 
'texttomakestrong')"/> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
<xsl:value-of select="$text"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
3

Eh bien la remplacer la fonction http://www.w3.org/TR/xpath-functions/#func-replace prend une chaîne et renvoie une chaîne. Vous semblez vouloir créer un noeud d'élément, pas une simple chaîne. Dans ce cas, en utilisant analyse-chaîne http://www.w3.org/TR/xslt20/#analyze-string au lieu de remplacer pourrait aider.

Voici un exemple XSLT 2.0 feuille de style:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:output method="html" indent="no"/> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*, node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="p"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates select="text()" mode="wrap"> 
     <xsl:with-param name="words" as="xs:string+" select="('foo', 'bar')"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="text()" mode="wrap"> 
    <xsl:param name="words" as="xs:string+"/> 
    <xsl:param name="wrapper-name" as="xs:string" select="'strong'"/> 
    <xsl:analyze-string select="." regex="{string-join($words, '|')}"> 
     <xsl:matching-substring> 
     <xsl:element name="{$wrapper-name}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
     <xsl:value-of select="."/> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
    </xsl:template> 

</xsl:stylesheet> 

Lors de l'exécution que d'un processeur XSLT 2.0 comme Saxon 9 contre l'échantillon d'entrée suivant

<html> 
    <body> 
    <p>This is an example with foo and bar words.</p> 
    </body> 
</html> 

la sortie est la suivante:

<html> 
    <body> 
    <p>This is an example with <strong>foo</strong> and <strong>bar</strong> words.</p> 
    </body> 
</html> 
+0

+1 Droit Réponse XSLT 2.0. Mais je pense que la règle d'appariement 'p' n'est pas nécessaire. Si vous voulez appliquer la règle de wrapper uniquement à l'enfant du noeud de texte 'p' (ou mieux, descendants), vous pouvez utiliser ce motif' p/text() '(ou' p // text() ') –

+0

Thank merci toi, Martin et Alejandro. La solution suggérée fonctionne bien! Suidu – Suidu