Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[XPath] Laatste node uit gecombineerde nodeset vergelijken

Pagina: 1
Acties:

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Om een sequence op te bouwen met komma-gescheiden records wil ik graag tussen iedere waarde een komma zetten behalve de laatste. Dat laatste is waar de schoen wringt. Ik doe een selectie en wil vervolgens het laatste element vergelijken met het huidige om te kijken of dit het laatste element is (dan géén komma).

Probleem is dat er geen goed resultaat uit komt. Gezien de selectie moet er toch altijd een laatste element zijn, echter geeft XSLT bij elke node aan dat het de laatste is (en zet dus geen komma).

De elementen bevinden zich niet op hetzelfde niveau en kunnen genest zijn.

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<xsl:template match=" ... ">

    <xsl:apply-templates select="mysql:table" mode="fieldlist" />
    <xsl:apply-templates select="//mysql:join/mysql:table" mode="fieldlist" />

</xsl:template>



<xsl:template match="mysql:query/mysql:table | mysql:join/mysql:table" mode="fieldlist">

    <xsl:apply-templates select="mysql:field" />
    
    <xsl:if test="(//mysql:query/mysql:table | //mysql:join/mysql:table)[last()] != .">, </xsl:if>

</xsl:template>



<xsl:template match="mysql:query/mysql:table/mysql:field | mysql:join/mysql:table/mysql:field">
    ...
</xsl:template>

Zie ik iets over het hoofd of doe ik die vergelijking van nodes niet goed? 8)7

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:02

TeeDee

CQB 241

Je kan toch een count(path) doen? Lijkt me dat je daar wel het e.e.a. aan informatie uit kan halen om vervolgens verder mee te rekenen.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Die test zoekt niet relatief lijkt me? Kijk eens naar dit 2e voorbeeld met "a, b, and c!"

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
TeeDee schreef op vrijdag 29 augustus 2008 @ 09:31:
Je kan toch een count(path) doen? Lijkt me dat je daar wel het e.e.a. aan informatie uit kan halen om vervolgens verder mee te rekenen.
Ik zou niet weten wat ik daarmee moet? In een normale nodeset zou dat kunnen, maar in een gecombineerde nodeset volgens mij niet, omdat de position() de positie in verhouding tot de siblings geeft?

Daarbij gebruik ik nu hetzelfde idee? Als position index heb ik de count van de gecombineerde nodeset al een keer gebruikt, zelfde resultaat als bovenstaande :'(
pedorus schreef op vrijdag 29 augustus 2008 @ 09:31:
Die test zoekt niet relatief lijkt me? Kijk eens naar dit 2e voorbeeld met "a, b, and c!"
Ik snap niet welk voorbeeld? Ik zie 'example 1' en 'example 2' maar niets met a, b en c. In het tweede example zie ik niets nieuws, dat probeer ik ook in bovenstaande te gebruiken, maar dat werkt dus niet.

Nog een toevoeging misschien. Als ik met value-of de waardes ga lezen van (nodeset)[last()] dan krijg ik wel de juiste naam, dus is de juiste (laatste) node geselecteerd. Alleen gaat die vergelijking blijkbaar niet goed.

XML:
1
<xsl:if test="(//mysql:query/mysql:table | //mysql:join/mysql:table)[last()]/@name != ./@name">, </xsl:if>

Werkt bijvoorbeeld wel. Alleen is de @name attribuut niet altijd uniek, en kan ik deze dus niet gebruiken. De node zelf wel natuurlijk.

Ik heb het tijdelijk opgelost door de id's te vergelijken die ik aan iedere NodeElement heb gegeven. Natuurlijk zou ik graag de oplossing weten om toch de nodes te vergelijken, aangezien ik dit veel netter vind. Het viel me op dat ze in PHP DOM gebruik maken van 'isSameNode()' en niet gewoon '==' kunnen gebruiken, misschien dat de reden om daarvoor te kiezen enigzins relatie hiermee heeft?

[ Voor 34% gewijzigd door r0bert op 29-08-2008 11:02 ]


  • pedorus
  • Registratie: Januari 2008
  • Niet online
r0bert schreef op vrijdag 29 augustus 2008 @ 10:52:
Ik snap niet welk voorbeeld? Ik zie 'example 1' en 'example 2' maar niets met a, b en c. In het tweede example zie ik niets nieuws, dat probeer ik ook in bovenstaande te gebruiken, maar dat werkt dus niet.
Tsja, ik denk dat als je bij de match er haakjes omheen zet, en alleen test op "position()!=last()", het gewoon zou moeten werken? (En dan werkt het ook bij gelijke elements.)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Nee, dat werkt helaas niet

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Volgens mij werkt in een xsl:if test attribute de '|' niet als or, maar moet je 'or' uitgeschreven gebruiken. De | verenigt sets nodes, zoals in een apply-templates select attribute.

edit:
Net geverifieerd: | werkt daar niet zoals je verwacht. Probeer eens 'or'.


edit:
Ah sorry, verkeerd gelezen inderdaad; dit is niet relevant

[ Voor 44% gewijzigd door Confusion op 29-08-2008 11:53 ]

Wie trösten wir uns, die Mörder aller Mörder?


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Gebruik dan for-each ipv template. Als ik test zijn haakjes niet eens nodig.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Confusion schreef op vrijdag 29 augustus 2008 @ 11:30:
Volgens mij werkt in een xsl:if test attribute de '|' niet als or, maar moet je 'or' uitgeschreven gebruiken. De | verenigt sets nodes, zoals in een apply-templates select attribute.
Klopt, het is ook de bedoeling om ze samen te voegen :) Van die samenvoeging wil ik vervolgens de laatste node vergelijken met de huidige.
pedorus schreef op vrijdag 29 augustus 2008 @ 11:39:
[...]

Gebruik dan for-each ipv template. Als ik test zijn haakjes niet eens nodig.
Een for-each als workaround is geen optie in mijn applicatie (werkt op selectie van template matches gecombineerd met de document structuur). Als je zonder haakjes test, krijg je een verkeerde gecombineerde nodeset (als zijnde de eerste nodeset en het laatste element van de 2e nodeset)

  • pedorus
  • Registratie: Januari 2008
  • Niet online
r0bert schreef op vrijdag 29 augustus 2008 @ 11:42:
Een for-each als workaround is geen optie in mijn applicatie (werkt op selectie van template matches gecombineerd met de document structuur).
Hm, gek, ik dacht dat for-each altijd wel mogelijk was.

Het probleem van je huidige oplossing zit hem erin dat "=" niet de nodes vergelijkt. In XPath 2 is hier " is " voor. In XPath 1 kun je generate-id(...) om beide kanten heen zetten.
Als je zonder haakjes test, krijg je een verkeerde gecombineerde nodeset (als zijnde de eerste nodeset en het laatste element van de 2e nodeset)
Het gekke is dat for-each in de implementatie die ik gebruikte(FF2 html testpagina) automatisch er al haakjes om lijkt te zetten.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
pedorus schreef op vrijdag 29 augustus 2008 @ 13:20:
[...]

Hm, gek, ik dacht dat for-each altijd wel mogelijk was.
Het is vast mogelijk, maar ik gebruik de templates in de vorm van een soort filters. Anders zou ik voor ieder elementtype dat erin genest kan zijn een apart foreach loop moeten maken. Daarbij bepaald de match van de template, of deze geinclude wordt, na vergelijking met de documentstructuur (dynamisch 3th party app. zeg maar :))
Het probleem van je huidige oplossing zit hem erin dat "=" niet de nodes vergelijkt. In XPath 2 is hier " is " voor. In XPath 1 kun je generate-id(...) om beide kanten heen zetten.
Ah! Daar was ik dus naar op zoek. Is dat ergens gedocumenteerd? Want ik kon er barweinig over vinden. Ik zal een poging doen met generate-id(). Thanks!
Het gekke is dat for-each in de implementatie die ik gebruikte(FF2 html testpagina) automatisch er al haakjes om lijkt te zetten.
Ik via de PHP XSLT. De haakjes zal ik aanhouden :) Sowieso ook makkelijker met lezen van de expressie.

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

r0bert schreef op donderdag 28 augustus 2008 @ 22:53:
Zie ik iets over het hoofd of doe ik die vergelijking van nodes niet goed? 8)7
Zie je misschien gewoon over het hoofd dat je testset maar 1 'table' element heeft, waarbij het
het laatste element van de set
code:
1
//mysql:query/mysql:table | //mysql:join/mysql:table
(en dus de eerste en enige) altijd gelijk is aan '.', terwijl je kommas tussen de 'fields' wil zetten?

Wie trösten wir uns, die Mörder aller Mörder?


  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Zoiets heb ik ook al zitten zoeken, maar het gaat echt om de vergelijking. De velden zijn altijd genest in een table, daarom hebben die in hun template hun eigen check of ze van hun 'set' de laatste zijn. Zijn ze inderdaad de laatste, zetten ze geen komma. Vervolgens komt de processor terug in de table-template en kijkt of het de laatste table is; zo niet, dan alsnog die komma.

Het werkt nu met generate-id(), hopelijk is de 'is' operator snel beschikbaar :)
Pagina: 1