|
Subject: Re: Dependency Sorting, first of kind From: Ray Waldin <rwaldin@xxxxxxxxxxx> Date: Tue, 02 Nov 1999 10:17:08 -0800 |
Here's a solution of sorts, but it depends on your definition of
reasonable... :)
With a reasonable limitation on the depth of any given dependency path
through the XML, you can use a brute-force sort expression like:
count(id(@dep|id(@dep|id(@dep ... )/@dep)/@dep))
with one id(@dep...)/@dep recursion per possible dependency depth minus
one. It works by recognizing that, if A is dependent on B, then A is
dependent on at least one more element than is B. Here's a sample XML
file:
<!DOCTYPE x [
<!ELEMENT x (a)*>
<!ELEMENT a EMPTY>
<!ATTLIST a name ID #REQUIRED
dep IDREFS #IMPLIED>
]>
<x>
<a name="seven" dep="six"/>
<a name="six" dep="five"/>
<a name="five" dep="four"/>
<a name="four" dep="three two"/>
<a name="three" dep="two"/>
<a name="two" dep="one"/>
<a name="one"/>
</x>
and a sample stylesheet that handles up to 5 levels of dependency
correctly...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0">
<xsl:template match="x">
<xsl:apply-templates select="a">
<xsl:sort
select="count(id(@dep|id(@dep|id(@dep|id(@dep)/@dep)/@dep)/@dep))"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="a">
<xsl:apply-templates select="@*"/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="@name">
<xsl:value-of select="."/><xsl:text>: </xsl:text>
</xsl:template>
<xsl:template match="@dep">
<xsl:value-of select="translate(normalize(.),' ',',')"/>
<xsl:text> (depth: </xsl:text>
<xsl:value-of select="count(id(.|id(.|id(.|id(.)/@dep)/@dep)/@dep))"/>
<xsl:text>)</xsl:text>
</xsl:template>
</xsl:stylesheet>
You get the following results:
one:
two: one (depth: 1)
three: two (depth: 2)
four: three,two (depth: 3)
five: four (depth: 4)
seven: six (depth: 5)
six: five (depth: 5)
...so it works up to five levels deep, and then falls apart. If you need
more depth, just add more id(@dep...)/@dep recursions. Is that reasonable
enough?
-Ray
---
Paul Prescod wrote:
>
> Let's say that we have a document type like this:
>
> <a name="foo"/>
> <a name="bar" depends-on="foo"/>
> <a name="baz" depends-on="foo"/>
> <a name="jaz" depends-on="foo bar"/>
> <a name="spaz"/>
> <a name="maz" depends-on="spaz bar"/>
>
> You can see that some elements depen on other elements as functions
> might depend on other functions in a programming language or classes
> upon superclasses in an object oriented language. I've listed them in
> dependence order above (all dependents are listed after their dependees)
> but the goal is actually to be able to do that sort. I want to take
> randomly sorted elements and print them in their sorted order.
>
> I cannot think of a reasonably easy way to do that. Is there one?
>
> Paul Prescod
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: Dependency Sorting, first of ki, Francis Norton | Thread | RE: Dependency Sorting, first of ki, Kay Michael |
| RE: MIF output from XT, Kay Michael | Date | RE: MIF output from XT, Ed Nixon |
| Month |