xsl-list
[Top] [All Lists]

RE: Use for-each-group to eliminate duplicate output nodes?

2005-12-21 17:23:16
I haven't studied the logic in detail, but:

(a) You need to think of this as a multiphase transformation. Your existing
code is phase 1, the deduplication is phase 2. 

(b) The output of the first phase will need to be structured as XML, at the
moment it's plain text

(c) Deduplication using xsl:for-each-group (or possibly even using the
simpler distinct-values()) should then be unproblematic. 

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

-----Original Message-----
From: cknell(_at_)onebox(_dot_)com [mailto:cknell(_at_)onebox(_dot_)com] 
Sent: 21 December 2005 18:11
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Use for-each-group to eliminate duplicate output nodes?

I have a transformation during which I'd like to eliminate 
some duplicate nodes which are generated in the 
transformation. Below is a sample of a portion of the input 
document the relevant templates from the XSLT document and 
the output currently generated.

I need to eliminate duplicate lines from the output file. If 
I were post-processing with perl, I'd use a hash to do this. 
Now that I'm moving into XSLT 2.0, I have the feeling that 
something similar to a perl hash can be got using 
<xsl:for-each-group>.

The actual stylesheet and data document are somewhat more 
complicated. I hope that I have steered correctly between the 
Scylla and Charybdis of too much and too little information. 
Can someone tell me whether <xsl:for-each-group> can be used 
like a perl hash to eliminate duplicate values, and if so how? Thanks.

-- Data Document (sample portion)--
<path>
<node type="process" id="023">
  <predecessors>
     <node type="process" id="020">
        <predecessors>
           <node type="process" id="001">
              <predecessors>
                 <node type="data-store" id="058"/>
              </predecessors>
           </node>
           <node type="process" id="002">
              <predecessors>
                 <node type="data-store" id="059"/>
              </predecessors>
           </node>
        </predecessors>
     </node>
  </predecessors>
</node>

<node type="process" id="024">
  <predecessors>
     <node type="process" id="020">
        <predecessors>
           <node type="process" id="001">
              <predecessors>
                 <node type="data-store" id="058"/>
              </predecessors>
           </node>
           <node type="process" id="002">
              <predecessors>
                 <node type="data-store" id="059"/>
              </predecessors>
           </node>
        </predecessors>
     </node>
   </predecessors>
</node>
</path>

These are the templates that process the part of the document shown.:

-- XSLT document --
<xsl:template match="/">
  digraph d{
  <xsl:apply-templates />
              }
</xsl:template>

<xsl:template match="path">
  node_<xsl:value-of select="node/@id" /> ;
  <xsl:apply-templates mode="set-nodes" />
  <xsl:apply-templates mode="set-connections" />
</xsl:template>

<xsl:template match="predecessors" mode="set-nodes">
  <xsl:apply-templates mode="set-nodes" />
</xsl:template>

<xsl:template match="node" mode="set-nodes">
  <xsl:apply-templates mode="set-nodes" />
</xsl:template>

<xsl:template match="predecessors/node" mode="set-nodes">
  node_<xsl:value-of select="@id" />
  <xsl:apply-templates mode="set-nodes" />
</xsl:template>

<xsl:template match="node" mode="set-connections">
  <xsl:variable name="target-node" select="." />
  <xsl:for-each select="predecessors/node">
    node_<xsl:value-of select="@id" /> -> node_<xsl:value-of 
select="$target-node/@id" />
  </xsl:for-each>
  <xsl:apply-templates mode="set-connections" />
</xsl:template>

Output from existing stylesheet (sorted to make 
identification of duplicates easier):

digraph d{
      node_001
      node_001
      node_002
      node_002
      node_003
      node_003
      node_004
      node_005
      node_006
      node_007
      node_008
      node_020
      node_020
      node_023
      node_024
      node_028
      node_038
      node_058
      node_058
      node_059
      node_059
      node_060
      node_061
      node_062
      node_063
      node_064
      node_065

      node_001 -> node_020
      node_001 -> node_020
      node_002 -> node_020
      node_002 -> node_020
      node_004 -> node_038
      node_005 -> node_038
      node_006 -> node_038
      node_007 -> node_038
      node_008 -> node_038
      node_020 -> node_023
      node_020 -> node_024
      node_023 -> node_038
      node_024 -> node_038
      node_038 -> node_028
      node_058 -> node_001
      node_058 -> node_001
      node_059 -> node_002
      node_059 -> node_002
      node_060 -> node_003
      node_061 -> node_004
      node_062 -> node_005
      node_063 -> node_006
      node_064 -> node_007
      node_065 -> node_008
}
-- 
Charles Knell
cknell(_at_)onebox(_dot_)com - email

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