我在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。
答案 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>