2016-07-21 6 views
0

Ich habe einige XML, die ich mit XSL restrukturieren bin versucht. Ich bin zu XSL ziemlich neu, also würde jede mögliche Hilfe geschätzt.Wie mit XSL mehrere XML-Einträge in einen Baum verschmelzen

Mein aktueller XML ist zur Zeit für mich wie dieses gegeben.

<catalogItem> 
    <partNumber>114-0015</partNumber> 
    <itemName>This is Item 1</itemName> 
    <price>$5.69</price> 
</catalogItem> 
<catalogItem> 
    <partNumber>114-0016</partNumber> 
    <itemName>This is Sub-item1</itemName> 
    <price>$6.29</price> 
    <parent>114-0015</parent> 
</catalogItem> 
<catalogItem> 
    <partNumber>114-0017</partNumber> 
    <itemName>This is Sub-item2</itemName> 
    <price>$7.29</price> 
    <parent>114-0015</parent> 
</catalogItem> 
<catalogItem> 
    <partNumber>114-0018</partNumber> 
    <itemName>This is Sub-item3</itemName> 
    <price>$8.29</price> 
    <parent>114-0015</parent> 
</catalogItem> 

Ich frage mich, ob es möglich ist, sie zu restrukturieren, so dass jede CatalogItem mit einem übergeordneten Tag in eine XML-Baumstruktur erhält eingeführt würde. Beachten Sie, dass das übergeordnete Tag mit der Teilenummer dieses übergeordneten Elements übereinstimmt. So würde meine letzte Ausgabe sein:

<catalogItem> 
    <partNumber>114-0015</partNumber> 
    <itemName>This is Item 1</itemName> 
    <price>$5.69</price> 
    <subitem> 
    <subPartNumber>114-0016</subPartNumber> 
    <subItemName>This is Sub-item1</subItemName> 
    <subPrice>$6.29</subPrice> 
    </subitem> 
    <subitem> 
    <subPartNumber>114-0017</subPartNumber> 
    <subItemName>This is Sub-item2</subItemName> 
    <subPrice>$7.29</subPrice> 
    </subitem> 
    <subitem> 
    <subPartNumber>114-0018</subPartNumber> 
    <subItemName>This is Sub-item3</subItemName> 
    <subPrice>$8.29</subPrice> 
    </subitem> 
</catalogItem> 

Könnte jemand bitte mich in die richtige Richtung (hoffentlich einige Code-Beispiele zur Verfügung stellen), die mir helfen würde, aus. Danke!

EDIT: Ich bin auch meine aktuelle Xslt einschließlich, dass ich einige andere Transformationen zu tun bin mit.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
<dataroot> 
    <xsl:for-each select="dataroot/catalogItem"> 
    <catalogItem> 
    <xsl:if test="not(partNumber)"><Intro> 
     <xsl:if test="not(partNumber)"><itemNameIntro><xsl:value-of select="itemName"/></itemNameIntro></xsl:if> 
     <xsl:if test="not(partNumber)"><longDescriptionIntro><xsl:value-of select="longDescription"/></longDescriptionIntro></xsl:if> 
     </Intro></xsl:if> 
     <xsl:copy-of select="photo1"/> 
     <xsl:copy-of select="categoryType"/> 
     <xsl:copy-of select="bookSeries"/> 
     <xsl:copy-of select="photo2"/> 
     <xsl:copy-of select="photo3"/> 
     <xsl:copy-of select="photo4"/> 
     <xsl:copy-of select="logo"/> 
     <xsl:if test="partNumber"><itemName><xsl:value-of select="itemName"/></itemName></xsl:if> 
     <xsl:copy-of select="author"/> 
     <xsl:if test="partNumber"><longDescription><xsl:value-of select="longDescription"/></longDescription></xsl:if> 
     <xsl:if test="size1"> 
     <size1><xsl:value-of select="size1"/><xsl:if test="size1 and size2"> | </xsl:if></size1> 
     </xsl:if> 
     <xsl:copy-of select="size2"/> 
     <xsl:if test="age"> 
     <age><xsl:if test="size1 and age or size2 and age"> | </xsl:if>age: <xsl:value-of select="age"/></age> 
     </xsl:if> 
     <xsl:if test="numberPages"> 
     <numberPages><xsl:value-of select="numberPages"/>p </numberPages> 
     </xsl:if> 
     <xsl:copy-of select="partNumber"/> 
     <xsl:if test="price"> 
     <pricetab> $</pricetab> 
     </xsl:if> 
     <xsl:if test="price"> 
     <price><xsl:value-of select="price"/></price> 
     </xsl:if> 
    </catalogItem> 
    </xsl:for-each> 
</dataroot> 

+0

Da die 'catalogItem' mit' 114-0018 '' hat 114-0016 ', verstehe ich nicht das gewünschte Ergebnis gebucht haben. –

+0

Mein schlechtes. Ich habe es repariert. Es sollte 114-0015 – user6621322

Antwort

0

Ihre "aktuelle XML" ist alles andere XML, da es kein einziges Wurzelelement hat.

einen wohlgeformten XML-Eingangs Gegeben wie:

<catalog> 
    <catalogItem> 
    <partNumber>114-0015</partNumber> 
    <itemName>This is Item 1</itemName> 
    <price>$5.69</price> 
    </catalogItem> 
    <catalogItem> 
    <partNumber>114-0016</partNumber> 
    <itemName>This is Sub-item1</itemName> 
    <price>$6.29</price> 
    <parent>114-0015</parent> 
    </catalogItem> 
    <catalogItem> 
    <partNumber>114-0017</partNumber> 
    <itemName>This is Sub-item2</itemName> 
    <price>$7.29</price> 
    <parent>114-0015</parent> 
    </catalogItem> 
    <catalogItem> 
    <partNumber>114-0018</partNumber> 
    <itemName>This is Sub-item3</itemName> 
    <price>$8.29</price> 
    <parent>114-0015</parent> 
    </catalogItem> 
</catalog> 

folgendes Sheet:

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:key name="child" match="catalogItem" use="parent" /> 

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

<xsl:template match="/catalog"> 
    <xsl:copy> 
     <xsl:apply-templates select="catalogItem[not(parent)]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="catalogItem"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
     <xsl:apply-templates select="key('child', partNumber)" mode="sub"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="catalogItem" mode="sub"> 
    <subitem> 
    <subPartNumber> 
     <xsl:value-of select="partNumber"/> 
    </subPartNumber> 
    <subItemName> 
     <xsl:value-of select="itemName"/> 
    </subItemName> 
    <subPrice> 
     <xsl:value-of select="price"/> 
    </subPrice> 
    </subitem> 
</xsl:template> 

</xsl:stylesheet> 

kehrt:

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <catalogItem> 
     <partNumber>114-0015</partNumber> 
     <itemName>This is Item 1</itemName> 
     <price>$5.69</price> 
     <subitem> 
     <subPartNumber>114-0016</subPartNumber> 
     <subItemName>This is Sub-item1</subItemName> 
     <subPrice>$6.29</subPrice> 
     </subitem> 
     <subitem> 
     <subPartNumber>114-0017</subPartNumber> 
     <subItemName>This is Sub-item2</subItemName> 
     <subPrice>$7.29</subPrice> 
     </subitem> 
     <subitem> 
     <subPartNumber>114-0018</subPartNumber> 
     <subItemName>This is Sub-item3</subItemName> 
     <subPrice>$8.29</subPrice> 
     </subitem> 
    </catalogItem> 
</catalog> 
+0

Entschuldigung sein. Ich hätte mein Wurzelelement einfügen sollen. Ich habe es. Ich hatte es gerade nicht für diese Probe aufgenommen. – user6621322

+0

@ user6621322 Wurde Ihre Frage beantwortet? –

+0

versuche ich es in meinem XML hier zu arbeiten. Ich werde dich wissen lassen, sobald ich es hier aussortiert habe. – user6621322