0
votes

I have this XML that I need to transform with some the info from it. Its quet complex XML. So I lost in some loops... If someone could take a look would be nice. So what I need to transform:

  1. Barcode(in orignal XML it's in /PRODUCTS/ITEM/GOODS/ITEM/EAN element)

  2. Images(in orignal XML it's in /IMAGES/ITEM/URL element)

  3. Name(in orignal XML it's in /PRODUCTS/ITEM/TITLE element) So I thought I could loop trhough /PRODUCTS and just pick the info, but what I get was these results combined together. Any thoughts?

    XSLT source:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
        xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">  
        <xsl:output method="xml" indent="yes" encoding="utf-8" />  
        <xsl:template match="/">  
      
    <root>
    <Products>
      <xsl:for-each select="//PRODUCTS/ITEM/GOODS/ITEM">
        <Product>
            <Product_id></Product_id>
            <SKU></SKU>
              <Barcode>
                  <xsl:for-each select="//PRODUCTS/ITEM/GOODS/ITEM">
                  <xsl:value-of select="EAN"/>
                  </xsl:for-each>
              </Barcode>
            <Name><xsl:value-of select="TITLE"/></Name>
            <Description><xsl:value-of select="TECHNICAL_INFO"/></Description>
          <Images><xsl:for-each select="//IMAGES/ITEM">
              <Image><xsl:value-of select="URL"/></Image>
            </xsl:for-each>
          </Images>
            <Units></Units>
            <Price></Price>
            <Currency>EUR</Currency>
            <Inventory_count></Inventory_count>
            <Note></Note>
            <Group1>STD.</Group1>         
        </Product>
      </xsl:for-each>
    </Products>
    </root>
    
        </xsl:template>  
    </xsl:stylesheet>
    

XML source:

> <?xml version="1.0" encoding="utf-8"?>  <PRODUCTS>
> 
> <ITEM> <TYPE>nabytek</TYPE> <TITLE>Spintelė po praustuvu Formy</TITLE>
> <DESCRIPTION>80/100/120 x 55 x 22 cm dydžio</DESCRIPTION>
> <URL>https://www.ravak.lt/lt/spintele-po-praustuvu-formy</URL>
> <CATEGORY>Vonios kambario baldai Formy</CATEGORY>
> <SCHEME>https://www.ravak.cz/img/_/sd-formy/tn_sd-formy.jpg</SCHEME>
> <TECHNICAL_INFO><ul> <li>dydis (pxgxa): 80/100/120 x 55 x 22 cm</li>
> <li>medžiaga: MDF</li> <li>spalva: lakuota balta / ąžuolo arba riešuto
> imitacijos laminatas</li> <li><a href="img/pageflip/ravak-zaruka/13/"
> target="_blank" rel="noopener">Garantija: 5 metai</a></li> </ul>
> <p>Praustuvo spintelė Formy, montuojama po praustuvu Formy. Spintelė,
> kurios ilgis 80 cm, turi vieną stalčių, spintelė, kurios ilgis 100 ir
> 120 cm – turi su stalčius. Galite rinktis iš šių apdailos variantų:
> lakuotas baltas blizgus arba riešuto / ąžuolo laminatas. Korpusas
> tiekiamas surinktas, įskaitant ir montavimo komplektą (varžtai,
> vyriai, dangteliai). Spintelė tvirtinama prie sienos. Norint sukurti
> vientiso stiliaus vonios kambarį rekomenduojame praustuvo spintelę
> Formy derinti su kitais koncepcijos Formy gaminiais (praustuvu Formy I
> ir Formy II, veidrodžiu Formy, aukšta spintele SB Formy), RAVAK
> maišytuvais ir kitais gaminiais.</p></TECHNICAL_INFO>     <IMAGES>
>   <ITEM>
>   <URL>https://www.ravak.cz/img/_/sd-formy.foto/sd-formy01-bila.jpg</URL>
>   </ITEM>     <ITEM>
>   <URL>https://www.ravak.cz/img/_/sd-formy.foto/sd-formy01-orech.jpg</URL>
>   </ITEM>     </IMAGES>   <GOODS>     <ITEM>  <TITLE>SD Formy 800
> balta</TITLE>     <COLOR>Balta</COLOR>    <EAN>8592626035945</EAN>
>   <PICTURE>https://www.ravak.lt/img/product_pictures/X000001029_big.jpg</PICTURE>
>   </ITEM> </GOODS>     </ITEM> <ITEM>   <TYPE>nabytek</TYPE>  
> <TITLE>Spintelė po praustuvu Formy2</TITLE>   <DESCRIPTION>80/100/120
> x 55 x 22 cm dydžio</DESCRIPTION>  
> <URL>https://www.ravak.lt/lt/spintele-po-praustuvu-formy</URL>  
> <CATEGORY>Vonios kambario baldai Formy</CATEGORY>  
> <SCHEME>https://www.ravak.cz/img/_/sd-formy/tn_sd-formy.jpg</SCHEME>  
> <TECHNICAL_INFO><ul> <li>dydis (pxgxa): 80/100/120 x 55 x 22 cm</li>
> <li>medžiaga: MDF</li> <li>spalva: lakuota balta / ąžuolo arba riešuto
> imitacijos laminatas</li> <li><a href="img/pageflip/ravak-zaruka/13/"
> target="_blank" rel="noopener">Garantija: 5 metai</a></li> </ul>
> <p>Praustuvo spintelė Formy, montuojama po praustuvu Formy. Spintelė,
> kurios ilgis 80 cm, turi vieną stalčių, spintelė, kurios ilgis 100 ir
> 120 cm – turi su stalčius. Galite rinktis iš šių apdailos variantų:
> lakuotas baltas blizgus arba riešuto / ąžuolo laminatas. Korpusas
> tiekiamas surinktas, įskaitant ir montavimo komplektą (varžtai,
> vyriai, dangteliai). Spintelė tvirtinama prie sienos. Norint sukurti
> vientiso stiliaus vonios kambarį rekomenduojame praustuvo spintelę
> Formy derinti su kitais koncepcijos Formy gaminiais (praustuvu Formy I
> ir Formy II, veidrodžiu Formy, aukšta spintele SB Formy), RAVAK
> maišytuvais ir kitais gaminiais.</p></TECHNICAL_INFO>
>     <IMAGES>
>     <ITEM>
>     <URL>https://www.ravak.cz/img/_/sd-formy.foto/sd-formy01-bila.jpg</URL>
>     </ITEM>
>     <ITEM>
>     <URL>https://www.ravak.cz/img/_/sd-formy.foto/sd-formy01-orech.jpg</URL>
>     </ITEM>
>     </IMAGES>
>     <GOODS>
>     <ITEM>
>     <TITLE>SD Formy 1500 balta</TITLE>
>     <COLOR>Balta</COLOR>
>     <EAN>85926260311111</EAN>
>     <PICTURE>https://www.ravak.lt/img/product_pictures/X000001029_big.jpg</PICTURE>
>     </ITEM>
>     </GOODS>   </ITEM> </PRODUCTS>
2
Please post what your expected output is. Most of the time you don't need loops in XSLT.Sebastien
It would be worthwhile to format your XML source too. freeformatter.com/xml-formatter.html or xmllint --format would do.0x6adb015
<xsl:for-each select="//PRODUCTS/ITEM/GOODS/ITEM"> will produce the same items in both loops. Your inner loop needs to use "current()/EAM". That should fix the duplicates.0x6adb015

2 Answers

0
votes

Here's a way you could do this (if I understood properly what you are trying to do):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">  
   
    <xsl:output method="xml" indent="yes" encoding="utf-8" />  
   
    <xsl:template match="/">
        <root>
            <Products>
                <xsl:apply-templates select="PRODUCTS/ITEM"/>
            </Products>
        </root>
    </xsl:template>
    
    <xsl:template match="ITEM">
        <Product>
            <Product_id></Product_id>
            <SKU></SKU>
            <Barcode><xsl:apply-templates select="GOODS/ITEM/EAN"/></Barcode>
            <Name><xsl:value-of select="TITLE"/></Name>
            <Description><xsl:apply-templates select="TECHNICAL_INFO/ul/li"/></Description>
            <Images>
                <xsl:apply-templates select="IMAGES/ITEM/URL"/>
            </Images>
            <Units></Units>
            <Price></Price>
            <Currency>EUR</Currency>
            <Inventory_count></Inventory_count>
            <Note></Note>
            <Group1>STD.</Group1>
        </Product>
    </xsl:template>
    
    <xsl:template match="EAN">
        <xsl:value-of select="."/>
    </xsl:template>
    
    <xsl:template match="li">
        <xsl:value-of select="."/>
    </xsl:template>
    
    <xsl:template match="URL">
        <Image><xsl:value-of select="."/></Image>
    </xsl:template>
    
</xsl:stylesheet>

See it working here : https://xsltfiddle.liberty-development.net/jxNakAu

0
votes

Forgot to post my result. You can see I almost get what i want, but for example Barcode and Images getting dublicated... I need them to be unique. I mean the Name, Description should be the same, but the Barcode and Images should be diferent.

<?xml version="1.0" encoding="utf-8"?>
<root>
  <Products>
    <Product>
      <Product_id />
      <SKU />
      <Barcode>859262603594585926260311111</Barcode>
      <Name>Spintelė po praustuvu Formy</Name>
      <Description> dydis (pxgxa): 80/100/120 x 55 x 22 cm medžiaga: MDF spalva: lakuota balta / ąžuolo arba riešuto imitacijos laminatas Garantija: 5 metai  Praustuvo spintelė Formy, montuojama po praustuvu Formy. Spintelė, kurios ilgis 80 cm, turi vieną stalčių, spintelė, kurios ilgis 100 ir 120 cm – turi su stalčius. Galite rinktis iš šių apdailos variantų: lakuotas baltas blizgus arba riešuto / ąžuolo laminatas. Korpusas tiekiamas surinktas, įskaitant ir montavimo komplektą (varžtai, vyriai, dangteliai). Spintelė tvirtinama prie sienos. Norint sukurti vientiso stiliaus vonios kambarį rekomenduojame praustuvo spintelę Formy derinti su kitais koncepcijos Formy gaminiais (praustuvu Formy I ir Formy II, veidrodžiu Formy, aukšta spintele SB Formy), RAVAK maišytuvais ir kitais gaminiais.</Description>
      <Images>
        <Image>https://www.ravak.cz/img/_/sd-formy.foto/sd-formy01-bila.jpg</Image>
        <Image>https://www.ravak.cz/img/_/sd-formy.foto/sd-formy01-orech.jpg</Image>
        <Image>https://www.ravak.cz/img/_/sd-formy.foto/sd-formy01-bila.jpg</Image>
        <Image>https://www.ravak.cz/img/_/sd-formy.foto/sd-formy01-orech.jpg</Image>
      </Images>
      <Units />
      <Price />
      <Currency>EUR</Currency>
      <Inventory_count />
      <Note />
      <Group1>STD.</Group1>
    </Product>
    <Product>
      <Product_id />
      <SKU />
      <Barcode>859262603594585926260311111</Barcode>
      <Name>Spintelė po praustuvu Formy2</Name>
      <Description> dydis (pxgxa): 80/100/120 x 55 x 22 cm medžiaga: MDF spalva: lakuota balta / ąžuolo arba riešuto imitacijos laminatas Garantija: 5 metai  Praustuvo spintelė Formy, montuojama po praustuvu Formy. Spintelė, kurios ilgis 80 cm, turi vieną stalčių, spintelė, kurios ilgis 100 ir 120 cm – turi su stalčius. Galite rinktis iš šių apdailos variantų: lakuotas baltas blizgus arba riešuto / ąžuolo laminatas. Korpusas tiekiamas surinktas, įskaitant ir montavimo komplektą (varžtai, vyriai, dangteliai). Spintelė tvirtinama prie sienos. Norint sukurti vientiso stiliaus vonios kambarį rekomenduojame praustuvo spintelę Formy derinti su kitais koncepcijos Formy gaminiais (praustuvu Formy I ir Formy II, veidrodžiu Formy, aukšta spintele SB Formy), RAVAK maišytuvais ir kitais gaminiais.</Description>
      <Images>
        <Image>https://www.ravak.cz/img/_/sd-formy.foto/sd-formy01-bila.jpg</Image>
        <Image>https://www.ravak.cz/img/_/sd-formy.foto/sd-formy01-orech.jpg</Image>
        <Image>https://www.ravak.cz/img/_/sd-formy.foto/sd-formy01-bila.jpg</Image>
        <Image>https://www.ravak.cz/img/_/sd-formy.foto/sd-formy01-orech.jpg</Image>
      </Images>
      <Units />
      <Price />
      <Currency>EUR</Currency>
      <Inventory_count />
      <Note />
      <Group1>STD.</Group1>
    </Product>
  </Products>
</root>