[XSLT] parent-path opvragen

Pagina: 1
Acties:

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Stel ik heb een XML bestand zoals dit
code:
1
2
3
4
5
<bedrijf value="Philips">
  <afdeling value="Customer">
     <werknemer>Jaap</werknemer>
  </afdeling>
</bedrijf>

Nu heb ik in een XSL bestand een template staan die matcht op 'werknemer'. In die template wil ik eigenlijk door alle parents heen itereren (en daarbij de bijbehorende attribuut value opvragen).

Hoe kan ik dit het beste doen?

Dus in pseudo
code:
1
2
3
4
5
<xsl:template match="werknemer">
  <xsl:for-each select="parent"> <--- dit moet dus anders
    <xsl:value-of select="name(.)"/> = <xsl:value-of select="@value"/><br/>
  </xsl:for-each>
</xsl:template>

Wat als resultaat moet geven
code:
1
2
afdeling = Customer
bedrijf = Philips

wie o wie?!

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
../@value ??
value is trouwens een vreemde naam voor een attribuut, ik zou kiezen voor een meer beschrijvende naam, 'afdelingstype' oid..

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op woensdag 08 mei 2002 19:38 schreef brammetje het volgende:
../@value ??
value is trouwens een vreemde naam voor een attribuut, ik zou kiezen voor een meer beschrijvende naam, 'afdelingstype' oid..
Ja dat is 1 parent erboven, maar ik wil dus alle parents aflopen (tot aan de root).

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op woensdag 08 mei 2002 19:41 schreef Orphix het volgende:

[..]

Ja dat is 1 parent erboven, maar ik wil dus alle parents aflopen (tot aan de root).
ah, recursief de parents langslopen dus?

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op woensdag 08 mei 2002 19:42 schreef brammetje het volgende:

[..]

ah, recursief de parents langslopen dus?
uhm nou recursief, iteratief het maakt me niet uit zolang ik maar het resultaat krijg die ik heb gegeven :)

Ik dacht misschien door een bepaalde axis aan te geven, maar ik heb nog niet echt door hoe die werken.

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
"parent::*" ipv "parent" geloof ik.

[edit]
owja, idd ancestor. parent is maar 1 node.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Er zijn veel oplossingen, maar volgens mij moet de 'ancestor' axis dit het makkelijkst oplossen :) .

Kijk anders eens in de uitstekende tutorials van XSLT en XPath op zvon.org. De axis worden daar prima behandeld met veel en duidelijke voorbeelden.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
De parent axis bevat alleen maar de parent (hum, lekker duidelijk ;) ). De ancestor axis bevat ook daar weer de parent van enzovoorts tot en met de root node.

edit: ah, marcusk had het ook al door :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hier ff een snel voorbeeldje:
code:
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0"?>

<bedrijf>>
  <naam>Philips</naam>
  <afdeling>
     <naam>Customer</naam>
     <werknemer>
      <naam>Jaap</naam>
    </werknemer>
  </afdeling>
</bedrijf>


code:
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
32
33
<?xml version="1.0"?>

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
    <xsl:output method="text" encoding="utf-8"/>
          
    <xsl:template match="/">
    <xsl:apply-templates select="//werknemer"/>
    </xsl:template>

    <xsl:template match="bedrijf">
    <xsl:text>bedrijf=</xsl:text>
    <xsl:apply-templates select="naam"/>
    <xsl:text>
</xsl:text>
    </xsl:template>

    <xsl:template match="afdeling">
    <xsl:text>afdeling=</xsl:text>
    <xsl:apply-templates select="naam"/>
    <xsl:text>
</xsl:text>
    </xsl:template>

    <xsl:template match="werknemer">
    <xsl:text>werknemer=</xsl:text>
    <xsl:apply-templates select="naam"/>
    <xsl:text>
</xsl:text>
    <xsl:apply-templates select="ancestor::*"/>
    </xsl:template>

</xsl:transform>


code:
1
2
3
werknemer=Jaap
bedrijf=Philips
afdeling=Customer

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op woensdag 08 mei 2002 21:30 schreef mbravenboer het volgende:
Hier ff een snel voorbeeldje:
*een goed werkend voorbeeld*
Bedankt!
Dit werkt idd zoals ik het had gevraagd! Het was dus toch iets met die axis .. ik zat op de goede weg :P
bedankt :)
Pagina: 1