Subject: Re: [xsl] Positional Grouping problem From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx> Date: Mon, 29 May 2006 14:33:59 +0530 |
Hi Peter, Here is another solution using recursive named template
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/invoices"> <invoices> <xsl:for-each select="invoiceHeader"> <invoice> <xsl:copy-of select="." /> <xsl:call-template name="outputinvoice"> <xsl:with-param name="nodeset" select="following-sibling::*" /> </xsl:call-template> </invoice> </xsl:for-each> </invoices> </xsl:template>
<xsl:template name="outputinvoice"> <xsl:param name="nodeset" />
<xsl:if test="$nodeset[1]/self::invoiceLine"> <xsl:copy-of select="$nodeset[1]" /> <xsl:call-template name="outputinvoice"> <xsl:with-param name="nodeset" select="$nodeset[position() > 1]" /> </xsl:call-template> </xsl:if>
Regards, Mukul
I have read the FAQ and think I have found a partial answer to my problem. Seems to be Positional Grouping solution (10) http://www.dpawson.co.uk/xsl/sect2/N4486.html
but my xslt skills are too weak to understand the solution!. I can't even get the solution to work - been at this for hours now... very bad I know.
I have the following XML - a Batch of Invoices a 3 line Invoice and a 2 line Invoice (there are a bunch of other tags and data inside these but for simplicity I've left then out in this example).
<invoices> <invoiceHeader> ...</invoiceHeader> <invoiceLine>... </invoiceLine> <invoiceLine>... </invoiceLine> <invoiceLine>... </invoiceLine> <invoiceHeader>... </invoiceHeader> <invoiceLine>... </invoiceLine> <invoiceLine>... </invoiceLine> </invoices>
What I need is a <invoice> tag that surrounds the Header and Lines. There is nothing that relates a Header to a Line apart from its position i.e the header will be followed by its lines.
<invoices> <invoice> <invoiceHeader> ...</invoiceHeader> <invoiceLine>... </invoiceLine> <invoiceLine>... </invoiceLine> <invoiceLine>... </invoiceLine> </invoice> <invoice> <invoiceHeader>... </invoiceHeader> <invoiceLine>... </invoiceLine> <invoiceLine>... </invoiceLine> <invoice> </invoices>
How can I do this ?
Something like the partial example snippet given in the FAQ above would give the following - but can somebody fill in the blanks - I am missing the start template statements etc - but I do not know what they are meant to be.
<xsl:for-each select=="invoiceHeader">
<invoice> <invoiceHeader><xsl:value-of select="." /> </invoiceHeader>
<invoiceLine> <xsl:for-each select=="following-sibling::invoiceLine[ count(preceding-sibling::invoiceHeader[1] | current()) == 1]"> <xsl:value-of select=="invoiceLine" /> </xsl:for-each> </invoiceLine> </invoice>
</xsl:for-each>
Thanks for any assistance
Peter
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Positional Grouping probl, G. Ken Holman | Thread | RE: [xsl] Positional Grouping probl, Florent Georges |
Re: [xsl] Positional Grouping probl, G. Ken Holman | Date | RE: [xsl] Positional Grouping probl, Florent Georges |
Month |