xsl:for-each

Tags:    xml

Jeg har en xsl:for each, som indeholder 2x "xsl:value-of select". Problemet er at de så viser alle elementer i min xml.
De skal kun vise de elementer som passer til en xsl:template

Anyone?!

Fold kodeboks ind/udKode 


Problemet er at resultatet er @ID og @name på alle med attribut ID og name under DETAILS.
Men det skal kun være dem under COMM_SITUATION[1]

Jeg ved godt at jeg kan definere det i min xsl:for-each.
Men det bliver jo i så fald til en hel del dobbeltkonfekt, hvis jeg skal angive det hver gang...

Kan nogen hjælpe?



10 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Det er garanteret fordi din foreach fanger nogle participants på nogle lavere niveauer...

Kort sagt, der er noget der ikke er afgrænset på i din XSLT, den fanger for mange noder. :-)


AAArrgghhh... husk lige at sætte en / foran din template match :-) dvs: match="/.....blabla"



Indlæg senest redigeret d. 01.05.2006 15:54 af Bruger #2730
Kan vi få lov til at se noget XML?



Kan vi få lov til at se noget XML?


Den ser sådan her ud:


Fold kodeboks ind/udKode 

Det er en stor XML med en masse kommunikation situationer.
Se <COMM_SITUATION ID="1"> (de er alle opbygget på samme måde)

Det jeg ønsker er at have en XSL hvori jeg ved at ændre et enkelt tal i en template, kan få XSL'en til at vise en komm.situation. Altså hvis jeg erstatter 1 med 2, vil komm.sit. 2 vises istedet for 1 :o)

Problemet ligger så i når jeg bruger en xsl:for-each. Den henter jo data fra alle COMM_SITUATION ID:


Fold kodeboks ind/udKode 


Og ja - jeg kan blot ændre xsl:for-each til:
Fold kodeboks ind/udKode 

- men så skal jeg gøre det alle steder hvor jeg bruger xsl:for-each...



Indlæg senest redigeret d. 01.05.2006 14:18 af Bruger #9872
prøv det her:

<xsl:template match="ROOT_COMM/COMM_SITUATION[1]">
<xsl:for-each select="DETAILS/PARTICIPANTS/SPEAKER">
<xsl:value-of select="@ID"/> -
<xsl:value-of select="@name"/>
</xsl:for-each>
</xsl:template>



prøv det her:

<xsl:template match="ROOT_COMM/COMM_SITUATION[1]">
<xsl:for-each select="DETAILS/PARTICIPANTS/SPEAKER">
<xsl:value-of select="@ID"/> -
<xsl:value-of select="@name"/>
</xsl:for-each>
</xsl:template>


Det giver desværre ingenting.
Heller ikke hvis jeg inkluderer referencen a: (fra XMLNS) før alle elementerne...

Fold kodeboks ind/udKode 



Øv Bøv ...



Indlæg senest redigeret d. 01.05.2006 14:57 af Bruger #9872
hmm... det lyder mystisk.... Det skal bare virke... det er ikke så vanskeligt, som jeg kan se det er der ingenting i vejen med mine X-Path expressions, de matcher din XML. Prøv at fjern dit namespace... er det ikke overflødigt i det her tilfælde?

prøv eventuelt at fjern [1] fra situation og se om du så får alle dine situations

Eller prøv at lav[1] til [0], i tilfælde af den er 0 indekseret ;-)







Indlæg senest redigeret d. 01.05.2006 15:12 af Bruger #2730
hmm... det lyder mystisk.... Det skal bare virke... det er ikke så vanskeligt, som jeg kan se det er der ingenting i vejen med mine X-Path expressions, de matcher din XML. Prøv at fjern dit namespace... er det ikke overflødigt i det her tilfælde?

prøv eventuelt at fjern [1] fra situation og se om du så får alle dine situations

Eller prøv at lav[1] til [0], i tilfælde af den er 0 indekseret ;-)



Det blev det ikke mindre mærkeligt af.
Min XSL ser således ud:
Fold kodeboks ind/udKode 


Og så viser den rigtigt nok alle SPEAKER @ID - @name
Men men ...
Hvis jeg skriver [1] efter COMM_SITUATION, får jeg ALLE (ikke kun SPEAKER) informationer fra COMM_SITUATION 1

(Det gør jeg faktisk ikke. Den viser en masse information i - hvad der umiddelbart ser ud til at være - blandet rækkefølge. SPEAKER name og ID fra COMM 1, FILENAME fra COMM 2, DATA fra COMM 2 ...

:roll:



Indlæg senest redigeret d. 01.05.2006 15:37 af Bruger #9872
Det er garanteret fordi din foreach fanger nogle participants på nogle lavere niveauer...

Kort sagt, der er noget der ikke er afgrænset på i din XSLT, den fanger for mange noder. :-)


AAArrgghhh... husk lige at sætte en / foran din template match :-) dvs: match="/.....blabla"


Tjaeh ... "match="/ ... " ændrer ikke noget!

Det var da som syv sørens!!!




Nå ... måske jeg skal forsøge at gøre det på en anden måde...

Jeg kan simpelthen ikke få det til at virke.

Er der en anden måde, hvorpå jeg kan "ændre"
Fold kodeboks ind/udKode 

- til

Fold kodeboks ind/udKode 
(se [1]/[6])
- uden at skulle lave en søg og erstat hver gang jeg skal bruge den ene frem for den anden?

Kan man ændre disse værdier vha. en selektion måske combo, dropdown, radio .. etc.







Nå .. meget underligt.
Men nu virker det :o)

Jeg lagde en <xsl:for-each select="a:ROOT_COMM/a:COMM_SITUATION"> og vupti.

Så det lykkedes ved at droppe "template"



t