使用XSLT替换表的行颜色
我有一个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>
<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 > 10000 and current/@ID < 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 < 10000 and @ID > 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]