2012-04-01 63 views
2

对不起,我英语不好。如何枚举XSL 1.0中的排序记录?

如何枚举XSL 1.0中的排序记录? 片段我的代码:

... 
<tbody> 
    <xsl:for-each select="/doc:resources/doc:record"> 
    <xsl:sort select="@id"/> 
    <xsl:choose> 
     <xsl:when test="(position() mod 2) = 0"> 
     <tr bgcolor="#C0C0C0"> 
      <td> 
      <xsl:number format="1"/> 
      </td> 
      <td> 
      <xsl:value-of select="@id"/> 
      </td> 
      <td> 
      <xsl:value-of select="."/> 
      </td> 
     </tr> 
     </xsl:when> 
     <xsl:otherwise> 
     <tr> 
      <td> 
      <xsl:number format="1"/> 
      </td> 
      <td> 
      <xsl:value-of select="@id"/> 
      </td> 
      <td> 
      <xsl:value-of select="."/> 
      </td> 
     </tr> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:for-each> 
</tbody> 
... 

不正确的结果屏幕:

http://imglink.ru/pictures/01-04-12/92605b06b8b2c2670bba868c61288e9b.jpg

问候

回答

2
<xsl:for-each select="/doc:resources/doc:record"> 
    <xsl:sort select="@id"/> 
    <tr> 
    <xsl:if test="position() mod 2 = 0"> 
     <xsl:attribute name="bgcolor">#C0C0C0</xsl:attribute> 
    </xsl:if> 
    <td> 
     <xsl:value-of select="position()" /> 
    </td> 
    <td> 
     <xsl:value-of select="@id"/> 
    </td> 
    <td> 
     <xsl:value-of select="."/> 
    </td> 
    </tr> 
</xsl:for-each> 
0

的原因不正确的数字是xsl:number不知道的(动态)排序并使用原始未排序文档的结构。

这是一个完整的,简短的,正确的解决方案,使用position()。除此之外,没有条件指令(xsl:choosexsl:whenxsl:otherwise,XSL:if`)在所有使用:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="xxx"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <html> 
     <table> 
     <xsl:apply-templates select="*"> 
      <xsl:sort select="@id"/> 
     </xsl:apply-templates> 
    </table> 
    </html> 
</xsl:template> 

<xsl:template match="doc:record"> 
    <xsl:variable name="vColor" select= 
    "substring('C0C0C0FFFFFF', 6*(position() mod 2)+1, 6)"/> 

    <tr bgcolor="#{$vColor}"> 
      <td> 
       <xsl:value-of select="position()"/> 
      </td> 
      <td> 
       <xsl:value-of select="@id"/> 
      </td> 
      <td> 
       <xsl:value-of select="."/> 
      </td> 
    </tr> 
</xsl:template> 
</xsl:stylesheet> 

当这种转化应用到下面的XML文档(原先没有的! ):

<doc:resources xmlns:doc="xxx"> 
    <doc:record id="dadasd"> 
    some value1 
    </doc:record> 
    <doc:record id="hkjhkhkhk"> 
    some value2 
    </doc:record> 
    <doc:record id="xvxvxvxv"> 
    some value3 
    </doc:record> 
    <doc:record id="afasf"> 
    some value4 
    </doc:record> 
    <doc:record id="iuyiyuiy"> 
    some value5 
    </doc:record> 
</doc:resources> 

有用,正确的结果产生

<html xmlns:doc="xxx"> 
    <table> 
     <tr bgcolor="#FFFFFF"> 
     <td>1</td> 
     <td>afasf</td> 
     <td> 
       some value4 

     </td> 
     </tr> 
     <tr bgcolor="#C0C0C0"> 
     <td>2</td> 
     <td>dadasd</td> 
     <td> 
      some value1 

     </td> 
     </tr> 
     <tr bgcolor="#FFFFFF"> 
     <td>3</td> 
     <td>hkjhkhkhk</td> 
     <td> 
       some value2 

     </td> 
     </tr> 
     <tr bgcolor="#C0C0C0"> 
     <td>4</td> 
     <td>iuyiyuiy</td> 
     <td> 
       some value5 

     </td> 
     </tr> 
     <tr bgcolor="#FFFFFF"> 
     <td>5</td> 
     <td>xvxvxvxv</td> 
     <td> 
       some value3 

     </td> 
     </tr> 
    </table> 
</html> 
+0

非常感谢!我尝试了第一个提供的选项 - 它正确的工作。 – 2012-04-02 07:12:13

+0

@Bush:我很高兴我的回答对你有用。请考虑接受最佳答案(点击答案旁边的复选标记)。 – 2012-04-02 12:19:15

+0

我最近注册了。对我来说,不允许投票给答案的版本,而我的等级不会达到15::((( – 2012-04-03 08:51:50