xsl-list
[Top] [All Lists]

RE: Grouping over multiple files

2006-01-14 08:19:14
Try replacing

<xsl:copy-of select="."/>

with

<revenue source="{document-uri(/)}">
  <xsl:value-of select="."/>
</revenue>

though document-uri will give you an absolute URI and you may want to cut it
down.

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

-----Original Message-----
From: Kevin Bird 
[mailto:kevin(_dot_)bird(_at_)matrixdigitaldata(_dot_)co(_dot_)uk] 
Sent: 14 January 2006 14:24
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Grouping over multiple files

Hello

I am grouping <person> elements from four files (North, 
South, East & West).
The grouping is working fine, but I would like to add a 
source attribute to
the revenue elements to show which file they came from 
(please see 'desired
output' section below.

I have attached cut down versions of the input, along with the current
stylesheet and output.

Thanks.

--
Kevin

------------
North.xml
------------

<sales>
      <period id="October">
              <person>
                      <name>Peter</name>
                      <revenue>1000</revenue>
              </person>
              <person>
                      <name>Fred</name>
                      <revenue>2000</revenue>
              </person>
              <person>
                      <name>Alex</name>
                      <revenue>100</revenue>
              </person>
              <person>
                      <name>Barney</name>
                      <revenue>20</revenue>
              </person>
      </period>
</sales>

------------
South.xml
------------
<sales>
      <period id="October">
              <person>
                      <name>Peter</name>
                      <revenue>500</revenue>
              </person>
              <person>
                      <name>Barney</name>
                      <revenue>750</revenue>
              </person>
      </period>
</sales>

------------
East.xml
------------
<sales>
      <period id="October">
              <person>
                      <name>Peter</name>
                      <revenue>40</revenue>
              </person>
              <person>
                      <name>Fred</name>
                      <revenue>5000</revenue>
              </person>
              <person>
                      <name>Alex</name>
                      <revenue>100</revenue>
              </person>
      </period>
</sales>

------------
West.xml
------------
<sales>
      <period id="October">
              <person>
                      <name>Fred</name>
                      <revenue>400</revenue>
              </person>
              <person>
                      <name>Alex</name>
                      <revenue>2000</revenue>
              </person>
      </period>
</sales>

------------
Sales.xsl
------------
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
      <xsl:output indent="yes" method="xml"/>

      <xsl:variable name="northsales"
select="document('north.xml')/sales/period/person"/>
      <xsl:variable name="southsales"
select="document('south.xml')/sales/period/person"/>
      <xsl:variable name="eastsales"
select="document('east.xml')/sales/period/person"/>
      <xsl:variable name="westsales"
select="document('west.xml')/sales/period/person"/>

      <xsl:template match="/">
              <combinedsales>
                      <xsl:for-each-group select="$northsales,
$southsales, $eastsales, $westsales" group-by="name">
                              <person>
                                      <xsl:copy-of
select="(current-group()/name)[1]"/>
                                      <xsl:for-each
select="current-group()/revenue">
                                              <xsl:copy-of 
select="."/>
                                      </xsl:for-each>
                              </person>
                      </xsl:for-each-group>
              </combinedsales>
      </xsl:template>
</xsl:stylesheet>

------------
Current Output
------------
<combinedsales>
  <person>
    <name>Peter</name>
    <revenue>1000</revenue>
    <revenue>500</revenue>
    <revenue>40</revenue>
  </person>
  <person>
    <name>Fred</name>
    <revenue>2000</revenue>
    <revenue>5000</revenue>
    <revenue>400</revenue>
  </person>
  <person>
    <name>Alex</name>
    <revenue>100</revenue>
    <revenue>100</revenue>
    <revenue>2000</revenue>
  </person>
  <person>
    <name>Barney</name>
    <revenue>20</revenue>
    <revenue>750</revenue>
  </person>
</combinedsales>

------------
Desired Output
------------
<combinedsales>
  <person>
    <name>Peter</name>
    <revenue source="north.xml">1000</revenue>       <!-- add 
@source to
indicate file origin -->
    <revenue source="south.xml">500</revenue>
    <revenue source="east.xml">40</revenue>
  </person>
  <person>
    <name>Fred</name>
    <revenue source="north.xml">2000</revenue>
    <revenue source="east.xml">5000</revenue>
    <revenue source="west.xml">400</revenue>
  </person>
  <person>
    <name>Alex</name>
    <revenue source="north.xml">100</revenue>
    <revenue source="east.xml">100</revenue>
    <revenue source="west.xml">2000</revenue>
  </person>
  <person>
    <name>Barney</name>
    <revenue source="north.xml">20</revenue>
    <revenue source="south.xml">750</revenue>
  </person>
</combinedsales>





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