2010-12-10 9 views
3

ich die XSLT-Ersetzen-Funktion zu ersetzen Wörter in einem Text mitVerwenden Xslt Ersetzen-Funktion ein Wort mit einem Element zu ersetzen

<strong>word</strong>. 

Ich schrieb die folgende Vorlage USW wollen:

<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> 

Leider , und werden nicht gerendert, obwohl der Rest funktioniert.

Konnte mir jemand helfen?

Best, Suidu

Antwort

0

hmm ist, weil hier es sein der String-Wert, der ersetzt wird, können Sie versuchen, den Knotensatz zu benutzen?

kann ich nicht testen, da ich nicht verwenden XSLT 2.0, aber Sie könnten eine rekursive Template dh

<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

der Brunnen ersetzen Funktion http://www.w3.org/TR/xpath-functions/#func-replace nimmt einen String und gibt einen String versuchen. Sie scheinen einen Elementknoten und keine einfache Zeichenfolge erstellen zu wollen. In diesem Fall könnte die Verwendung von Analyse-String http://www.w3.org/TR/xslt20/#analyze-string anstelle von Ersetzen helfen.

Hier ist ein Beispiel XSLT 2.0 Sheet:

<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> 

Wenn Sie mit einem XSLT 2.0 Prozessor wie Saxon 9 gegen die folgenden Eingangsabtastwerte

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

der Ausgang wie folgt ausgeführt wird, dass:

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

+1 Richtige XSLT 2.0 Antwort. Aber ich denke, die "p" -Matching-Regel ist nicht notwendig. Wenn Sie die Wraperregel nur auf 'p's Textknoten Kind (oder noch besser, Nachkommen) anwenden möchten, können Sie dieses Muster' p/text() '(oder' p // text() ') verwenden. –

+0

Vielen Dank du, Martin und Alejandro. Die vorgeschlagene Lösung funktioniert gut! Suidu – Suidu

Verwandte Themen