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>

<red>これにより、最終的に、タグで赤で示されている包括的文字を強調表示する出力HTMLが生成されます。したがって、これは「こんにちは、これは文字列です」を出力し、「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()は、終了インデックスではなく、部分文字列の長さであることに注意してください。

次のようなものが 1 つのアプローチである可能性があります。インデックスがゼロベースか 1 ベースか、および引用符を文字列の一部にするかどうかに応じて、それに応じて調整する必要があります。

<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 に答える