[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Grouping lists from flat to nested

Subject: Grouping lists from flat to nested
From: Stefanie Haupt <st.haupt@xxxxxxxxx>
Date: Mon, 31 Jan 2011 13:18:10 +0100
 Grouping lists from flat to nested
Dear list,

I'm trying to group list items from flat xml to a nested tree.
I've read and searched a lot and adapted a snippet but I can't get it
to do what I really want.

This is my input at that state of the transformation (working on a
variable here):
<variable>
<p level="0">Der als Filmregisseur  <hi rend="bo">Alan Smithee</hi>
ist ein.. </p>
<p level="0">Das Pseudonym.. .</p>
<p level="0">Der Regisseur...</p>
<head2 level="0">Wissenswertes</head2>
<item level="0" type="ul">Alternative Schreibweisen..</item>
<item level="0" type="ul">Eine alternative Theorie...</item>
<item level="0" type="ul">Zu den ... </item>
<item level="1" type="ul">Don  </item>
<item level="1" type="ul">David Lynch </item>
<item level="1" type="ul">Chris Christensen </item>
<item level="1" type="ul">Stuart Rosenberg</item>
<item level="1" type="ul">Richard C. Sarafian</item>
<item level="1" type="ul">Dennis Hopper  </item>
<item level="2" type="ul"> level 3 ulitem</item>
<item level="1" type="ul">Arthur Hiller (fC<r ), </item>
<item level="1" type="ul">Rick Rosenthal (Birds II) und </item>
<item level="1" type="ul">Kevin Yagher </item>
<item level="0" type="ul">Zu den Drehbuchautoren </item>
<item level="1" type="ul">Sam Raimi und Ivan Raimi </item>
<head2 level="0">Weblinks</head2>
</variable

And this is the desired output:
  <p level="0">Der als Filmregisseur <hi rend="bo">Alan Smithee</hi>
ist ein.. </p>
  <p level="0">Das Pseudonym.. .</p>
  <p level="0">Der Regisseur...</p>
  <head2 level="0">Wissenswertes</head2>
  <list type="ul">
    <item>Alternative Schreibweisen..</item>
    <item>Eine alternative Theorie...</item>
    <item>Zu den ... </item>
    <list type="ul">
      <item>Don </item>
      <item>David Lynch </item>
      <item>Chris Christensen </item>
      <item>Stuart Rosenberg</item>
      <item>Richard C. Sarafian</item>
      <item>Dennis Hopper </item>
      <list type="ul">
        <item> level 3 ulitem</item>
      </list>
      <item>Arthur Hiller (fC<r ), </item>
      <item>Rick Rosenthal (Birds II) und </item>
      <item>Kevin Yagher </item>
    </list>
    <item>Zu den Drehbuchautoren </item>
    <list type="ul">
      <item>Sam Raimi und Ivan Raimi</item>
    </list>
  </list>
  <head2 level="0">Weblinks</head2>

Currently I'm stuck with this attempt (excerpt from my xsl) - it's
based on what Michael Kay described here:
http://www.saxonica.com/papers/ideadb-1.1/mhk-paper.xml:

<xsl:template match=text>
...
...
<xsl:variable name=text2>
...please see up for example
</xsl:variable>

  <xsl:call-template name="process-level">
          <xsl:with-param name="population" select="$text2"/>
          <xsl:with-param name="level" select="0"/>
  </xsl:call-template>
</xsl:template>

  <xsl:template name="process-level">
    <xsl:param name="population" required="yes" as="element()*"/>
    <xsl:param name="level" required="yes" as="xs:integer"/>
    <xsl:for-each-group select="$population"
      group-starting-with="*[xs:integer(@level) eq $level]">

      <xsl:choose>
        <xsl:when test="name()='item'">
          <list type="{@type}">
            <item>
              <xsl:value-of select="normalize-space(.)"/>
            </item>
            <xsl:call-template name="process-level">
              <xsl:with-param name="population"
                select="current-group()[position() != 1]"/>
              <xsl:with-param name="level" select="$level + 1"/>
            </xsl:call-template>
          </list>
        </xsl:when>

        <xsl:otherwise>
          <xsl:copy-of select="."/>
          <xsl:call-template name="process-level">
            <xsl:with-param name="population"
              select="current-group()[position() != 1]"/>
            <xsl:with-param name="level" select="$level + 1"/>
          </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>

    </xsl:for-each-group>

  </xsl:template>

The current result snippet looks like this:

  <p level="0">Der als Filmregisseur <hi rend="bo">Alan Smithee</hi></p>
  <p level="0">Das Pseudonym </p>
  <p level="0">Der Regisseur </p>
  <head2 level="0">Wissenswertes</head2>
  <list type="ul">
    <item>Alternative Schreibweisen </item>
  </list>
  <list type="ul">
    <item>Eine alternative Theorie </item>
  </list>
  <list type="ul">
    <item>Zu den </item>
    <list type="ul">
      <item>Don </item>
    </list>
    <list type="ul">
      <item>David Lynch </item>
    </list>
    <list type="ul">
      <item>Chris Christensen </item>
    </list>
    <list type="ul">
      <item>Stuart Rosenberg </item>
    </list>
    <list type="ul">
      <item>Richard C. Sarafian </item>
    </list>
    <list type="ul">
      <item>Dennis Hopper ,</item>
      <list type="ul">
        <item>level 3 ulitem</item>
      </list>
    </list>
    <list type="ul">
      <item>Arthur Hiller (fC<r ),</item>
    </list>
    <list type="ul">
      <item>Rick Rosenthal (Birds II) und</item>
    </list>
    <list type="ul">
      <item>Kevin Yagher </item>
    </list>
  </list>
  <list type="ul">
    <item>Zu den Drehbuchautoren</item>
    <list type="ul">
      <item>Sam Raimi und Ivan Raimi </item>
    </list>
  </list>
  <head2 level="0">Weblinks</head2>

As you can see *every* item is wrapped into a list element, apart from
that, it's fairly what I want. I suppose I added a simple logical
error, but I can't get it right. Any help is appreciated.

Kind Regards,
Stefanie

--
Stefanie Haupt, M.A.

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.