2017-01-31 10 views
1

Ich versuche, Ausgabe von einer Quelle von XML wie abgebildet zu transformieren.XSLT- Transformieren einer Liste von sich wiederholenden Elementen mit wenig Struktur in geordnete Liste

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

Erwartete Ausgabe:

<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: Mein Versuch ist

Eingang gezeigt

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

Allerdings konnte ich es nicht bekommen zu arbeiten. Es druckt nicht, was ich erwarte. Ich würde etwas Hilfe bei der Umwandlung der Ausgabe schätzen.

Bitte helfen, danke

+0

Können Sie erklären, Was ist die erwartete Ausgabe? Diese – potame

+0

ist das, was erwartet wird: Bananen 3,55 1223-777-93222 Ananas 1,25 013-144-9355 BreenDeen

+0

Ihr Code sollte nicht einmal geladen werden. XSL muss wohlgeformtes XML sein, und Sie können ein Bestell-Tag nicht innerhalb eines xsl: sonst-Tags schließen. XSL muss Rekursion anstelle von iterativer oder linearer Logik verwenden. – Mike

Antwort

0

Da Sie Ihre Frage XSLT 2.0 mit Tags versehen haben, können Sie xsl:for-each-group und group-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> 

EDIT verwenden können: Didn Beachten Sie, dass Sie die Ausgabe von sku ändern möchten.

+0

Vielen Dank, sehr geschätzt! – BreenDeen

0

Angenommen, Ihre Eingabe regelmäßig (dh jedes Element durch genau die gleichen drei Elemente dargestellt wird, in der gleichen Reihenfolge), können Sie einfach:

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