2017-01-31 21 views
1

我試圖從xml源中轉換輸出,如圖所示。我試圖顯示XSLT-將具有小結構的重複元素列表轉換爲有序列表

輸入:

<products> 
    <name>bananas</name> 
    <price>3.55</price> 
    <sku>1223-777-93222</sku> 
    <name>pineapple</name> 
    <price>1.25</price> 
    <sku>013-144-9355</sku> 
</products> 

預期輸出:

<orders> 
    <order> 
    <name>bananas</name> 
    <price>3.55</price> 
    <item-number>1223-777-93222</item-number> 
    </order> 
    <order> 
    <name>pineapple</name> 
    <price>1.25</price> 
    <item-number>013-144-9355</item-number> 
    </order> 
    </orders> 

XSLT:

 <xsl:choose> 
     <xsl:when test="name"> 
     <order> 
     <name><xsl:value-of select="."/> 
     </xsl:when> 
     <xsl:when test="price"> 
     <price><xsl:value-of select="."/></price> 
     </xsl:when> 
     <xsl:when test="sku"> 
     <item-number><xsl:value-of select="."/></price></item-number> 
     </order> 
     <xsl:when> 
     <xsl:otherwise> 
     </orders> 
     </xsl:otherwise> 

但是,我無法得到它的工作。它不打印我所期望的。我希望在轉換輸出方面有所幫助。

請幫忙,謝謝

+0

你能解釋一下什麼是預期的輸出? – potame

+0

這是什麼預期: 香蕉 3.55 1223-777-93222 菠蘿 1.25 013-144-9355 BreenDeen

+0

你的代碼甚至不應該加載。 XSL必須是格式良好的XML,您不能在xsl:otherwise標籤內關閉訂單標籤。 XSL必須使用遞歸而不是迭代或線性邏輯。 – Mike

回答

0

既然你已經標記了問題XSLT 2.0,您可以使用xsl:for-each-groupgroup-starting-with ...

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*"> 
    <orders> 
     <xsl:for-each-group select="*" group-starting-with="name"> 
     <order> 
      <xsl:apply-templates select="current-group()"/> 
     </order> 
     </xsl:for-each-group> 
    </orders> 
    </xsl:template> 

    <xsl:template match="sku"> 
    <item-number> 
     <xsl:apply-templates/> 
    </item-number> 
    </xsl:template> 

</xsl:stylesheet> 

編輯:沒注意你不想改變sku的輸出。

+0

非常感謝! – BreenDeen

0

假設你輸入規則(即每個項目由完全相同的三個要素爲代表,以相同的順序),你可以簡單地做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/products"> 
    <orders> 
     <xsl:for-each select="name"> 
      <order> 
       <xsl:copy-of select=". | following-sibling::price[1]"/> 
       <item-number> 
        <xsl:value-of select="following-sibling::sku[1]"/> 
       </item-number> 
      </order> 
     </xsl:for-each> 
    </orders> 
</xsl:template> 

</xsl:stylesheet> 
相關問題