2012-07-30 45 views
3

我在HTML內部使用XSLT來操縱提供給我的一些XML。爲了給什麼我需要做一些背景:XSLT更改內部字符串

我會收到一些XML在

<base> 
    <string> 
     "Hi, this is a String" 
    </string> 
    <redlist> 
     <red> 
      <start>3</start> 
      <end>5</end> 
     </red> 
     <red> 
      <start>9</start> 
      <end>11</end> 
     </red> 
    </redlist> 
</base> 

這應該那麼最終產生一些HTML輸出,將突出顯示<red>標籤中表示的包容性字符格式紅。所以這應該輸出「嗨,這是一個字符串」,「th」和「is」部分是紅色的。

我認爲我需要做一些花哨的處理與子串,但不知道如何去做。

有什麼建議嗎?

更新:

我有以下 -

<xsl:for-each select="base/redlist"> 
    <span style="color:black"> 
     <xsl:value-of select="substring(../string, 0, red/start)"> 
    </span> 
    <span style="color:red"> 
     <xsl:value-of select="substring(../string, red/start, red/end)"> 
    </span> 
</xsl:for-each> 

但顯然,這並不因0在for-each循環的每一次迭代工作。

+0

當然3-5確保只有'th'變紅,而不是'this'。 – Utkanos 2012-07-30 15:09:59

+0

謝謝,我在中途更改了號碼,忘記了更新。現在更新了主要問題 – RobM 2012-07-30 15:11:28

+0

'substring'函數怎麼樣? – 2012-07-30 15:16:45

回答

0

請注意,substring()的最後一個可選參數是子字符串的長度,而不是結束索引。

下面的東西可能是一種方法。您需要相應地調整它,具體取決於您的指數是基於零還是一個基準,以及您是否打算將引號作爲字符串的一部分。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="base"> 
    <span style="color:black"> 
     <xsl:apply-templates select="redlist/red"> 
     <xsl:with-param name="string" select="normalize-space(string)"/> 
     </xsl:apply-templates> 
    </span> 
    </xsl:template> 

    <xsl:template match="red"> 
    <xsl:param name="string"/> 
    <xsl:if test="not(preceding-sibling::red)"> 
     <xsl:value-of select="substring($string, 1, start - 1)"/> 
    </xsl:if> 
    <span style="color:red"> 
     <xsl:value-of select="substring($string, start, end - start)"/> 
    </span> 
    <xsl:variable name="next" select="following-sibling::red"/> 
    <xsl:choose> 
     <xsl:when test="$next"> 
     <xsl:value-of select="substring($string, end, $next/start - end)"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="substring($string, end)"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 
+0

我打算以類似的方式提出使用call-template,但我真的很喜歡你的解決方案,因爲模板應用於帶有參數的紅色列表而不是其他方式。 – Goody 2012-07-31 08:48:57