xsl-list
[Top] [All Lists]

RE: combining the children of similar nodes under one node

2004-03-07 11:04:10

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
David Montalvo
Sent: 07 March 2004 00:12
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] combining the children of similar nodes under one node


in the following example code, notice that all three nodes have the 
same name. I want to combine all nodes with the same name 
into one node 
with all of their <style>s and <types>s, where <style> and <type> are 
not duplicated.



You could do something like


<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
        <xsl:output method = "xml"/>
        
        <xsl:template match="/">        

  <xsl:variable name="list"
select="/inventory/product/node()[not(.=following::product/node())]" />

 
        <product>
                <xsl:copy-of select="$list"/>
        </product>

        </xsl:template>
        
</xsl:stylesheet>

Gl, Jim Fuller

<inventory>
      <product>
              <name>chair</name>
              <style>rocking</style>
      </product>

      <product>
              <name>chair</name>
              <type>rocking</type> --> same value as <style> above
      </product>
      <product>
              <name>chair</name>
              <style>folding</style>
              <type>lawn</type>
      </product>
</inventory>

When I'm in the first node, I grab it, when I'm in the second node, I 
can check the preceding <style> value and skip it, when I'm in the 
third node I grab it. That gives me:

      <product>
              <name>chair</name>
              <style>rocking</style>
      </product>
      <product>
              <name>chair</name>
              <style>folding</style>
              <type>lawn</type>
      </product>

I figured out that, while in the second of these nodes, I can 
check if 
the preceding name is the same and, if so, get the preceding <style> 
and add it to the second product node, giving me:

      <product>
              <name>chair</name>
              <style>rocking</style>
      </product>
      <product>
              <name>chair</name>
              <style>rocking</style>
              <style>folding</style>
              <type>lawn</type>
      </product>

but I still have 2 products with the name "chair". how can I get the 
result:

      <product>
              <name>chair</name>
              <style>rocking</style>
              <style>folding</style>
              <type>lawn</type>
      </product>

One of the problems is that <style> and <type> are being used 
interchangeably, but I think I compensated for that. My big 
problem is 
getting everything listed under one name with no duplicates.

-dave




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



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



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