Avatar billede karpin123 Nybegynder
24. marts 2006 - 09:44 Der er 5 kommentarer og
1 løsning

Visning af 4 første noder i sorteret xml

Hej
Jeg vil gerne kun have vist de 4 første noder indenfor en bestemt kategori som min xml er sorteret ud fra.

ekspempel:

xml:
<Books>
  <Book>
    <ID>1</ID>
    <Title>Harry Potter</Title>
    <Category>Fantasy</Catgeory>
    <Price>300</Price>
  </Book>
  <Book>
      <ID>2</ID>
      <Title>Curious George</Title>
      <Category>Children</Catgeory>
      <Price>100</Price>
  </Book>
  .
  .
  .
  <Book>
        <ID>999</ID>
        <Title>Lord of the Rings</Title>
        <Category>Fantasy</Catgeory>
        <Price>400</Price>
  </Book>
</Books>


xsl:

    <xsl:template match="Books">
        <xsl:apply-templates select="Book">
            <xsl:sort select="Category"></xsl:sort>
            <xsl:sort select="Price"></xsl:sort>
        </xsl:apply-templates>   
    </xsl:template>
   
    <xsl:template match="Book">
        <xsl:value-of select="Title" /><br />
        <xsl:value-of select="Category" /><br />
        <xsl:value-of select="Price" /><br />
    </xsl:template>


Jeg sorterer på først kategori derfeter pris.
Jeg vil gerne have den til kun at vise de 4 første inden for hver kategori. Hvordan gør man det?
Avatar billede Slettet bruger
24. marts 2006 - 10:56 #1
Prøv det her:

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:variable name="max">4</xsl:variable>

<xsl:template match="/">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="Books">
        <xsl:apply-templates select="Book">
            <xsl:sort select="Category" />
            <xsl:sort select="Price" />
        </xsl:apply-templates>   
    </xsl:template>

    <xsl:template match="Book">
        <xsl:if test="position() &lt;= $max">
        <p>
          <xsl:value-of select="Title" /><br />
          <xsl:value-of select="Category" /><br />
          <xsl:value-of select="Price" /><br />
        </p>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

/CS
Avatar billede karpin123 Nybegynder
24. marts 2006 - 11:11 #2
Hej greystate

Dit eksempel viser kun de 4 første fra den første kategori og slutter.
Jeg kunne godt tænke at den fx først viste de 4 billigste bøger fra fantasy og derefter viste de fire billigste børnebøger osv. altså at alle kategorierne bliver får vist 4 bøger hver!?

pft
/MT
Avatar billede Slettet bruger
24. marts 2006 - 11:16 #3
Aaaahhh - læs før du svarer, Chriztian :-)

Jeg laver lige et bedre svar til dig.

/CS
Avatar billede Slettet bruger
26. marts 2006 - 23:20 #4
Tricky as hell, men her er den:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

    <xsl:variable name="max">4</xsl:variable>

    <xsl:key name="books-by-category" match="Book" use="Category" />

    <xsl:template match="/">
        <xsl:apply-templates select="Books" />
    </xsl:template>

    <xsl:template match="Books">
        <xsl:apply-templates select="Book[count(. | key('books-by-category', Category)[1]) = 1]" mode="group" />
    </xsl:template>

    <xsl:template match="Book" mode="group">
        <h2><xsl:value-of select="Category" /></h2>
        <xsl:apply-templates select="key('books-by-category', Category)" mode="item">
            <xsl:sort select="Price" data-type="number" />
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="Book" mode="item">
        <xsl:if test="position() &lt;= $max">
            <p>
              <xsl:value-of select="Title" /><br />
              <xsl:value-of select="Category" /><br />
              <xsl:value-of select="Price" /><br />
            </p>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

/CS
Avatar billede karpin123 Nybegynder
27. marts 2006 - 09:37 #5
Hej Christian

Tusind tak for dit svar. det er storslået kode! :)
Jeg håber ikke du har brugt hele weekend'en på det...

mvh Morten
Avatar billede Slettet bruger
27. marts 2006 - 11:12 #6
Bare rolig - med to små "terrorister" i huset, er kodeweekenden en saga blot :-)

Det med tricky refererer til den sindssyge apply-templates i Books templaten (det hedder "Muenchian Grouping" hvis nogen skulle være interesserede...)

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