RE: [xsl] Positional Grouping problem

Subject: RE: [xsl] Positional Grouping problem
From: Florent Georges <darkman_spam@xxxxxxxx>
Date: Mon, 29 May 2006 11:05:18 +0200 (CEST)
"Munt,Peter (BOC eServices)" wrote:

> What I need is a <invoice> tag that surrounds the Header
> and Lines.

  If you use XSLT 2.0, you can use xsl:for-each-group:

    ~> cat drafts/grouping-2.xsl
    <xsl:transform
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
        version="2.0">

      <xsl:output indent="yes"/>

      <xsl:template match="invoices">
        <xsl:copy>
          <xsl:for-each-group
              select="*"
              group-starting-with="invoiceHeader">
            <invoice>
              <xsl:copy-of select="current-group()"/>
            </invoice>
          </xsl:for-each-group>
        </xsl:copy>
      </xsl:template>

    </xsl:transform>

    ~> cat drafts/grouping-2.xml
    <invoices>
      <invoiceHeader>A</invoiceHeader>
      <invoiceLine>A 1</invoiceLine>
      <invoiceLine>A 2</invoiceLine>
      <invoiceLine>A 3</invoiceLine>
      <invoiceHeader>B</invoiceHeader>
      <invoiceLine>B 1</invoiceLine>
      <invoiceLine>B 2</invoiceLine> 
    </invoices>

    ~> saxon drafts/grouping-2.xml drafts/grouping-2.xsl
    <?xml version="1.0" encoding="UTF-8"?>
    <invoices>
       <invoice>
          <invoiceHeader>A</invoiceHeader>
          <invoiceLine>A 1</invoiceLine>
          <invoiceLine>A 2</invoiceLine>
          <invoiceLine>A 3</invoiceLine>
       </invoice>
       <invoice>
          <invoiceHeader>B</invoiceHeader>
          <invoiceLine>B 1</invoiceLine>
          <invoiceLine>B 2</invoiceLine>
       </invoice>
    </invoices>

  If you are restricted to XSLT 1.0, you can recurse on
adjacent lines:

    ~> cat drafts/grouping-1.xsl
    <xsl:transform
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
        version="1.0">

      <xsl:output indent="yes"/>

      <xsl:template match="invoices">
        <xsl:copy>
          <xsl:apply-templates select="invoiceHeader"/>
        </xsl:copy>
      </xsl:template>

      <xsl:template match="invoiceHeader">
        <invoice>
          <xsl:copy-of select="."/>
          <xsl:apply-templates select="
              following-sibling::*[1][self::invoiceLine]"/>
        </invoice>
      </xsl:template>

      <xsl:template match="invoiceLine">
        <xsl:copy-of select="."/>
        <xsl:apply-templates select="
            following-sibling::*[1][self::invoiceLine]"/>
      </xsl:template>

    </xsl:transform>

    ~> xsltproc drafts/grouping-1.xsl drafts/grouping-2.xml
    <?xml version="1.0"?>
    <invoices>
      <invoice>
        <invoiceHeader>A</invoiceHeader>
        <invoiceLine>A 1</invoiceLine>
        <invoiceLine>A 2</invoiceLine>
        <invoiceLine>A 3</invoiceLine>
      </invoice>
      <invoice>
        <invoiceHeader>B</invoiceHeader>
        <invoiceLine>B 1</invoiceLine>
        <invoiceLine>B 2</invoiceLine>
      </invoice>
    </invoices>

  Regards,

--drkm





























	

	
		
___________________________________________________________________________ 
Faites de Yahoo! votre page d'accueil sur le web pour retrouver directement vos services prifiris : virifiez vos nouveaux mails, lancez vos recherches et suivez l'actualiti en temps riel. 
Rendez-vous sur http://fr.yahoo.com/set

Current Thread