Avatar billede alsvik Nybegynder
01. maj 2006 - 13:35 Der er 14 kommentarer og
1 løsning

"xsl:for-each"

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?!
____________________________

<xsl:template match="a:ROOT_COMM/a:COMM_SITUATION[1]/@ID">

<xsl:for-each select="a:ROOT_COMM/a:COMM_SITUATION/a:DETAILS">
<xsl:value-of select="@ID"/> -
<xsl:value-of select="@name"/>
_____________________________

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?
Avatar billede ladyhawke Novice
01. maj 2006 - 14:38 #1
Kan du ikke bruge følgende:
<xsl:for-each select="a:ROOT_COMM/a:COMM_SITUATION[1]/a:DETAILS">
Avatar billede ladyhawke Novice
01. maj 2006 - 15:23 #2
eller måske <xsl:for-each select="../a:DETAILS">

(har ikke testet den)
Avatar billede alsvik Nybegynder
01. maj 2006 - 16:08 #3
Joeh - men så skl jeg no netop gentage [1] i alle mine for-each...

Det jeg gerne ville var at oprette en eller an mere global template hvori jeg kunne definere at den kun skal benytte COMM_SITUATION[1]
- sådan at hvis jeg senere skal have vist en anden COMM_SITUTATION, at jeg blot kan ændre tallet 1 sted!
Avatar billede ladyhawke Novice
01. maj 2006 - 16:29 #4
kan du ikke bruge noget a la det jeg skrev 15:23?

I den nuværende for-each select'er du globalt, altså gentager det samme som din template. Kan du ikke komme med et eksempel på din XML, så kan jeg prøve om jeg kan lave den lokal i forhold til din template...
Avatar billede alsvik Nybegynder
01. maj 2006 - 16:42 #5
<ROOT_COMM>
<COMM_SITUATION ID="1">
<DETAILS>
<PARTICIPANTS>
<SPEAKER ID="0" name="Flemming Rose"/>
<SPEAKER ID="1" name="Abu Laban"/>
<SPEAKER ID="2" name="Hardtalk, Interviewer"/>
</PARTICIPANTS>
</DETAILS>
<COMM_SITUATION ID="2">
<DETAILS>
<PARTICIPANTS>
<SPEAKER ID="3" name="Bjørn Lomborg"/>
<SPEAKER ID="4" name="Per Stig Møller"/>
<SPEAKER ID="5" name="TV2, Interviewer"/>
</PARTICIPANTS>
</DETAILS>
...
Avatar billede alsvik Nybegynder
01. maj 2006 - 16:42 #6
Hov - og tak :o)
Avatar billede alsvik Nybegynder
01. maj 2006 - 19:46 #7
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"
<xsl:for-each select="ROOT_COMM/COMM_SITUATION[6]/DETAILS/PARTICIPANTS/SPEAKER">
- til
<xsl:for-each select="ROOT_COMM/COMM_SITUATION[1]/DETAILS/PARTICIPANTS/SPEAKER">
(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.
Avatar billede ladyhawke Novice
02. maj 2006 - 08:27 #8
I hvilken sammenhæng bruger du din xml? ellers er det lidt svært at sige hvordan du skal lave en valgmulighed...

Og hvad gør den hvis du benytter indlægget fra 15:23 i går?
Avatar billede alsvik Nybegynder
02. maj 2006 - 13:41 #9
Den giver slet ikke noget!

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

= ingenting...

Min XML er som jeg har angivet 01/05-16:42
- og det jeg ønsker er en XSL som kan vise alle under-elementer under COMM_SITUATION for hver COMM_SITUATION. F.eks:

Comm. id: 1
Participants:
  0 - Flemmeing Rose
  1 - Abu Laban
  2 - Hardtalk, Interviewer

Comm. id: 2
Participants:
  0 - Bjørn Lomborg
  1 - Per Stig Møller
  2 - TV2, Interviewer

...

Bemærk at der er mange elementer af COMM_SITUATION med hver deres ID.
De skal grupperes så hver enkelt vises hver for sig.
Og det nytter desværre ikke noget at lave en XSl med COMM_SITUATION[1] - da XML'en skifter antal af COMM_SITUATION hele tiden...
Jeg vil meget gerne vise dig et større uddrag af XML'en. Det vil måske hjælpe?!
Avatar billede alsvik Nybegynder
02. maj 2006 - 13:58 #10
Det er lidt underligt. Denne her:

    <xsl:for-each select="a:ROOT_COMM/a:COMM_SITUATION/@ID">
    <xsl:value-of select="../a:DETAILS/a:PARTICIPANTS/a:SPEAKER/@ID"/>
    <xsl:value-of select="../a:DETAILS/a:PARTICIPANTS/a:SPEAKER/@name"/>

- viser kun den første SPEAKER i hver COMM_SITUATION :o(
Avatar billede alsvik Nybegynder
02. maj 2006 - 14:31 #11
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"
Avatar billede alsvik Nybegynder
02. maj 2006 - 14:34 #12
Hvordan lukker jeg tråden ?!
Avatar billede alsvik Nybegynder
02. maj 2006 - 14:35 #13
UPS ... Så fik jeg lige mine egne point. De skulle naturligvis være gået til LadyHawke for hjælpen!
Avatar billede ladyhawke Novice
03. maj 2006 - 09:54 #14
du kan bare oprette et nyt spørgsmål med emnet "Point til ladyhawke" (eller hvem ellers du mener skulle have point i et spørgsmål) og med en henvisning til dette spørgsmål...

Når du vil uddele point beder du om svar fra dem du mener har hjulpet dig, hvis de ikke allerede har lagt et svar og så fordeler du point til dem og vælger accepter...
Avatar billede Slettet bruger
03. maj 2006 - 12:14 #15
Bedre sent end aldrig... for mig ser det ud som om du griber det helt forkert an.

Prøv lige at se denne simplificering (mangler bl.a. namespaces):

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

    <xsl:output method="xml" indent="yes" encoding="UTF-8" />
   
    <xsl:template match="/">
        <html>
        <head>
            <title>Eksperten #706477</title>
        </head>
        <body>
            <xsl:apply-templates />
        </body>
        </html>
    </xsl:template>
   
    <xsl:template match="COMM_SITUATION">
        <h2>Comm. id: <xsl:value-of select="@ID" /></h2>
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="PARTICIPANTS">
        <ul style="list-style-type: none;">
            <xsl:apply-templates select="SPEAKER" />
        </ul>
    </xsl:template>

    <xsl:template match="SPEAKER">
        <li><xsl:value-of select="concat(@ID, ' - ', @name)" /></li>
    </xsl:template>
   
</xsl:stylesheet>

Sådan ville jeg sætte det op for at få dit ønskede output.

/CS
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