Subject: Re: Grouping into a hierarchy
From: "Spencer Tickner" <spencertickner@xxxxxxxxx>
Date: Tue, 11 Dec 2007 11:29:06 -0800
|
Sorry Typo,, you can remove the empty LineItem template.
Cheers,
Spencer
On Dec 11, 2007 11:23 AM, Spencer Tickner <spencertickner@xxxxxxxxx> wrote:
> Hi Tim,
>
> For someone that's been there <xsl:for-each> statements are rarely the
> way to go. The following stylesheet should solve your problem. I left
> it verbose as it may help you follow some of the logic. Also you
> didn't have any attributes in your example but I handled them just in
> case:
>
>
> <?xml version='1.0'?>
> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <xsl:template match="/">
> <xsl:apply-templates/>
> </xsl:template>
>
> <xsl:template match="WorkData">
> <xsl:copy>
> <xsl:copy-of select="@*"/>
> <Orders>
> <xsl:apply-templates/>
> </Orders>
> </xsl:copy>
> </xsl:template>
>
> <xsl:template match="Detail"/>
>
> <xsl:template match="Headers"><xsl:apply-templates/></xsl:template>
>
> <xsl:template match="Header">
> <xsl:variable name="currPO" select="PO_NBR"/>
> <Order>
> <hdr>
> <xsl:apply-templates/>
> </hdr>
> <xsl:if test="/WorkData/Detail/LineItem[PO_NBR = PO_NBR]">
> <LineItems>
> <xsl:apply-templates select="/WorkData/Detail/LineItem[PO_NBR = $currPO]"/>
> </LineItems>
> </xsl:if>
> </Order>
> </xsl:template>
>
> <xsl:template match="LineItem">
>
> </xsl:template>
>
> <xsl:template match="Header/PO_NBR">
> <xsl:copy>
> <xsl:copy-of select="@*"/>
> <xsl:apply-templates/>
> </xsl:copy>
> </xsl:template>
>
> <xsl:template match="Header/PROC_IND">
> <xsl:copy>
> <xsl:copy-of select="@*"/>
> <xsl:apply-templates/>
> </xsl:copy>
> </xsl:template>
>
> <xsl:template match="LineItem">
> <xsl:copy>
> <xsl:copy-of select="@*"/>
> <xsl:apply-templates/>
> </xsl:copy>
> </xsl:template>
> <xsl:template match="LineItem/PO_NBR">
> <xsl:copy>
> <xsl:copy-of select="@*"/>
> <xsl:apply-templates/>
> </xsl:copy>
> </xsl:template>
> <xsl:template match="LineItem/LINE_ITEM_NBR">
> <xsl:copy>
> <xsl:copy-of select="@*"/>
> <xsl:apply-templates/>
> </xsl:copy>
> </xsl:template>
> <xsl:template match="LineItem/BG_ID">
> <xsl:copy>
> <xsl:copy-of select="@*"/>
> <xsl:apply-templates/>
> </xsl:copy>
> </xsl:template>
> <!-- expected Merged hierarchy output-->
>
> </xsl:stylesheet>
>
> Hope that's what you wanted.
>
> Cheers,
>
> Spencer
>
>
> On Dec 11, 2007 9:49 AM, Tim <timlhunt@xxxxxxxxxxxxxx> wrote:
> > Hi. I have a newbie question. I have been able to extract data from two
> > tables, into a work area like below. The data is below with a stlesheet
> > to try to merge them, but I get all the detail.
> >
> > <?xml version="1.0" encoding="UTF-8"?>
> > <WorkData>
> > <Headers>
> > <Header>
> > <PO_NBR>138513</PO_NBR>
> > <PROC_IND>N</PROC_IND>
> > </Header>
> > <Header>
> > <PO_NBR>138522</PO_NBR>
> > <PROC_IND>N</PROC_IND>
> > </Header>
> > </Headers>
> >
> > <Detail>
> > <LineItem>
> > <PO_NBR>138513</PO_NBR>
> > <LINE_ITEM_NBR>1</LINE_ITEM_NBR>
> > <BG_ID>VL 81268</BG_ID>
> > </LineItem>
> > <LineItem>
> > <PO_NBR>138513</PO_NBR>
> > <LINE_ITEM_NBR>2</LINE_ITEM_NBR>
> > <BG_ID>VL 81200</BG_ID>
> > </LineItem>
> > <LineItem>
> > <PO_NBR>138522</PO_NBR>
> > <LINE_ITEM_NBR>1</LINE_ITEM_NBR>
> > <BG_ID>VL 81265</BG_ID>
> > </LineItem>
> > </Detail>
> > </WorkData>
> >
> > <!-- expected Merged hierarchy output-->
> > <WorkData>
> > <Orders>
> > <Order>
> > <hdr>
> > <PO_NBR>138513</PO_NBR>
> > <PROC_IND>N</PROC_IND>
> > </hdr>
> > <LineItems>
> > <LineItem>
> > <PO_NBR>138513</PO_NBR>
> > <LINE_ITEM_NBR>1</LINE_ITEM_NBR>
> > <BG_ID>VL 81268</BG_ID>
> > </LineItem>
> > <LineItem>
> > <PO_NBR>138513</PO_NBR>
> > <LINE_ITEM_NBR>2</LINE_ITEM_NBR>
> > <BG_ID>VL 81200</BG_ID>
> > </LineItem>
> > </LineItems>
> > </Order>
> > <Order>
> > <hdr>
> > <PO_NBR>138522</PO_NBR>
> > <PROC_IND>N</PROC_IND>
> > </hdr>
> > <LineItems>
> > <LineItem>
> > <PO_NBR>138522</PO_NBR>
> > <LINE_ITEM_NBR>1</LINE_ITEM_NBR>
> > <BG_ID>VL 81265</BG_ID>
> > </LineItem>
> > </LineItems>
> > </Order>
> > </Orders>
> > </WorkData>
> >
> > <!-- My XSL so far gets all the detail, rather than associating detail
> > with the correct header portion: -->
> > <?xml version="1.0"?>
> > <xsl:stylesheet version="1.0"
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> > <xsl:template match="/WorkData/Headers/Header">
> > <xsl:for-each select="/WorkData/Headers/Header">
> > <xsl:value-of select="."/>
> > <xsl:for-each select="/WorkData/Detail/LineItem/*">
> > <xsl:value-of select="."/>
> > <xsl:text>
</xsl:text>
> > </xsl:for-each>
> > <xsl:text>-+-
</xsl:text>
> > </xsl:for-each>
> > </xsl:template>
> > </xsl:stylesheet>
|