Toon posts:

[XML/XSL] Probleem met ophalen waardes uit xml-document

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben nog niet zo lang bezig met XML dus mijn probleem zal wel niet te moeilijk zijn denk ik.
Het gaat om het volgende:
Ik wil met een xsl file bepaalde informatie ophalen uit een xml-document.
Dit is mijn structuur van het xml-document in het kort:
<personeel>
<personeelslid id="001">
<naamgegevens>
<naam>Ik</naam>
<voornaam>ke</voornaam>
<kinderen aantal="2">
<kind>
<kind_naam>kindje</kind_naam>
<kind_geslacht>m</kind_geslacht>
</kinderen>
</personeelslid>
enz.... (hier komen meerder personeelsleden)
</personeel>

Nu wil ik de personeelsleden ophalen die 2 kinderen hebben. En van die personeelsleden wil ik dan naam en voornaam afdrukken op het scherm.
Hetgeen ik heb geprobeerd is dit:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>Dit is de personeelslijst</title>
</head>
<body>
<h2>Dit zijn de personeelsleden:</h2>
<xsl:apply-templates select="personeel/personeelslid/kinderen[@aantal='2']"/>
<br />
</body>
</html>
</xsl:template>
<xsl:template match="personeel/personeelslid/kinderen[@aantal='2']">
Voornaam:
<xsl:value-of select="//naamgegevens/voornaam"/>
<br />
Naam:
<xsl:value-of select="//naamgegevens/naam"/>
<br />
</xsl:template>
</xsl:stylesheet>

Op deze manier krijg ik echter gewoon de naam en voornaam van het eerste personeelslid uit mijn document en niet die van een personeelslid met 2 kinderen.
Mijn vraag is hoe geraak ik aan de juiste gegevens van het personeelslid met 2 kinderen?

Alvast bedankt,

Bram

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10:04
Beetje verwarrend want jou eerste personeelslid heeft ook daadwerkelijk 2 kinderen :)

Verder kan ik je niet helpen met dit verhaal :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 08-04 12:54

Jaspertje

Max & Milo.. lief

kan je niet een for-each gebruiken:
HTML:
1
2
3
4
<xsl:for-each select="/personeel/personeelslid[kinderen[@aantal='2']]">
Voornaam:
<xsl:value-of select="naamgegevens/voornaam/text()"/>
<xsl:for-each >


Je naamsgegevens wordt niet afgesloten in je XML, daarom is het gokken waar de kinderen staan

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Het aantal=2 attribuut lijkt mij redundant. Je hebt kind elementen dus als je die telt heb je het aantal kinderen.
Verder zou ik gewoon door for-each persoon loopen en dan als er 2 kinderen zijn iets doen. Maar misschien is dat niet de meeste snelle methode. :o

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Van "kind_naam" en "kind_geslacht" kan je ook het "kind_" af strippen, daar ze toch al subelement zijn van "kind" :)

[ Voor 4% gewijzigd door riezebosch op 07-06-2005 15:36 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

Topicstarter
Ja ik ben hier inderdaad <naamgegevens> vergeten af te sluiten, maar in mijn eigen xml-document is dit wel in orde.
Mijn voorbeeld is misschien niet zo goed. Maar ik wou hier niet mijn ellelange code plakken. In mijn xml-document staat er iemand zonder kinderen als eerste personeelslid.
Het aantal als attribuut is eigenlijk wel overbodig, maar dat maakt nu niet zoveel uit. Net zo min als de naamgevingen, but i'll keep it mind :)
Nu ik ben aan het proberen met for-each. Zal zien hoe het afloopt.

Alvast bedankt voor de reacties.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Ik ben even uitgegaan van de volgende XML:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<personeel>
    <personeelslid id="001">
        <naamgegevens>
            <naam>Ik</naam>
            <voornaam>ke</voornaam>
        </naamgegevens>
        <kinderen aantal="2">
            <kind>
                <kind_naam>kindje</kind_naam>
                <kind_geslacht>m</kind_geslacht>
            </kind>
        </kinderen>
    </personeelslid>
</personeel>

Dus naamgegevens afgesloten voor je kinderen-element.

Wat is nu het probleem met je XSL.
1) Je template is gedefinieerd op een kinderen element, terwijl je een naamgegevens element wilt verwerken
2) Je matched op '2', terwijl dit gewoon 2 kan zijn. Nu is dat geen probleem omdat ik geen schema zie, maar als het een xsd:integer was geweest, weet ik niet of het goed gaat als je op '2' matched

Met de volgende XSL werkt hij goed. Opzich is deze nog wel enigzins discutabel, aangezien ik dus een template heb voor personeelslid-elementen en daar eigenlijk naamgegevens mee ga verwerken. Netter is om dit weer op te splitsen in een aanroep naar een naamgegevens element.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
[snip]
                <h2>Dit zijn de personeelsleden:</h2>
                <xsl:apply-templates select="personeel/personeelslid[kinderen/@aantal=2]"/>
                <br/>
            </body>
        </html>
    </xsl:template>
    
    <xsl:template match="personeelslid">
        Voornaam:<xsl:value-of select="naamgegevens/voornaam"/><br/>
        Naam:<xsl:value-of select="naamgegevens/naam"/><br/>
    </xsl:template>
</xsl:stylesheet>

[ Voor 14% gewijzigd door Glimi op 07-06-2005 15:55 ]


Verwijderd

Topicstarter
@Glimi

Het is me nu gelukt met "for-each" te gebruiken.
Maar ik heb toch jou voorstel nog even geprobeerd. Maar ik kreeg dan gewoon geen output.
Mijn probleem was inderdaad dat ik een selectie moest uitvoeren en met dat resultaat eigenlijk terug naar boven moest in de hiërarchie om naamgegevens te kunnen gebruiken en ik wist niet hoe ik dit moest doen.
Dus als er iemand weet hoe je dit doet zonder for-each, mag dat altijd nog even laten weten :)

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Verwijderd schreef op dinsdag 07 juni 2005 @ 16:06:
@Glimi

Het is me nu gelukt met "for-each" te gebruiken.
Maar ik heb toch jou voorstel nog even geprobeerd. Maar ik kreeg dan gewoon geen output.
Mijn probleem was inderdaad dat ik een selectie moest uitvoeren en met dat resultaat eigenlijk terug naar boven moest in de hiërarchie om naamgegevens te kunnen gebruiken en ik wist niet hoe ik dit moest doen.
Dus als er iemand weet hoe je dit doet zonder for-each, mag dat altijd nog even laten weten :)
Zet even dan even precies je XML en XSL neer, dan gaan we dat even fixen. Als het vrij veel is, is een zipje of iets dergelijks misschien slimmer.
[edit] Want dat nare iteratieve for-each in dat mooie XSL is natuurlijk niets ;)

[ Voor 7% gewijzigd door Glimi op 07-06-2005 16:17 ]


Verwijderd

Topicstarter
Ok, my mistake. Ik had in mijn xml-file het "aantal" attribuut al weggehaald en met count(kind) gewerkt. Jouw oplossing werkt dus. Maar ik begrijp niet waarom dat werkt. Ik heb zoiets 100 keer geprobeerd. Of kan dit liggen aan het feit dat ik steeds schreef:
<xsl:apply-templates select="personeel/personeelslid/kinderen[@aantal=2]"/>
of
<xsl:apply-templates select="personeel/personeelslid[kinderen[@aantal=2]]"/>
i.p.v.
<xsl:apply-templates select="personeel/personeelslid[kinderen/@aantal=2]"/>

Kan dat een reden zijn? Want volgens mij is dit alledrie hetzelfde, of vergis ik me?

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Het is niet het hetzelfde, bij de laatste twee selecteer je een persooneelslid, bij de eerste kinderen. Je kan niet meer zomaar terug in de hierarchie. Dus als jij personeelsleden met twee kinderen wil selecteren gebruik je

code:
1
personeel/personeelslid[kinderen/@aantal=2]

of misschien iets als
code:
1
personeel/personeelslid[count(kinderen/kind) = 2]


wel ongetest hoor. Maar die [] betekent dus een filter. Zie bijvoorbeeld deze tutorial. Succes :)

Verwijderd

Topicstarter
Ok thanx. Begin het nu wat meer te snappen. :) Ik wist niet precies wat de deal was met die [].
Pagina: 1