2012-04-01 2 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:choose, xsl:when, xsl: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

Большое спасибо! Я попробовал первый предложенный вариант - это правильная работа. –

+0

@Bush: Я рад, что мой ответ был полезен для вас. Пожалуйста, подумайте о принятии наилучшего ответа (нажав на контрольную отметку рядом с ответом). –

+0

Я недавно был зарегистрирован. Мне не позволяют голосовать за версии ответов, пока мой уровень не достигнет 15.: ((( –

Смежные вопросы