xsl-list
[Top] [All Lists]

Re: [xsl] Ordered union of sequences

2010-04-08 11:08:13


On 08.04.2010 17:50, Michael Müller-Hillebrand wrote:
Am 08.04.2010 um 16:09 schrieb Michael Kay:

It seems to me that you first want to create (or imagine) a graph: in your
example there are arcs k->o, o->p, p->c, a->b, b->c, etc.

Then you want to look for cycles in this graph. If any cycles exist, there
is no solution to your problem.

Thanks Michael, I guess I have to finally understand the graph stuff. I will 
turn to the example in the 4th edition p.251 ff. for a starter.

Am 08.04.2010 um 16:47 schrieb Imsieke, Gerrit, le-tex:

[... cool, ready-made example ...]

Does that make sense?

If I include<o/>  at the other position, i.e.,
  <seq><k/><f/><z/><o/></seq>,
I receive "Too many nested function calls. May be due to infinite recursion." 
as expected.

Gerrit, I am at early stages to understand the algorithm. The function counts 
the maximum number of preceding siblings on any available path and uses this as 
a sort key. This is some sort of creating a graph, backtracing to the 
beginning... which is what Michael suggested, isn't it.

Thanks a lot for the most valuable input!

I need a result and the inconsistency report, so the user can fix the input. I 
will be looking into stopping the infinite recursion somehow.

Here's a modified XSLT that will complain about <o/> if you include it inconsistently (<seq><k/><f/><z/><o/></seq>):

---------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
 xmlns:xs="http://www.w3.org/2001/XMLSchema";
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  xmlns:my="URN:my"
  version="2.0"  >

  <xsl:output
    method="xml"
    indent="yes"
    />


  <xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="foo">
    <xsl:copy>
      <xsl:for-each-group select="seq/*" group-by="name(.)" >
        <xsl:sort select="my:sortkey(., ())"/>
        <xsl:element name="{current-grouping-key()}" />
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

  <xsl:function name="my:sortkey" as="xs:integer">
    <xsl:param name="input" as="element(*)" />
    <xsl:param name="previously-seen" as="xs:string*" />
    <xsl:if test="name($input) = $previously-seen">
<xsl:message terminate="yes">Element <xsl:value-of select="name($input)"/> doesn't seem to occur at an deterministic position.
      </xsl:message>
    </xsl:if>
<xsl:variable name="preceding-siblings" select="$input/../../seq/*[name() = name($input)]/preceding-sibling::*[1]" as="element(*)*" /> <xsl:variable name="seen" select="distinct-values(($previously-seen, name($input)))" /> <xsl:sequence select="(max(for $ps in $preceding-siblings return my:sortkey($ps, $seen)) + 1, 1)[1]"/>
  </xsl:function>

</xsl:stylesheet>
---------------------------------------

No time to explain how it works now. Later!

Gerrit



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