Subject: Re: [xsl] Nested loops From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx> Date: Sat, 13 Nov 2004 07:37:18 -0500 |
The problem is to create a list of invoices in a format something like this (all simplified as much as I can):
invoiceNumber: aaa invoiceAddress: abc product: xxx price: xxx.xx qty: xx linePrice: xxx.xx ... product: xxx price: xxx.xx qty: xx linePrice: xxx.xx invoiceTotal: xxxx.xx
invoiceNumber: bbb invoiceAddress: def product: yyy price: yyy.yy qty: yy linePrice: yyy.yy ... product: yyy price: yyy.yy qty: yy linePrice: yyy.yy invoiceTotal: yyyy.yy
and so on.
The xml file from which I have to produce this, is of the form:
<database> <invoice> <invoice_rec> <invoiceNumber>aaa</invoiceNumber> <invoiceAddress>abc</invoiceAddress> </invoice_rec> <invoice_rec> ... </invoice_rec> ... </invoice> <invoice_line> <invoice_line_rec> <invoiceNumber>aaa</invoiceNumber> <product>xxx</product> <price>xxx.xx</price> <qty>xx</qty> <linePrice>xxx.xx</linePrice> </invoice_line_rec> <invoice_line_rec> ... </invoice_line_rec> </invoice_line> <invoice_total> <invoiceNumber>aaa</invoiceNumber> <invoiceTotal>xxxx.xx</invoiceTotal> </invoice_total> </database>
So I need to pick up the first invoice and deal with its data, then pick up all the invoice lines for that invoice and deal with them, then pick up the invoice total for that invoice and deal with it. Then I need to repeat the procedure for each succeeding invoice.
So I need some sort of nested loop.
Now, I take the point I learnt last week that this is probably best done using <xsl:apply-templates>,
but how can I just pick the node set that has the correct invoice number? That is, I need to do something like:
* apply the invoice_rec template
* print the contents
* apply the invoice_line_rec template for nodes sharing an invoiceNumber with the invoice_rec it's "called" from
Process "../../invoice_line/ invoice_line_rec[invoiceNumber=current()/invoiceNumber]"
* apply the invoice_total template for the node sharing the invoice number
Process "../../invoice_line/ invoice_total[invoiceNumber=current()/invoiceNumber]:
Do this for each invoice_rec.
<xsl:for-each select="/database/invoice/invoice_rec"> ...print the contents... <xsl:for-each select="../../invoice_line/ invoice_line_rec[invoiceNumber=current()/invoiceNumber]"> ...print the line... </xsl:for-each> <xsl:for-each select="../../invoice_line/ invoice_total[invoiceNumber=current()/invoiceNumber]"> ...print total... </xsl:for-each> </xsl:for_each>
<xsl:template match="/"> <xsl:apply-templates select="/database/invoice/invoice_rec"/> </xsl:template> <xsl:template match="invoice_rec"> ...print the contents... <xsl:apply-templates select="../../invoice_line/ invoice_line_rec[invoiceNumber=current()/invoiceNumber]"/> <xsl:apply-templates select="../../invoice_line/ invoice_total[invoiceNumber=current()/invoiceNumber]"/> </xsl:template> <xsl:template match="invoice_line_rec"> ...print the line... </xsl:template> <xsl:template match="invoice_total"> ...print the total... </xsl:template>
I've tried all sorts of things including predicates and variables, but I just can't seen to find a valid XPath expression that gives me the node set I need.
<xsl:key name="recs" match="invoice_rec" use="'all'"/> <xsl:key name="lines" match="invoice_line" use="invoiceNumber"/> <xsl:key name="totals" match="invoice_total" use="invoiceNumber"/>
<xsl:template match="/"> <xsl:for-each select="key(recs,'all')"> ...do contents... <xsl:for-each select="key(lines,invoiceNumber)"> ...do line... </xsl:for-each> <xsl:for-each select="key(totals,invoiceNumber)"> ...do total... </xsl:for-each> </xsl:for-each> </xsl:template>
-- World-wide on-site corporate, govt. & user group XML/XSL training. G. Ken Holman mailto:gkholman@xxxxxxxxxxxxxxxxxxxx Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/ Box 266, Kars, Ontario CANADA K0A-2E0 +1(613)489-0999 (F:-0995) Male Breast Cancer Awareness http://www.CraneSoftwrights.com/s/bc Legal business disclaimers: http://www.CraneSoftwrights.com/legal
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Nested loops, Peter Bradley | Thread | Re: [xsl] Nested loops, G. Ken Holman |
Re: [xsl] Nested loops, Bruce D'Arcus | Date | Re: [xsl] Nested loops, G. Ken Holman |
Month |