3

我在 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,这些 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。

4

1 回答 1

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>
于 2012-07-30T19:24:46.583 回答