2010-12-10 80 views
3

我想USW的XSLT替換功能與使用XSLT替換功能與元素

<strong>word</strong>. 

替換文本中的字我寫了下面的模板來替換一個詞:

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

不幸,不呈現,其餘的工作。

任何人都可以幫助我嗎?

最佳,Suidu

回答

0

HMM是因爲這裏它被替換的字符串值,你可以嘗試使用節點集?

我無法測試,因爲我不使用XSLT 2.0,但你可以嘗試遞歸模板即

<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

好替換功能http://www.w3.org/TR/xpath-functions/#func-replace接受一個字符串並返回一個字符串。你似乎想創建一個元素節點,而不是一個簡單的字符串。在這種情況下,使用分析字符串http://www.w3.org/TR/xslt20/#analyze-string而不是替換可能會有所幫助。

下面是一個示例XSLT 2.0樣式表:

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

當運行用XSLT 2.0處理器等撒克遜9對以下輸入採樣

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

輸出如下:

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

+1 Right XSLT 2.0 answer。但我認爲'p'匹配規則是沒有必要的。如果你想只將包裝規則應用到'p'的文本節點子節點(甚至更好,子節點),你可以使用這個模式'p/text()'(或'p // text()') – 2010-12-10 13:17:23

+0

你,馬丁和亞歷杭德羅。建議的解決方案運作良好! Suidu – Suidu 2010-12-11 06:34:52