XSLT更改内部字符串

时间:2012-07-30 15:03:25

标签: html xslt

我在HTML中使用XSLT来操作提供给我的一些XML。为了说明我需要做的事情:

我会收到一些格式为

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

但显然这不起作用,因为for-each循环的每次迭代都是0。

1 个答案:

答案 0 :(得分: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>