好替換功能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>
+1 Right XSLT 2.0 answer。但我認爲'p'匹配規則是沒有必要的。如果你想只將包裝規則應用到'p'的文本節點子節點(甚至更好,子節點),你可以使用這個模式'p/text()'(或'p // text()') – 2010-12-10 13:17:23
你,馬丁和亞歷杭德羅。建議的解決方案運作良好! Suidu – Suidu 2010-12-11 06:34:52