xsl-list
[Top] [All Lists]

RE: [xsl] Grouping Question

2007-06-11 12:18:14
Just change

<xsl:apply-templates select="."/>

to

<xsl:apply-templates select="current-group()"/> 

Actually, since you're not making changes, I think you could do

<xsl:copy-of select="current-group()"/> 

One other point: the href attribute of xsl:result-document is supposed to be
a URI, not a Windows filename.

Michael Kay
http://www.saxonica.com/


-----Original Message-----
From: Danny Leblanc [mailto:leblancd(_at_)ca(_dot_)objectiflune(_dot_)com] 
Sent: 11 June 2007 19:49
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Grouping Question

Hello everyone,

  Let say I have an XML file that looks like this

<root>
  <L1>Data</L1>
  <L1>Data</L1>
  <L1>Data</L1>
  <L1>Data</L1>
  <L1>Data</L1>
  <L1>Data</L1>
  <L1>Data</L1>
  <L1>Data</L1>
</root>

  What I want to do is split this into multiple files each 
time a new L1 is found. The following code is what I use. 
(The code for this is more or less generic except for the XPATH).

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml" version="1.0" encoding="utf-8" 
indent="yes"/> 
    <xsl:template match="/">
        <xsl:for-each select="root/L1">
         <xsl:result-document 
href="C:\\out\\{format-number(position(),'000000000')}.xml">
          <reportrun>
          <batch>
              <xsl:apply-templates select="."/>
          </batch>
          </reportrun>
         </xsl:result-document>
        </xsl:for-each>  
    </xsl:template>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

  This works A1, just the way I want it to. Now what I would 
like to do is add an option that would allow the user to do 
the same split but they could choose how many "L1" would go 
into the output file. For example, right now the above case 
creates 8 files, one per L1. I would like to output 4 files 
that would each contain 2 L1 nodes.

  I tried something like this 

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml" version="1.0" encoding="utf-8" 
indent="yes"/> 
    <xsl:template match="/">
        <xsl:for-each-group select="root/L1" 
group-by="L1[position() mod 5 = 0]">
         <xsl:result-document 
href="C:\\out\\{format-number(position(),'000000000')}.xml">
          <reportrun>
          <batch>
              <xsl:apply-templates select="."/>
          </batch>
          </reportrun>
         </xsl:result-document>
        </xsl:for-each-group>  
    </xsl:template>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
  
  Which did not work. Any insights as to what I would have to 
change to get this going would be appreciated.

Thank you in advance.


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



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