xsl-list
[Top] [All Lists]

Re: [xsl] Positional Grouping problem

2006-05-29 02:04:14
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:output method="xml" indent="yes" />

<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() &gt; 1]" />
   </xsl:call-template>
 </xsl:if>

</xsl:template>

</xsl:stylesheet>

Regards,
Mukul

On 5/29/06, Munt,Peter (BOC eServices) <Peter(_dot_)Munt(_at_)boc(_dot_)com> 
wrote:
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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>