Avatar billede pnr Nybegynder
21. juni 2010 - 11:48 Der er 13 kommentarer og
1 løsning

lave en sammenligning med det forgående element i en for-each

Jeg henter noget data fra noget XML som ligges i en variable, denne variable lave jeg så efterfølgende et gennemløb af ved hjælp af en "for-each". nu har jeg brug for at kende til det forgående element i min liste, men hvordan gør jeg det i xslt?

Det her skal jeg

loop
  if( DetForgåendeElement/tid = AktuelleElement/tid)
      Gør noget med AktuelleElement

hvordan gør jeg ovenstående i XSLT?
Avatar billede jokkejensen Novice
28. juni 2010 - 11:53 #1
<xsl:if test=preceding-sibling::node()/@id = ./@id">
. = det aktuelle element = <xsl:value-of select="." />
</xsl:if>
/J
Avatar billede pnr Nybegynder
28. juni 2010 - 12:45 #2
Hej Jokkejensen


Tusind tak for din kommentar!! Jeg har et lille problem med ovenstående, for jeg sorterer data i min for-each og det tager "preceding-sibling" åbenbart ikke højde for. Har du en ide til hvordan jeg løser det?

På forhånd mange tak for svar!
Avatar billede jokkejensen Novice
28. juni 2010 - 12:53 #3
sorter data når du smider dem i din variable, men det burde ellers ikke have noget at sige..

Hvis du har en sort, under din foreach, vil nodesettet være sorteret efter denne, også i din foreach.
Avatar billede pnr Nybegynder
28. juni 2010 - 13:25 #4
Jeg har fundet frem til at når jeg bruger "preceding-sibling" i en for-each som er sorteret, så kigger "preceding-sibling" ikke i det sorterede resultat, men i det orginale resultat. Jeg har brug for at det kigge i det sorterede.
Avatar billede jokkejensen Novice
28. juni 2010 - 13:54 #5
prøv ./preceding-sibling::node()/@id

Ellers vis mig hvordan du danner denne variable.. Ofte har jeg også måtte danne noget xml for at transformere det endnu engang.

ex:
<xsl:variable name="mitdata">
<root>
<xsl:foreach select="item">
<xsl:sort XXXX />
<item>
<xsl:copy-of select="." />
</item>
</xslforeach>
</root>
</xsl:variable>


<xsl:foreach select="$mitdata//item" />

/J

/J
Avatar billede pnr Nybegynder
28. juni 2010 - 15:14 #6
Hej Jokke og tak fordi at du "hænger på" :-)

Her kommer lidt kode:

<Timetable>
  <Result>
        .....
        </TimetableEvent>
        <TimetableEvent>
            <Date>2010-06-15</Date>
            <WeekNumber>24</WeekNumber>
            <WeekdayNumber>2</WeekdayNumber>
            <Weekday>Tirsdag</Weekday>
            <LectureNumber>6</LectureNumber>
            <StartTime>13:30</StartTime>
            <EndTime>14:15</EndTime>
            <Subject>
                <SubjectName>63040</SubjectName>
                <Level>-</Level>
                <ShortDescription>Modul 4</ShortDescription>
                <Description>Beskrivelse</Description>
            </Subject>
            <Activity>
                <Name>EH75</Name>
                <ShortDescription>E75</ShortDescription>
                <Description>beskrivelse</Description>
                <Department>EH</Department>
                <NumberOfActiveStudents>39</NumberOfActiveStudents>
            </Activity>
            <Room>
                <Number>204 Teo</Number>
                <ShortDescription>kort...</ShortDescription>
                <Name>et eller andet</Name>
                <Role>U</Role>
                <RoleType>U</RoleType>
                <BuildingNumber>hus</BuildingNumber>
                <BuildingDescription>stort hus</BuildingDescription>
            </Room>
        </TimetableEvent>
        <TimetableEvent>
        .....
  </Result>
</Timetable>

<!--Jeg henter så det data jeg skal bruge-->
          <xsl:variable name="skema" select="/Result/Timetable/TimetableEvent[generate-id(.) = generate-id(key('t', StartTime))]"></xsl:variable>

<!-- og gennemløber det -->
    <xsl:for-each select="$skema[(number(substring-before(StartTime,':'))*100+number(substring-after(StartTime,':'))) > 799]">
                <xsl:sort select="number(substring-before(StartTime,':'))*100+number(substring-after(StartTime,':'))" data-type="number" order="ascending"/>

<!-- aktuelle nodes sluttid -->
<xsl:value-of select="EndTime"/> -

<!-- *** forgående nodes sluttid *** -->
<xsl:value-of select="./preceding-sibling::node()[1]/StartTime"></xsl:value-of>

...


den forgående nodes slut tid viser den forgående node i mit orginale XML, og ikke den forgående node i min sorterede liste som jeg udskriver. Giver det mening?
Avatar billede jokkejensen Novice
28. juni 2010 - 15:26 #7
ja det giver fin nok mening.

Mente bare ikke det fungerede sådan..

Men du kan vel "bare":

<!-- *** forgående nodes sluttid *** -->
<xsl:value-of select="$skema/node()[position() = (position()-1)]/StartTime"></xsl:value-of>
Avatar billede jokkejensen Novice
28. juni 2010 - 15:26 #8
tjek lige om position = 1, ellers går det nok galt :)
Avatar billede pnr Nybegynder
28. juni 2010 - 15:40 #9
Har prøvet følgende, men det rendere ikke noget:

  <xsl:if test="position() != 1">
                                <xsl:value-of select="$skema/node()[position() = (position()-1)]/StartTime"></xsl:value-of>
                            </xsl:if>
Avatar billede jokkejensen Novice
28. juni 2010 - 20:12 #10
Har du ikke mulighed for at sende over en privat besked, et udpluk af det xml, gerne en 10-15 <TimetableEvent>'s

Så skal jeg nok lige få det til at virke. Er det msxml ?
Avatar billede pnr Nybegynder
29. juni 2010 - 07:45 #11
Sendt :-)
Avatar billede pnr Nybegynder
30. juni 2010 - 08:10 #12
Har du haft tid til at kigge på det?
Avatar billede pnr Nybegynder
04. august 2010 - 07:19 #13
lukker.
Avatar billede pnr Nybegynder
04. august 2010 - 07:19 #14
prøver lige igen :-)
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