首页 > 解决方案 > 使用 XSLT 进行 XML 转换

问题描述

我有这个 XML,我需要使用其中的一些信息进行转换。它具有复杂的 XML。所以我迷失了一些循环......如果有人可以看看会很好。所以我需要改造:

  1. 条形码(在原始 XML 中位于 /PRODUCTS/ITEM/GOODS/ITEM/EAN 元素中)

  2. 图片(在原始 XML 中位于 /IMAGES/ITEM/URL 元素中)

  3. 名称(在原始 XML 中它位于 /PRODUCTS/ITEM/TITLE 元素中)所以我想我可以通过 /PRODUCTS 循环并选择信息,但我得到的是这些结果结合在一起。有什么想法吗?

    XSLT 源代码:

    <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 源:

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

标签: xmlxslt

解决方案


这是您可以执行此操作的一种方法(如果我正确理解您要执行的操作):

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

看到它在这里工作:https ://xsltfiddle.liberty-development.net/jxNakAu


推荐阅读