Как перечислить отсортированные записи в XSL 1.0? - PullRequest
2 голосов
/ 01 апреля 2012

Извините за мой слабый английский.

Как перечислить отсортированные записи в 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 ]

2 голосов
/ 01 апреля 2012
<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 голосов
/ 01 апреля 2012

Причина неправильных чисел в том, что 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...