[XSLT] Sorteren en ontdubbelen van een query

Pagina: 1
Acties:
  • 189 views sinds 30-01-2008
  • Reageer

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 19:00
Ik heb in XSLT een query gebouwd die mij een te groot aantal resultaten teruggeeft. Een distinct op een query is blijkbaar nog niet mogelijk en ik ben gebonden aan XSLT 1.0. Met behulp van een for-each kan ik gesorteerd op achternaam door een lijst lopen. Ook kan ik in de for-each lus de huidige en vorige positie bepalen

XSLT:
1
2
3
4
5
6
7
8
9
10
11
12
<xsl:for-each select="$resultEmployees//nds/output/instance">
     <xsl:sort select="./attr[@attr-name='Surname']"/>
     <xsl:variable name="varPreviousPosition">
     <value><xsl:value-of select="position()-1"/></value>
     </xsl:variable>
            
     <xsl:message>Current name: <xsl:value-of select="./attr[@attr-name='Surname']/value"/></xsl:message>
     <xsl:if test="position() > 1">
          <xsl:message>Previous name = <xsl:value-of select="../instance[$varPreviousPosition]/att-[@attr-name='Surname']/value"/>
          </xsl:message>
     </xsl:if>
</xsl:for-each>


Echter de naam van de vorige employee krijg ik niet of onjuist te zien. Bij element 4 zie ik bij previous name dus niet de naam te zien die ik bij element 3 als currentname zie. Daardoor is het niet mogelijk om de query te ontdubbelen. Hoe kan ik dit oplossen?

[ Voor 15% gewijzigd door TweakersOnly op 20-07-2005 11:39 ]


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op welke criteria wil je de gebruikers identificeren? Id's, of de voornaam/achternaam combinatie (de laatste gaat problemen opleveren.)
Trouwens in jouw verhaal is de waarde van $varPreviousPosition gelijk aan
XML:
1
<value>[getal]</value>


Als je trouwens ook even je input-XML geeft, dan kijk ik er vanavond nog even naar. Ik zou in ieder geval adviseren gebruikers een uniek attribuut mee tegeven, dan is het ondubbelen namelijk slechts een kwestie van:
code:
1
//instance[ not( preceding-sibling::instance[ id = ./id ] ) ]

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 19:00
Glimi schreef op woensdag 20 juli 2005 @ 11:52:
Op welke criteria wil je de gebruikers identificeren? Id's, of de voornaam/achternaam combinatie (de laatste gaat problemen opleveren.)
Trouwens in jouw verhaal is de waarde van $varPreviousPosition gelijk aan
XML:
1
<value>[getal]</value>


Als je trouwens ook even je input-XML geeft, dan kijk ik er vanavond nog even naar. Ik zou in ieder geval adviseren gebruikers een uniek attribuut mee tegeven, dan is het ondubbelen namelijk slechts een kwestie van:
code:
1
//instance[ not( preceding-sibling::instance[ id = ./id ] ) ]
In mijn voorbeeld moet de achternaam uniek zijn. Hoe moet ik jouw preceding-sibling code interpreteren icm mijn code?

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
TweakersOnly schreef op woensdag 20 juli 2005 @ 12:25:
In mijn voorbeeld moet de achternaam uniek zijn. Hoe moet ik jouw preceding-sibling code interpreteren icm mijn code?
Hoe ziet je input er uit?

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 19:00
Dit is mijn input XML

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<nds dtdversion="2.0" ndsversion="8.x">
    <output>
        <instance>
            <association state="pending"></association>
            <attr attr-name="Surname">
                <value type="string">Janssen</value>
            </attr>
            <attr attr-name="Given name">
                <value type="string">Ruud</value>
            </attr>
        </instance>
        <instance>
            <association state="pending"></association>
            <attr attr-name="Surname">
                <value type="string">Pietersen</value>
            </attr>
            <attr attr-name="Given name">
                <value type="string">Hans</value>
            </attr>
        </instance>
        <instance>
            <association state="pending"></association>
            <attr attr-name="Surname">
                <value type="string">Janssen</value>
            </attr>
            <attr attr-name="Given name">
                <value type="string">Piet</value>
            </attr>
        </instance>
    </output>
</nds>


In bovenstaand voorbeeld moet dus het 3e item worden genegeerd.

Overigens: via de deze link wordt voor een vrijwel identiek probleem schinbaar werkbare oplossing gegeven.

[ Voor 39% gewijzigd door TweakersOnly op 20-07-2005 12:52 ]


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
code:
1
//instance[ not( attr[@attr-name = 'Surname']/value = preceding::instance/attr[@attr-name='Surname']/value ) ]

Voila, alle unieke instance-elementen waarbij we het uniek zijn bepalen adv de value van de surname.

Zoals je ziet is ie een stuk anders als m'n voorbeeldcode, ik moest ook weer even stoeien om het boven te krijgen. Als het niet 100% duidelijk is, gewoon ff roepen.

[ Voor 21% gewijzigd door Glimi op 20-07-2005 13:18 ]


  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 19:00
Glimi schreef op woensdag 20 juli 2005 @ 13:18:
Voila, alle unieke instance-elementen waarbij we het uniek zijn bepalen adv de value van de surname.

Zoals je ziet is ie een stuk anders als m'n voorbeeldcode, ik moest ook weer even stoeien om het boven te krijgen. Als het niet 100% duidelijk is, gewoon ff roepen.
Waar heb je jouw code neergezet in het geheel? Als ik deze code invoer als testwaarde bij de for-each krijg ik nog steeds 3 records terug. :?

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Ik pak je input en doe er deze XSL over heen:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" />
    <xsl:template match="nds">
        <nameCollection>
            <xsl:for-each select="//instance[ not( attr[@attr-name = 'Surname']/value = preceding::instance/attr[@attr-name='Surname']/value ) ]">
                <xsl:sort order="ascending" data-type="text" select="attr[@attr-name = 'Surname']/value" />
                <name><xsl:value-of select="attr[@attr-name = 'Surname']/value" />, <xsl:value-of select="attr[@attr-name = 'Given name']/value" /></name>
            </xsl:for-each>
        </nameCollection>
    </xsl:template>
</xsl:stylesheet>


Vervolgens is de output
XML:
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<nameCollection>
    <name>Janssen, Ruud</name>
    <name>Pietersen, Hans</name>
</nameCollection>
Pagina: 1