Toon posts:

[XSL] Na apply-templates toch nog een attribuut aanspreken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Als je een template hebt die een element X matched, en in die template geef je de instructie apply-templates, kun je dan in een 'latere' template nog wel een attribuut van X selecteren?

Mij lukt het niet, en ik snap iets niet, want volgens mij gebruik ik de juiste match criteria:
XML:
1
2
3
4
<page title="Test">
    <para>Tekst...</para>
    <para>Tekst...</para>
</page>

XML:
1
2
3
4
5
6
7
8
9
10
11
<xsl:template match="page">
    <body>
        <xsl:apply-templates />
    </body>
</xsl:template>

<xsl:template match="welke match moet ik hier gebruiken">
    <h1>
        <xsl:value-of select="text()" />
    </h1>
</xsl:template>


Voor match heb ik geprobeerd, attribute::title of @title, dat werkt niet, want page is niet meer de context-node. Dus ik moet als het ware 'omhoog'. Met XPath kan dat, parent::page/attribute::title, maar in XSL is dat niet toegestaan als match. Dan zal ik vanaf de root moeten werken, dus probeer ik, /page/attribute::title dat heeft geen resultaat. Ik weethet ff niet meer, zie ik iets over het hoofd?

Wat wel kan is een value-of select="id van bovenliggende element" in de template voor <para>, maar dat is niet wat ik wil. Ook kan het in <page> zelf met value-of select="@title", maar dat is ook niet de bedoeling.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Heb je page/para al geprobeerd? page/* kan overigens ook als je dat fijner vind. Alleen moet je dan wel uitkijken met andere elementen.

Edit: werkt dit?

code:
1
2
3
4
5
<xsl:template match="page/para">
    <h1>
        <xsl:value-of select="parent::@title" />
    </h1>
</xsl:template>

[ Voor 96% gewijzigd door Michali op 21-10-2005 12:21 ]

Noushka's Magnificent Dream | Unity


Verwijderd

Topicstarter
Ja, dat werkt, maar alleen omdat je een template schrijft voor para, als er geen para element is, dan gebeurt er dus niets. Ik wil daarom een aparte template voor dat attribuut. Ik denk dat de vraag meer algemeen is:

Als een node gematched is, wordt het de context-node. Als er dan apply-templates gedaan wordt, dan komen de child-elementen aan de beurt (op dat punt wil ik dus het title-attribuut matchen met een template). Zijn attributen van de voorgaande context-node dan ook aan de beurt voor evaluatie (is er een template voor), of wordt daar niet meer naar gekeken (worden alleen elementen geevalueerd)?

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
met deze xml:
code:
1
2
3
4
<page title="Test">
    <para>Tekst...</para>
    <para>Tekst...</para>
</page>

kan je dit doen:
code:
1
2
3
<xsl:template match="para">
   <xsl:value-of select="../@title" />
</xsl:template>

'..' geeft aan dat je 1 node omhoog gaat in de tree gezien vanaf de huidige node. (als ware je een ms-dos-programmeur)

maar let op:
code:
1
2
3
<xsl:template match="para">
   <xsl:value-of select="../para" />
</xsl:template>

deze gaat eerst 1 omhoog naar page. En dan pakt ie alle values van alle para elementen. Dus ook van alle siblings vanuit de huidige para :7

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
attributen worden standaard niet meegenomen in de apply-templates. Dit is opzich ook heel logisch omdat het 'slechts' eigenschappen van 'the real thing' zijn.

Op het moment dat je het toch nodig hebt voor de werking, dan zijn er twee dingen die je moet doen.
1. fronsen en jezelf afvragen of je xml wel goed is
2. voor de attributen die je wilt een template maken
code:
1
2
3
<xsl:template match="@title">
   <!-- do important stuff -->
</xsl:template>

en dan moet je ze ook expliciet aanroepen .. bij jou zou het iets kunnen zijn als:
code:
1
2
3
4
5
6
<xsl:template match="page">
  <body>
     <xsl:apply-templates select="@title" />
     <xsl:apply-templates />
  </body>
</xsl:template>

die apply-templates kan je ook anders opschrijven:
code:
1
2
3
<xsl:apply-templates select="@title|node()" />
of als je toch maar 1 attribuut hebt:
<xsl:apply-templates select="@*|node()"/>


mijn advies is om voor elk element op een nivo van je xml (nu dus page en para) een template te maken. Op die manier kan je declaratief je hele xml 'behandelen'. Op deze manier (blijkt empirisch) werkt het het transparantst waardoor het gemakkelijker het later terug te lezen is en je minder snel vouten maakt.

Verwijderd

Topicstarter
Ja, ik lees nu net dat attributen geen kinderen zijn, maar ze hebben wel ouders (v.w.b. XSLT dan)). Best vreemd, en dat was de reden idd dat de template met match="@title" op zich niet toegepast wordt door apply-templates. Bedankt voor de tip om de template expliciet toe te passen, dan werkt het wel.

De reden dat ik een aparte template wil voor een attribuut, is omdat ik deze soms wil overrulen. Het gaat hier om een stylesheet die door andere 'ge-include' wordt, het page element wil ik niet helemaal herschrijven als ik het title attribuut níet wil tonen, dan overschrijf ik liever alleen de template voor het title-attribuut.

[ Voor 4% gewijzigd door Verwijderd op 21-10-2005 14:18 ]

Pagina: 1