xsl-list
[Top] [All Lists]

RE: [xsl] Positional Grouping problem

2006-05-29 02:05:44
"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 préférés : vérifiez vos nouveaux mails, lancez vos recherches et 
suivez l'actualité en temps réel. 
Rendez-vous sur http://fr.yahoo.com/set

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