RE: [xsl] Network diagram - node set intersection

Subject: RE: [xsl] Network diagram - node set intersection
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Mon, 23 Feb 2004 18:28:48 -0000
> Here is a simplified sample of the XML document:
> <network>
>   <node>
>     <node-id>A</node-id>
>     <predecessor-id></predecessor-id>
>     <successor-id>B</successor-id>
>   </node>
>   <node>
>     <node-id>B</node-id>
>     <predecessor-id>A</predecessor-id>
>     <successor-id>D</successor-id>
>   </node>
>   <node>
>     <node-id>C</node-id>
>     <predecessor-id>A</predecessor-id>
>     <successor-id>D</successor-id>
>   </node>
>   <node>
>     <node-id>D</node-id>
>     <predecessor-id>B</predecessor-id>
>     <predecessor-id>C</predecessor-id>
>     <successor-id></successor-id>
>   </node>
> </network>
> 
> 
>   <xsl:template match="node">
>     <xsl:variable name="this-node-id" select="node-id" />
>     <xsl:variable name="this-predecessor-nodes" 
> select="predecessor-id" />
>     <xsl:variable name="other-predecessor-nodes" 
> select="/network/node[node-id != $this-node-id]" />
>     <xsl:variable name="sibling-cnt" 
> select="count($this-predecessor-nodes[count(. | 
> $other-predecessor-nodes) != count($other-predecessor-nodes)])" />
> 
>     This node id = <xsl:value-of select="$this-node-id" />
>     Sibling count = <xsl:value-of select="$sibling-cnt" />
>   </xsl:template>
> 
> </xsl:stylesheet>

Looking at node A,
$this-node-id := "A"
$this-predecessor-nodes := a single empty element with name
<predecessor-id/>
$other-predecessor-nodes := the three <node> elements with node-ids B,
C, and D
$sibling-count := the number of nodes in $this-predecessor-count that
are not present in $other-predecessor-nodes. Since the nodes in these
two sets have different names this will always be comprise all the nodes
in $this-predecessor-nodes.

I haven't tried to understand your algorithm in detail, but I think you
want $predecessor-nodes to be the <node> elements identified by the
<predecessor-node> elements, not the <predecessor-node> elements
themselves.

You expression appears to be computing the set difference, not the
intersection.

I would strongly recommend using keys for this kind of problem.

Michael Kay

> 
> This yielded the following output:
> 
> <?xml version="1.0" encoding="UTF-8"?>
>   
> 
>     This node id = A
>     Sibling count = 1
>   
> 
>     This node id = B
>     Sibling count = 1
>   
> 
>     This node id = C
>     Sibling count = 1
>   
> 
>     This node id = D
>     Sibling count = 2
> 
> It the intersection operation didn't do what I expected. I 
> expected that nodes A and D would have a Sibling count of 0 
> and that nodes B and C would each have a sibling count of 1.
> 
> Could anyone tell me where I'm going wrong and point me in 
> the right direction? Thanks.
> 
> -- 
> Charles Knell
> cknell@xxxxxxxxxx - email
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


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


Current Thread