Avatar billede hrasbo Praktikant
24. maj 2011 - 12:11 Der er 9 kommentarer og
1 løsning

for-each i en for-each

Hej
Har dette xml

<group name="xx">
<product>
</prodcut>
<product>
</prodcut>
<group>

<group name="xxx">
<product>
</prodcut>
<product>
</prodcut>
<group>

der har jeg lavet denne kode (pseudo):

<foreach select=group>

<foreach select=product>

</foreach>

</foreach>

Hvis jeg kun har en group i xml dokumentet så virker det, men ikke ved flere?
Avatar billede softspot Forsker
24. maj 2011 - 12:58 #1
Hvordan ser din faktiske xslt til dette ud?

Det er lettere at forholde sig til den konkrete kode som ikke fungerer, frem for en pseudokode der umiddelbart burde fungere...
Avatar billede hrasbo Praktikant
24. maj 2011 - 15:20 #2
<xsl:template match="/">
  <PRODUCT_EXPORT type="PRODUCTS">
  <ELEMENTS>

<xsl:for-each select="group">
<xsl:for-each select="product">

<PROD_NUM><xsl:value-of select="@id"/></PROD_NUM>

</xsl:for-each>
</xsl:for-each>

      </ELEMENTS>
</PRODUCT_EXPORT>

</xsl:template>

Der er meget mere kode inde i for-each for product, men det skulle jo stadigvæk virke.
Avatar billede softspot Forsker
24. maj 2011 - 15:51 #3
Hvis du alene udfører den stump kode du har vist her, fejler det så stadig?

Hvis nej, så er du jo nok nød til at vide noget mere kode, da det så ikke er her problemet ligger... :-)

Hvis du blot skal generere en flad liste af PROD-elementer, kunne du vel nøjes ned en for-each-løkke:

<xsl:template match="/">
<PRODUCT_EXPORT type="PRODUCTS">
  <ELEMENTS>

  <xsl:for-each select="group/product">

    <PROD_NUM><xsl:value-of select="@id"/></PROD_NUM>

  </xsl:for-each>

  </ELEMENTS>
</PRODUCT_EXPORT>

</xsl:template>
Avatar billede hrasbo Praktikant
25. maj 2011 - 09:32 #4
Her fejler den:
<xsl:template match="/">
  <PRODUCT_EXPORT type="PRODUCTS">
  <ELEMENTS>
    <xsl:for-each select="group">
    <xsl:for-each select="product">
  <PRODUCT>
    <GENERAL>
    <PROD_NUM><xsl:value-of select="@id"/></PROD_NUM>

    </GENERAL>

    </PRODUCT>
    </xsl:for-each>
  </xsl:for-each>


      </ELEMENTS>
</PRODUCT_EXPORT>

</xsl:template>
Avatar billede softspot Forsker
25. maj 2011 - 11:52 #5
Når du skriver den fejler, hvad er det så helt konkret for en besked du får (eller hvad sker der)?

Jeg har lavet et lille eksperiment med de oplysninger du har givet mig her og når jeg laver flg. rettelser og tilføjelser i XML-strukturen, samt rettelser i XSL-filen, kører XSLT'en uden der opstår nogle fejl (rettelser er fremhævet med fed skrift):

test.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<groups>

  <group name="xx">
    <product id="1">
    </product>
    <product id="2">
    </product>
  </group>

  <group name="xxx">
    <product id="3">
    </product>
    <product id="4">
    </product>
  </group>
</groups>

Som du kan se har jeg rettet stavefejlen i lukningen af product-elementerne, samt tilføjet "stilladskode", så eksemplet kan fungere selvstændigt.

test.xsl:
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">
<PRODUCT_EXPORT type="PRODUCTS">
  <ELEMENTS>
    <xsl:for-each select="//group">
    <xsl:for-each select="product">
    <PRODUCT>
      <GENERAL>
        <PROD_NUM><xsl:value-of select="@id"/></PROD_NUM>
      </GENERAL>
    </PRODUCT>
    </xsl:for-each>
  </xsl:for-each>
  </ELEMENTS>
</PRODUCT_EXPORT>
</xsl:template>

</xsl:stylesheet>

I XSLT'en har jeg ligeledes tilføjet "stilladskode", samt foranstillet group med dobbeltskråstreg, for at angive en global match af group-elementer i XML-strukturen (dvs. der matches på alle niveauer i hierarkiet). Du kan evt. selv foranstille en absolut/mere specifik sti til group-elementerne der skal itereres, hvis det globale match ikke er hensigtsmæssigt...

Hvis der er noget du ikke forstår i mit eksempel, spørger du bare :-)
Avatar billede hrasbo Praktikant
25. maj 2011 - 12:29 #6
Den fejler på den måde at den kun viser product_export og elements i det nye xml dokument.
Avatar billede softspot Forsker
25. maj 2011 - 14:15 #7
OK, så prøv at foranstille group med //, som i mit eksempel. Det burde i det mindste finde nogle grupper der kan itereres over...

Ændrer du på XML-dokumentets struktur (tilføjer du et rodelement), når XML-dokumentet indeholder flere grupper?

Kan du evt. prøve at vise et mere komplet XML-dokument, så strukturen bliver helt tydelig? Det er lidt svært at hjælpe dig  effektivt, når du holder informationerne så tæt til kroppen... :-)
Avatar billede hrasbo Praktikant
25. maj 2011 - 21:06 #8
Fejlen er fundet.

Da det xml dokument, som jeg skulle konveret havde over 50000 linier, så havde jeg taget en lille brøkdel ud.
Her havde jeg glemt et sluttag til allersidst.

Så nu virker det.

Tak for hjælpen
Avatar billede softspot Forsker
25. maj 2011 - 22:16 #9
Velbekomme :-)
Avatar billede softspot Forsker
23. juni 2011 - 08:51 #10
Øøh, det er normal kotume at man giver point til dem der hjælper og ikke til sig selv... :-/
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

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