Avatar billede tomn1 Nybegynder
19. november 2003 - 16:30 Der er 8 kommentarer og
1 løsning

Sortering vha xsl:sort

Jeg har et XML-dokument med nogle data, som jeg ønsker at få sorteret på forskellige felter. Formattet på XML´en ligger fast. Nederst har jeg indsat et eksempel på XML-dokumentet.

Jeg har lavet et XSL-dokument, som viser dataene. Jeg kan let vha. xsl:sort sortere på kvartalet. Men hvordan får jeg f.eks. sorteret efter omsætningens størrelse? Hvis omsætning blot havde været et tag med værdien under, var det ikke noget problem. Men når tag´et blot er <felt> med name og value som under-tags, er jeg lidt lost.

Håber, at nogen kan hjælpe.

**************** XSL-dokument ***********************
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
    <h2>Sortering af finanstal</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Kvartal</th>
        <th>Omsætning</th>
        <th>Dækningsbidrag</th>
        <th>Resultat</th>
      </tr>
      <xsl:for-each select="finanstal/perioder/periode">
        <tr><td><xsl:value-of select="kvartal"/></td>
      <xsl:for-each select="felter/felt">
        <xsl:if test="name = 'omsætning'">
              <td><xsl:value-of select="value"/></td>
        </xsl:if>
        <xsl:if test="name = 'dækningsbidrag'">
              <td><xsl:value-of select="value"/></td>
        </xsl:if>
        <xsl:if test="name = 'resultat'">
              <td><xsl:value-of select="value"/></td>
        </xsl:if>
      </xsl:for-each>
        </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

************** XML-dokument ******************

<?xml version="1.0" encoding="iso-8859-1" ?>
<?xml-stylesheet type="text/xsl" href="sortdata2.xsl" ?>
<finanstal>
  <perioder>
    <periode>
      <kvartal>1-2003</kvartal>
      <felter>
    <felt>
      <name>omsætning</name>
      <value>123999</value>
    </felt>
    <felt>
      <name>dækningsbidrag</name>
      <value>23456</value>
    </felt>
    <felt>
      <name>resultat</name>
      <value>5000</value>
    </felt>
      </felter>
    </periode>
    <periode>
      <kvartal>2-2003</kvartal>
      <felter>
    <felt>
      <name>omsætning</name>
      <value>283374</value>
    </felt>
    <felt>
      <name>dækningsbidrag</name>
      <value>150342</value>
    </felt>
    <felt>
      <name>resultat</name>
      <value>87300</value>
    </felt>
      </felter>
    </periode>
    <periode>
      <kvartal>3-2003</kvartal>
      <felter>
    <felt>
      <name>omsætning</name>
      <value>143374</value>
    </felt>
    <felt>
      <name>dækningsbidrag</name>
      <value>115342</value>
    </felt>
    <felt>
          <name>resultat</name>
      <value>67300</value>
    </felt>
      </felter>
    </periode>
  </perioder>
</finanstal>
Avatar billede janegil Nybegynder
19. november 2003 - 17:14 #1
<xsl:sort order="" select="*/value"></xsl:sort>

?
Avatar billede atoft Nybegynder
19. november 2003 - 19:43 #2
<xsl:sort select="value" data-type="number" />

den linie skal placeres lige efter
<xsl:for-each select="felter/felt">
Avatar billede tomn1 Nybegynder
20. november 2003 - 08:55 #3
Jeg kan godt følge jeres forslag lidt hen af vejen.

Men når name og value ligger i samme niveau, hvordan fortæller jeg så, at det value hørende til omsætning (name har værdien omsætning), at jeg vil sortere på? Det er jo ikke ligegyldigt hvilken value under felter/felt den tager.

Håber, at i kan uddybe eller komme med et nyt forslag.
Avatar billede atoft Nybegynder
20. november 2003 - 09:05 #4
Vil det sige, at det du vil er ikke at få dem i orden efter kvartaler, men du vil have det kvartal med den største omsætning først ? eller hvad?
Avatar billede tomn1 Nybegynder
20. november 2003 - 09:15 #5
Jeps - lige nøjagtigt. Sorteringen i kvartalsorden er lykkedes for mig.

Men sorteringen i stigende/faldende omsætning, kan jeg ikke greje...
Avatar billede atoft Nybegynder
20. november 2003 - 09:18 #6
Under
<xsl:for-each select="finanstal/perioder/periode">
laver du en

<xsl:sort select=".//felt[name='omsægning']/value" data-type="number" />

Se om det virker
Avatar billede atoft Nybegynder
20. november 2003 - 09:20 #7
måske skal du lige stave omsætning rigtigt :-)

og ikke som jeg har gjort det :-o
Avatar billede tomn1 Nybegynder
20. november 2003 - 09:27 #8
Hej igen
Det er simpelhen HELT KANON - det virker 100%.
Takker mange gange!
Avatar billede atoft Nybegynder
20. november 2003 - 09:33 #9
Det var så lidt!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester