xsl-list
[Top] [All Lists]

Re: how to group nodes by id?

2002-12-02 09:34:33
At 2002-12-02 07:48 -0800, Artur Matysiak wrote:
 does anybody know how to convert the following XML:

Below is a solution using variables and a solution using keys. Take your pick. Grouping algorithms are documented in the FAQ ... what aspects of the documentation did you find confusing?

I hope this helps.

...................... Ken

T:\ftemp>type artur.xml
<elems>
 <elem id="1">
  <elem id="1"/>
 </elem>
 <elem id="1">
  <elem id="2"/>
 </elem>
 <elem id="2">
  <elem id="1"/>
 </elem>
 <elem id="2">
  <elem id="2"/>
 </elem>
</elems>

T:\ftemp>type artur.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                version="1.0">

<xsl:output indent="yes"/>

<xsl:template match="elems">
  <elems>
    <xsl:variable name="elem-children" select="elem"/>
    <xsl:for-each select="$elem-children">
      <xsl:if test="generate-id(.)=
                    generate-id($elem-children[(_at_)id=current()/@id])">
        <xsl:copy>
          <xsl:copy-of select="@*"/>
          <xsl:copy-of select="$elem-children[(_at_)id=current()/@id]/node()"/>
        </xsl:copy>
      </xsl:if>
    </xsl:for-each>
  </elems>
</xsl:template>

</xsl:stylesheet>

T:\ftemp>xt artur.xml artur.xsl
<?xml version="1.0" encoding="utf-8"?>
<elems>
<elem id="1">
  <elem id="1"/>

  <elem id="2"/>
 </elem>
<elem id="2">
  <elem id="1"/>

  <elem id="2"/>
 </elem>
</elems>

T:\ftemp>type artur2.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                version="1.0">

<xsl:output indent="yes"/>

<xsl:key name="elems" match="elem[elem]" use="@id"/>

<xsl:template match="elems">
  <elems>
    <xsl:for-each select="elem[generate-id(.)=generate-id(key('elems',@id))]">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:copy-of select="key('elems',@id)/node()"/>
      </xsl:copy>
    </xsl:for-each>
  </elems>
</xsl:template>

</xsl:stylesheet>

T:\ftemp>saxon artur.xml artur2.xsl
<?xml version="1.0" encoding="utf-8"?>
<elems>
   <elem id="1">

      <elem id="1"/>


      <elem id="2"/>

   </elem>
   <elem id="2">

      <elem id="1"/>


      <elem id="2"/>

   </elem>
</elems>
T:\ftemp>

T:\ftemp>


--
Upcoming hands-on in-depth XSLT/XPath and/or XSL-FO:
-                             North America:  Feb 3 - Feb 7,2003

G. Ken Holman               mailto:gkholman(_at_)CraneSoftwrights(_dot_)com
Crane Softwrights Ltd.        http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0  +1(613)489-0999 (F:-0995)
ISBN 0-13-065196-6                     Definitive XSLT and XPath
ISBN 0-13-140374-5                             Definitive XSL-FO
ISBN 1-894049-08-X Practical Transformation Using XSLT and XPath
ISBN 1-894049-10-1             Practical Formatting Using XSL-FO
Next conference training:                    2002-12-08,03-03,06


XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



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