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