Avatar billede mailand Nybegynder
27. maj 2006 - 15:14 Der er 6 kommentarer og
1 løsning

Array til for-each?

Hej

Jeg har en xml-fil med et element, der har følgende data:

<data>1102,1142</data>

Er det muligt at selecte dette indhold, så man kan lave en for-each på dem? A la:

<xsl:for-each select="$array">
  <xsl:call-template name="template"/>
</xsl>


Jeg kan få det til at virke, hvis der kun står et tal i <data>, men det fungerer selvsagt ikke, når der er mere end én værdi, da min for-each så selvfølgelig fejler...

Findes der noget a la split(), hvor man kan spoecifere hvilket element i xml-træet, den skal splitte, og hvilken seperator, der skal vælges?

Jeg håber, der er nogen, der kan hjælpe...


#Mailand
Avatar billede softspot Forsker
27. maj 2006 - 16:45 #1
Den slags funktionalitet er lidt mere besværlig i XSLT.

En måde at løse det på er med rekursion og brugen af funktionen substring-before(). Så kan du nappe strengen inden komma og bruge den værdi, hvorefter du kalder funktionen igen med resten af strengen som parameter (overraskende nok hedder den funktion som finder resten af strengen substring-after() ;-))...

dvs. du kan ende med noget i denne stil:

<xsl:template name="splitvalue">
  <xsl:param name="rest" />
 
  <xsl:if test="string-length($rest) &gt; 0">
    <!-- kald den funktion som skal kaldes med værdien -->
    <xsl:call-template name="template">
      <xsl:with-param name="value" select="substring-before($rest,',')" />
    </xsl:call-template>

    <!-- foretag det rekursive kald for at få den næste værdi -->
    <xsl:call-template name="splitvalue">
      <xsl:with-param name="rest" select="substring-after($rest,',')" />
    </xsl:call-template>
  </xsl:if>
</xsl:template>
Avatar billede mailand Nybegynder
27. maj 2006 - 17:57 #2
ok - interessant. jeg kan ikke helt få dit eksempel til at virke.

jeg laver følgende:

<xsl:template match="/">
    <xsl:if test="$additionals != ''">
        <div class="assets">
           
                <xsl:call-template name="splitvalue">
                    <xsl:with-param name="rest" select="$additionals"/>
                </xsl:call-template>           
           
        </div>
    </xsl:if>
</xsl:template>



<xsl:template name="splitvalue">
    <xsl:param name="rest" />
   
    <xsl:if test="string-length($rest) &gt; 0">
   
       
        <p><xsl:value-of select="substring-before($rest,',')"/></p>
       
        <xsl:call-template name="splitvalue">
            <xsl:with-param name="rest" select="substring-after($rest,',')" />
        </xsl:call-template>
   
    </xsl:if>
</xsl:template>



$additionals indeholder:
1146,1144,1145


når jeg kører ovenstående, returneres der kun:
<p>1146</p>
<p>1144</p>


hvad gør jeg galt?


#Mailand
Avatar billede mailand Nybegynder
27. maj 2006 - 18:21 #3
med dette 'hack' virker - jeg er ikke sikker på, jeg ved hvorfor...

<xsl:template name="splitvalue">
    <xsl:param name="rest" />
   
    <xsl:if test="string-length($rest) &gt; 0">

        <p>
            <xsl:choose>
                <xsl:when test="substring-before($rest,',') != ''">
                    <xsl:value-of select="substring-before($rest,',')"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="$rest"/>
                </xsl:otherwise>
            </xsl:choose>
        </p>
               
        <xsl:call-template name="splitvalue">
            <xsl:with-param name="rest" select="substring-after($rest,',')" />
        </xsl:call-template>
   
    </xsl:if>
</xsl:template>
Avatar billede mailand Nybegynder
27. maj 2006 - 19:21 #4
softspot: smid et svar...

min løsning fungerer nu :-)
Avatar billede softspot Forsker
27. maj 2006 - 23:28 #5
Du må undskylde at jeg ikke har været til meget hjælp her til aften, men har lige været til noget familietamtam. Det er godt at se du er kommet frem til en løsning trods alt :)

Jeg tror dit hack fungerer fordi substring-before() skal bruge et positivt index at klippe strengen efter og hvis du er ved sidste id i strengen, så er der ikke noget komma og index på den den skal klippe ved er ikke større end 0 (eller hvilken værdi substring-before nu antager, hvis den ikke kan finde stopkriteriet). Godt tænkt! :)
Avatar billede softspot Forsker
28. maj 2006 - 00:52 #6
Tak for point :)
Avatar billede mailand Nybegynder
28. maj 2006 - 00:52 #7
det er helt fair - det er jo principielt det, lørdagen skal bruges til... snarere end at sidde foran computeren og tumle med xslt.

- men nu blev det løst... dejligt - og tak for hjælpen.

Andreas
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