2012-10-09 144 views
1

字符串替代有沒有在XSL進行分析的字符串操作的方式1.0 例如在XSL 2.0,我們可以有:XSL分析XSL 1.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> 

因此,這將尋找參數1中說明節點並用<span>替換它。用XSL 1.0做這樣的事情有可能嗎?

+1

'$ param'看起來如何,你真的需要正則表達式支持嗎?或者你只是在尋找你想要包裝的字符串常量? –

+0

它只是一個字符串常量。所以基本上它只是一個搜索關鍵字,如果它存在於描述節點的任何地方,我想用span來突出顯示它。 – Vinit

回答

1

如果你只是想看看在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的分析串的。

2

使用類似:

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