Avatar billede fuxi Nybegynder
22. oktober 2007 - 09:35 Der er 7 kommentarer og
1 løsning

XSLT Variables ?

Hmm har siddet med et dumt problem et stykke tid nu og håber der er nogen der kan hjælpe. Jeg har følgende xml:

<results>
<result>
<id>12154</id>
<name>Peter</name>
<address>Somewhere</address>
<city>Some place</city>
</result>
<result>
<id>12154</id>
<name>Peter</name>
<address>Somewhere else</address>
<city>Some place else</city>
</result>
<result>
<id>12154</id>
<name>Peter</name>
<address>Somewhere</address>
<city>Some place</city>
</result>
</results>

Det jeg gerne vil er sådan set at lave en xslt som opføre sig ud fra følgende Pseudo kode:

If (city = previous_city) Then
  Show in one way
Else
  Show in another way
End If

Sagt med andre ord så vil jeg gerne have min xslt til at reagere på en måde når den forrige by er lig med den by jeg står ved nu. Er den ikke lig med den skal der gøres noget andet. Normalt ville jeg bare gøre det med at gemme en variable der indeholdt den forrige by, men det kan ikke lade sig gøre i XSLT så hvad gør man så?

/Fuxi
Avatar billede softspot Forsker
22. oktober 2007 - 11:26 #1
Du kan bruge rekursion.

Jeg kan desværre ikke give dig et konkret eksempel, da det er for længe siden jeg har arbejdet med XSLT, men logikken er, at du laver en template som tager din node-liste af "result", samt et indeks på den aktuelle node.

I denne template sørger du dels for at kontrollere om det er den første -, sidste - eller en mellemliggende node (og reagerer på en passende måde derefter :-)).

Hvis det er første node, skal du ikke sammenligne med den forrige (via indeks i "result"-nodelisten), men blot udskrive noden og kalde templaten selv (call-template og with-params), med "result"-nodelisten og indeks+1. Efterfølgende noder skal sammenlignes med den forrige ("result"-nodelisten[$indeks-1] vha. en choose/when/otherwise-konstruktion.

For at starte rekursionen skal du kalde den på samme måde, dvs. med call-template og with-params.
Avatar billede janegil Nybegynder
22. oktober 2007 - 14:19 #2
select="by[.=preceding-sibling::by]" eller noe sånt.

Ser lite lettlest dokumentasjon på hvordan bruke preceding-sibling aksen.
Avatar billede janegil Nybegynder
22. oktober 2007 - 14:20 #3
Avatar billede fuxi Nybegynder
22. oktober 2007 - 16:58 #4
tak for de gode svar :) det ser ud til at jeg kan løse det nemmest med     select="by[.=preceding-sibling::by]" princippet :)

Mange tak... smid lige et svar softspot og janegil så kan i få point
Avatar billede softspot Forsker
22. oktober 2007 - 19:47 #5
Jeg synes janegil's løsning er væsentlig mere elegant og fiks end mit forslag, så de point synes jeg bare janegil skal have. Ellers tak for budet :-)
Avatar billede janegil Nybegynder
22. oktober 2007 - 22:32 #6
Hvis du fikk de til å virke, så tar jeg gjerne pts.

Men legg også ut litt av koden, for jeg føler meg på riktig tynn is her - jeg skal sitte lenge med koden før jeg får det til selv.

XSLT er et område der man skal vokte seg vel for å begynne å løse problemer - har man et problem er det som regel fordi man burde gjort sakene på en helt annen måte. Dagens slogan: "Problemer skal ikke løses - de skal omgåes!"
Avatar billede fuxi Nybegynder
25. oktober 2007 - 13:35 #7
Tak for svaret :)
Og flot af dig SoftSpot at give point videre :)

MVH
Fuxi
Avatar billede softspot Forsker
25. oktober 2007 - 13:44 #8
Jeg erkender gerne når nogen har en bedre løsning end mig - så lærer jeg jo også noget... :)
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