xsl-list
[Top] [All Lists]

Re: how to group nodes by id?

2002-12-02 10:20:03
--- G. Ken Holman  wrote:

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>



[solution with xsl:variable skipped]

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>



This solution will work only if the child "element"s have all unique
"id" attributes.

For example, when applied on the following source xml:

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


the result of the transformation is:

<?xml version="1.0" encoding="utf-8"?>
<elems>
   <elem id="1">  
    
      <elem id="1"/>  
    
      <elem id="2"/>   
    
      <elem id="2"/>   
    
      <elem id="2"/>   
    
      <elem id="3"/> 
   </elem>
   <elem id="2">  
    
      <elem id="1"/>   
    
      <elem id="2"/> 
   </elem>
</elems>

Probably I misunderstand the problem, but I think that the
re-structuring had to be accompanied by elimination of elements with
non-unique "id" attributes.





=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL

__________________________________________________
Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
http://mailplus.yahoo.com

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



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