使用XSLT替换表的行颜色

使用XSLT替换表的行颜色,xslt,Xslt,我有一个XSLT,我想在其中交替输出表的行颜色。我知道您可以使用如下示例中的代码: <table> <tr> <td>Name</td> <td>ID</td> </tr> <xsl:for-each select="//Book"> <xsl:variable name="altColor"> <xsl:choose>

我有一个XSLT,我想在其中交替输出表的行颜色。我知道您可以使用如下示例中的代码:

<table>
<tr>
    <td>Name</td>
    <td>ID</td>
</tr>
<xsl:for-each select="//Book">
    <xsl:variable name="altColor">
        <xsl:choose>
            <xsl:when test="position() mod 2 = 0">#FFFFFF</xsl:when>
            <xsl:otherwise>#D3DFEE</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <tr bgcolor="{$altColor}">
        <td><xsl:value-of select="current()/@name"/></td>
        <td><xsl:value-of select="current()/@ID"/></td>
    </tr>
</xsl:for-each>
</table>

名称
身份证件
#FFFFFF
#D3DFEE
但是,我有几个例子需要在for each中包含一些if语句,例如

<table>
<tr>
    <td>Name</td>
    <td>ID</td>
</tr>
<xsl:for-each select="//Book">
    <xsl:variable name="altColor">
        <xsl:choose>
            <xsl:when test="position() mod 2 = 0">#FFFFFF</xsl:when>
            <xsl:otherwise>#D3DFEE</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:if test="current()/@ID &gt; 10000 and current/@ID &lt; 6000">
        <tr bgcolor="{$altColor}">
            <td><xsl:value-of select="current()/@name"/></td>
            <td><xsl:value-of select="current()/@ID"/></td>
        </tr>
    </xsl:if>
</xsl:for-each>
</table>

名称
身份证件
#FFFFFF
#D3DFEE
然后它就不起作用了,因为它可能会在for each中的某个位置跳过一个项目,而我会以随机交替的行颜色结束,或者它可能会从错误的位置开始,其中行以错误的颜色开始交替


我尝试添加xsl:sort,但这并不能真正解决问题。有没有办法避免这个障碍?

一个简单的解决办法是记住最后使用的颜色,而不是使用相反的颜色 取而代之的是基于position()的选择,并且应该将选择移动到行的测试内部

这是伪代码

currentColor = color1
for each 
if ( id > 10000 and id < 6000 ) {
  if ( currentColor == color1 )
      currentColor= color2
  else 
      currentColor = color1
  showDataInColor(currentColor)
}
currentColor=color1
每人
如果(id>10000且id<6000){
如果(currentColor==color1)
currentColor=color2
其他的
currentColor=color1
showDataInColor(当前颜色)
}
最简单的解决方案(将示例样式表作为实际需要的代表)是首先只在所需节点上循环。像这样:

<xsl:template match="/">
    <table>
        <tr>
            <td>Name</td>
            <td>ID</td>
        </tr>
        <xsl:for-each select="//Book[@ID &lt; 10000 and @ID &gt; 6000]">
            <xsl:variable name="altColor">
                <xsl:choose>
                    <xsl:when test="position() mod 2 = 0">#FFFFFF</xsl:when>
                    <xsl:otherwise>#D3DFEE</xsl:otherwise>
                </xsl:choose>
            </xsl:variable>
        <tr bgcolor="{$altColor}">
            <td><xsl:value-of select="@name" /></td>
            <td><xsl:value-of select="@ID" /></td>
        </tr>
        </xsl:for-each>
    </table>
</xsl:template>
生成正确的替换:

<table>
    <tr>
        <td>Name</td>
        <td>ID</td>
    </tr>
    <tr bgcolor="#D3DFEE">
        <td />
        <td>6200</td>
    </tr>
    <tr bgcolor="#FFFFFF">
        <td />
        <td>7100</td>
    </tr>
    <tr bgcolor="#D3DFEE">
        <td />
        <td>8000</td>
    </tr>
    <tr bgcolor="#FFFFFF">
        <td />
        <td>9001</td>
    </tr>
    <tr bgcolor="#D3DFEE">
        <td />
        <td>9002</td>
    </tr>
</table>

名称
身份证件
6200
7100
8000
9001
9002

尝试以下代码:

tr[position() mod 2 =0]


这种方法不适用于XSLT,因为变量是不可变的。对于我尝试创建的简单示例,这是一个很好的答案,因此它是可以接受的。然而,我的实际XSLT要复杂得多,所以我不能完全将其应用到XSLT中(或者如果我这样做了,这将是一个复杂的修复,并且我的XSLT不值得仅用于演示目的)。
tr[position() mod 2 =0]