有没有办法在 XSL 1.0 中执行分析字符串操作例如,在 XSL 2.0 中,我们可以拥有:
<xsl:analyze-string select="Description" regex="$param1">
<xsl:matching-substring>
<span style="background-color: papayawhip;">
<xsl:value-of select="."/></span>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
因此,这将在"描述"节点中查找 param1 并将其替换为 <span>
。是否可以使用 XSL 1.0 执行此类操作?
使用类似以下内容:
<xsl:if test="contains(x, $param)">
<xsl:value-of select="substring-before(x, $param)"/>
<span><xsl:value-of select="$param"/></span>
<xsl:value-of select="substring-after(x, $param)"/>
</xsl:if>
如果您只想在 Description
元素中查找子字符串,那么使用 XSLT 1.0 可以通过编写一个命名的递归模板来实现:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="param1" select="'foo'"/>
<xsl:template name="wrap">
<xsl:param name="input"/>
<xsl:param name="search"/>
<xsl:param name="wrapper-element" select="'span'"/>
<xsl:param name="wrapper-style" select="'background-color: papayawhip;'"/>
<xsl:choose>
<xsl:when test="not(contains($input, $search))">
<xsl:value-of select="$input"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-before($input, $search)"/>
<xsl:element name="{$wrapper-element}">
<xsl:if test="$wrapper-style">
<xsl:attribute name="style">
<xsl:value-of select="$wrapper-style"/>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="$search"/>
</xsl:element>
<xsl:call-template name="wrap">
<xsl:with-param name="input" select="substring-after($input, $search)"/>
<xsl:with-param name="search" select="$search"/>
<xsl:with-param name="wrapper-element" select="$wrapper-element"/>
<xsl:with-param name="wrapper-style" select="$wrapper-style"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="Description">
<div>
<xsl:call-template name="wrap">
<xsl:with-param name="input" select="."/>
<xsl:with-param name="search" select="$param1"/>
</xsl:call-template>
</div>
</xsl:template>
</xsl:stylesheet>
然后,此类代码将进行转换
<Root>
<Description>foo bar baz foobar test whatever foo</Description>
</Root>
到
<div><span style="background-color: papayawhip;">foo</span> bar baz <span style="background-color: papayawhip;">foo</span>bar test whatever <span style="background-color: papayawhip;">foo</span></div>
以它为例,您可以以某种方式适应您的需求,它当然并不意味着完全取代 XSLT 2.0 的分析字符串。