我有以下XSLT片段:
<table border="1" id ="test">
<xsl:for-each select= "TestSuite/TestCase">
<tr>
<xsl:attribute name="id">
<xsl:value-of select="count(preceding-sibling::*)"/>
</xsl:attribute>
<b><xsl:value-of select="@name"/></b>
</tr>
<xsl:for-each select="Verification|Command">
<tr>
<xsl:attribute name="id">
<xsl:value-of select="count(preceding-sibling::*)"/>
</xsl:attribute>
<xsl:choose>
<xsl:when test="contains(name() , 'Verification')">
<td>Verification <xsl:value-of select="@type"/></td>
<td><xsl:value-of select="@status"/></td>
</xsl:when>
<xsl:when test="contains(name() , 'Command')">
<td>Command <xsl:value-of select="@type"/></td>
<td><xsl:value-of select="@status"/></td>
</xsl:when>
</xsl:choose>
</tr>
</xsl:for-each>
</xsl:for-each>
</table>
现在我只想给每个表行一个id,从0开始,1开始,然后是2等。问题是每个内部循环都会重新开始id计数0。我怎么解决这个问题?我的HTML页面只显示一个表,因此所有tr都应该是兄弟姐妹。
答案 0 :(得分:0)
这样的事情怎么样:
<xsl:template match="something">
<table border="1" id ="test">
<xsl:apply-templates select="TestSuite/TestCase |
TestSuite/TestCase/*[self::Verification or
self::Command]" />
</table>
</xsl:template>
<xsl:template match="TestSuite/TestCase">
<tr id="{position()}">
<td colspan="2">
<b>
<xsl:value-of select="@name"/>
</b>
</td>
</tr>
</xsl:template>
<xsl:template match="TestCase/Verification | TestCase/Command">
<tr id="{position()}">
<td>
<xsl:value-of select="concat(local-name(), @type)"/>
</td>
<td>
<xsl:value-of select="@status"/>
</td>
</tr>
</xsl:template>
答案 1 :(得分:0)
不要将id
置于职位上,只需使用generate-id()
:
id="{generate-id()}"
这不仅是唯一的,而且也是有效的ID
类型值。