由於這是XSLT 1.0,你將不得不使用遞歸命名模板依次檢查每個字符。
首先,它可能是更靈活地產生一種「查找」在你的XSLT,你可以指定符號列表和所需的元素名稱與
<lookup:codes>
<code symbol="®">registeredTrademark</code>
<code symbol="©">copyright</code>
<code symbol="™">trademark</code>
</lookup:codes>
,以取代他們( 'lookup'命名空間實際上可以命名爲任何東西,只要它在XSLT中是分層的即可)。
然後,訪問此,您可以定義一個變量來訪問該查詢
<xsl:variable name="lookup" select="document('')/*/lookup:codes"/>
而且,爲了查找基於符號實際的代碼會做這樣的事情(其中$文本)是一個包含正在檢查的文本的變量。
<xsl:variable name="char" select="substring($text, 1, 1)"/>
<xsl:variable name="code" select="$lookup/code[@symbol = $char]"/>
所有命名模板要做的,就是檢查文本的第一個字符,如果在查找存在與元素替換它,然後遞歸調用與文本的其餘部分的模板。
以下是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:lookup="lookup" exclude-result-prefixes="lookup">
<xsl:output method="xml" indent="no"/>
<lookup:codes>
<code symbol="®">registeredTrademark</code>
<code symbol="©">copyright</code>
<code symbol="™">trademark</code>
</lookup:codes>
<xsl:variable name="lookup" select="document('')/*/lookup:codes"/>
<xsl:template match="text[text()]">
<text>
<xsl:call-template name="text"/>
</text>
</xsl:template>
<xsl:template name="text">
<xsl:param name="text" select="text()"/>
<xsl:variable name="char" select="substring($text, 1, 1)"/>
<xsl:variable name="code" select="$lookup/code[@symbol = $char]"/>
<xsl:choose>
<xsl:when test="$code"><xsl:element name="{$code}" /></xsl:when>
<xsl:otherwise>
<xsl:value-of select="$char"/>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="string-length($text) > 1">
<xsl:call-template name="text">
<xsl:with-param name="text" select="substring($text, 2, string-length($text) - 1)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
當施加到示例XML,下面是輸出
<text>
Please see the registered mark<registeredTrademark /> .
Please see the copy right <copyright />.
Please see the Trade mark<trademark />.
</text>
是否有任何理由,你不能用一個簡單的文本做更換XML來源? – Flynn1179 2012-08-08 10:20:28