2012-04-01 9 views
2

Entschuldigung für mein schwaches Englisch.Wie werden die sortierten Datensätze in XSL 1.0 aufgelistet?

Wie die sortierten Datensätze in XSL 1.0 aufgelistet? Fragment meines Codes:

... 
<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> 
... 

Falsches Ergebnis Bildschirm:

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

Grüße

Antwort

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

Der Grund für die falschen Zahlen ist, dass xsl:number nicht über die weiß (dynamisch) sortiert und verwendet die Struktur des ursprünglichen unsortierten Dokuments.

Hier ist eine vollständige, kurze und einfache, korrekte Lösung mit position(). Zusätzlich dazu, keine bedingten Befehle (xsl:choose, xsl:when, xsl:otherwise, xsl: if`) werden bei allen verwendet:

<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> 

Wenn diese Transformation auf das folgende XML-Dokument angewendet wird (keine angegeben wurde!):

<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> 

das gewünschte, wird korrektes Ergebnis hergestellt:

<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

Vielen Dank! Ich habe die erste angebotene Option ausprobiert - es ist die richtige Arbeit. –

+0

@Bush: Ich bin froh, dass meine Antwort für Sie nützlich war. Bitte überlegen Sie, die beste Antwort zu akzeptieren (indem Sie auf das Häkchen neben der Antwort klicken). –

+0

Ich wurde kürzlich registriert. Für mich nicht für Versionen von Antworten zu wählen, während mein Niveau nicht 15 erreichen.: (( –

Verwandte Themen