Avatar billede dr_nielsen Nybegynder
02. november 2004 - 19:02 Der er 5 kommentarer

xpath problem

<root>
    <element>
        <name>A</name>
        <type>1</type>
        <value>10</value>
    </element>
    <element>
        <name>B</name>
        <type>1</type>
        <value>100</value>
    </element>
    <element>
        <name>C</name>
        <type>0</type>
        <value>1000</value>
    </element>
    <element>
        <name>D</name>
        <type>2</type>
        <value>1000</value>
    </element>
    <element>
        <name>E</name>
        <type>0</type>
        <value>1000</value>
    </element>
</root>

Har behov for en template og en xPath der samler element/Name i grupper efter type
Noget i stil med //element/Name[type=1]

Mit problem er at de ikke bliver grupperet, men blandet sammen

eks på ønsket output

Type 0
name : C
name : E

Type 1
name : A
name : B

Type 2
name : D
Avatar billede mat Nybegynder
02. november 2004 - 21:39 #1
Hej

Jeg er super-rookie til xslt, men jeg poster lige et forsøg...om ikke andet så kan du grine af mig og lære mig en ting eller to (eller 100) jeg ikke vidste :)

Problemet (et af dem) med min template er at den løber hele lortet igennem 3 gange for kun at give "type"-overskrift en gang per type. Og man skal selvfølgelig kende typerne.

men here goes:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="ISO-8859-1" />

<xsl:template match="/">
    <html>
    <body>
    <p>
    Type 0:<br />
    <xsl:for-each select="root/element">
               
                <xsl:if test="type = 0">
                    Name: <xsl:value-of select="name" /><br />
                </xsl:if>
    </xsl:for-each>
    </p><p>
    Type 1:<br />
    <xsl:for-each select="root/element">
               
                <xsl:if test="type = 1">
                    Name: <xsl:value-of select="name" /><br />
                </xsl:if>
    </xsl:for-each>
    </p><p>
    Type 2:<br />
    <xsl:for-each select="root/element">
               
                <xsl:if test="type = 2">
                    Name: <xsl:value-of select="name" /><br />
                </xsl:if>
    </xsl:for-each>
    </p>
    </body>
    </html>
</xsl:template>

</xsl:stylesheet>


Have fun :)

mvh mat
Avatar billede janegil Nybegynder
03. november 2004 - 09:16 #2
xsl:sort ?
Avatar billede mat Nybegynder
03. november 2004 - 09:20 #3
Man kan sagtens sortere dem med xsl:sort, men får man så ikke skrevet type for hver? altså noget ala:

Type 0
name : C
Type 0
name : E
Type 1
name : A
Type 1
name : B
Type 2
name : D
Avatar billede atoft Nybegynder
03. november 2004 - 09:55 #4
xsl:sort er ikke ret god for det du vil er ikke en sortere, der er gruppere.

Derfor er det lidt omstændig indtil xslt 2.0 kommer. Den har nemlig indbygget grupperingsfunktioner.

Men det kan lade sig gøre og det på flere måder. Her er en beskrivelse af hvordan det skal gøres.

http://www.jenitennison.com/xslt/grouping/index.html#by-content
Avatar billede Slettet bruger
26. november 2004 - 01:17 #5
Her har du en OK måde at gøre det på:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   
    <xsl:template match="/">
        <html>
        <head>
            <title>Experten #557234</title>
            <style type="text/css">
            dl, dt, dd { margin: 0; padding: 0;}
            dl { margin-bottom: 1em; }
            </style>
        </head>
        <body>
            <xsl:apply-templates />
        </body>
        </html>
    </xsl:template>
   
    <xsl:template match="root">
        <xsl:for-each select="element">
            <xsl:sort select="type" data-type="number" order="ascending" />
            <xsl:if test="not(preceding-sibling::element[type = current()/type])">
                <dl>
                    <dt>Type <xsl:value-of select="type" /></dt>
                    <xsl:apply-templates select="../element[type = current()/type]/name">
                        <xsl:sort select="." data-type="text" order="ascending" />
                    </xsl:apply-templates>
                </dl>
            </xsl:if>
        </xsl:for-each>
   
    </xsl:template>
   
    <xsl:template match="name">
        <dd>name : <xsl:apply-templates /></dd>
    </xsl:template>
   
</xsl:stylesheet>
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

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