|
Subject: Re: [xsl] Spotting "cousin marriages" in a tree From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Thu, 29 Jul 2004 10:30:14 +0100 |
Hi Phil,
I think that you've covered the possible solutions here, so just a
couple of suggestions that might help you with the problems you
identified with this solution:
> I can do a multi-pass process using exsl:node-set(), generating the
> tree with the duplicates in it and then deleting them if they are
> duplicates, i.e. something like this:
[snip]
> There are two problems with this. First, generating the intermediate
> result could run forever if the input is seriously malformed (e.g. a
> loop, child refers to parent); checking as it is generated would
> avoid this.
You could avoid re-entry problems by keeping track of the ancestors of
a particular <tree> element through a parameter, something like:
<xsl:key name="things-by-id" match="thing" use="@id"/>
<xsl:template match="thing">
<xsl:param name="ancestors" select="/.." />
<tree>
<xsl:for-each select="child">
<xsl:choose>
<xsl:when test="@idref = $ancestors">
<error />
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="key('things-by-id',@idref)">
<xsl:with-param name="ancestors"
select="$ancestors | @idref" />
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</tree>
</xsl:template>
> Second, the test "preceding::tree[@id=current/@id]" is O(n^2). Can I
> use a key to avoid this? How can a key be applied to an
> exsl:node-set() result?
In just the same way as you use keys with other documents. The key
returns nodes in the same document as the node you're on. It doesn't
make a difference that document has been generated from a result-tree
fragment. So you can do:
<xsl:key name="tree-by-id" match="tree" use="@id" />
<xsl:template match="tree" mode="remove-dupes">
<xsl:choose>
<xsl:when test="generate-id(key('tree-by-id', @id)[1]) !=
generate-id(.)">
<error/>
</xsl:when>
<xsl:otherwise>
<tree id="{@id}">
<xsl:apply-templates mode="remove-dupes"/>
</tree>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] Spotting "cousin marriage, Michael Kay | Thread | Re: [xsl] Spotting "cousin marriage, Phil Endecott |
| Re: [xsl] Curious result of the pos, David Carlisle | Date | Re: [xsl] Failed to load java error, Ranjan K. Baisak |
| Month |