Avatar billede marrix Juniormester
11. oktober 2005 - 16:13 Der er 6 kommentarer og
1 løsning

Sammenligne på attributters værdier

Hvordan sammenligner jeg på attributters værdier? Jeg har prøvet med følgende (og en hel masse andre muligheder):

<xsl:if test="not(self::minNode[@href] = preceding-sibling::minNode[@href])">
...gør et eller andet ...
</xsl:if>

Oversat: Hvis ikke denne nodes attribut 'href's værdi er lig med en anden nodes href-attributs værdi, så "gør et eller andet".

Fidusen er, at jeg i mit xml-dokument kan have flere ens elementer, som har det til fælles, at de har en attribut "href" med samme værdi. Disse dubletter vil jeg have pillet fra i det færdige dokument.

Venligst
Marianne
Avatar billede Slettet bruger
12. oktober 2005 - 10:22 #1
Hej Marianne - prøv det her:

<xsl:if test="count(preceding-sibling::minNode[@href = current()/@href]) = 0">
  --- output den eneste her ---
</xsl:if>

/CS
Avatar billede marrix Juniormester
12. oktober 2005 - 13:16 #2
Hej greystate

Tak for svaret. Lige umiddelbart virker det ikke. Men hvad er det du forsøger at gøre? Med lidt forståelse kan jeg måske tilpasse det lidt, så det matcher rette sammenhæng. Jeg har været nødt til at simplificere spørgsmålet lidt, da den del jeg tumler med er en lille del af en meget stor sammenhæng.

Venligst
Marianne
Avatar billede marrix Juniormester
12. oktober 2005 - 13:27 #3
...JO...det virker ... HURRA! Lidt forvirring om, hvor jeg er placeret når ovenstående skal eksekveres, så når jeg ændrede til preceding (i stedet for preceding-sibling), så virkede det. Jubiii.... Tak.

Det må være noget med, at jeg kigger efter om nogle (eller rettere tæller hvor mange) af de foregående elementer, der har en href-attributværdi der matcher den aktuelle href-attributværdi. Hvis tallet giver 0 (nul) ... output. Er det ikke noget i den retning?

Tusind tak. Velfortjente points ...

(Men hvorfor kan jeg ikke sammenligne direkte på værdier?)

Venligst
Marianne
Avatar billede Slettet bruger
12. oktober 2005 - 15:49 #4
Det sker som du har regnet dig frem til, ja.

Fejlen i din originale test er lidt tricky, men set før:

Problemet er at "minNode[@href]" matcher alle <minNode> elementer der har en href-attribut, ligegyldigt hvad den indeholder. Hvis du vil sammenligne værdien af denne med noget andet skal det med ind i "prædikatet" (firkantparentesen), f.eks.:

minNode[@href = 'http://www.lego.com']

Så du kan altså godt sammenligne værdier direkte...
Avatar billede marrix Juniormester
12. oktober 2005 - 18:48 #5
Oki doki ... men i dit eksempel sammenligner du på en specifik værdi. Men jeg har brug for at sammenligne en attributs værdi med de øvrige attributters værdier i dokumentet.

Måske det så ville se nogenlunde sådan ud:

<xsl:if test="preceding-sibling::minNode[@href != current()/@href])]">
...output
</xsl:if>

?

Venligst
Marianne
Avatar billede Slettet bruger
14. oktober 2005 - 12:27 #6
Jeps :-)

Pas dog på med "preceding-sibling" - hvis du kun vil matche på den umiddelbart foregående (og ikke alle) skal du tilføje "[1]" til udtrykket - sådan:

<xsl:if test="preceding-sibling::minNode[1][@href != current()/@href])]">
...output
</xsl:if>

Altså: "Hvis den første <minNode> sibling før current()'s href-attribut ikke er lig med current()'s href-attribut, så..."

/CS
Avatar billede marrix Juniormester
14. oktober 2005 - 14:07 #7
Tak for uddybningen ... :c)

Venligst
Marianne
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester