This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Grouping problem


Hello Mario,

> Here's the more complicated version: I would like to convert the
> list of <obj> elements (see INPUT below) to the hierarchical XML
> (see OUTPUT below).

The following works by first applying templates to only those p.array
elements whose size attribute has the value 1. The template for
p.array elements has a $others parameter that holds the "other"
p.array elements that share the same values for their v elements. It
creates an 'obj' element for the particular level of the p.array
element that you're applying template to, then applies templates to
the next level of p.array elements, passing in the next set of
"others", those that match the next layer of v elements:

<xsl:key name="arrays" match="p.array" use="v[last()]"/>

<xsl:template match="r">
  <xsl:copy>
    <xsl:apply-templates select="obj/p.array[@size = 1]" />
  </xsl:copy>
</xsl:template>

<xsl:template match="p.array">
  <xsl:param name="others" select="key('arrays', v[last()])" />
  <obj name="{v[1]}">
    <xsl:for-each select="$others[@size = current()/@size + 1]">
      <xsl:apply-templates select=".">
        <xsl:with-param name="others"
          select="$others[v[last() - current()/@size + 1] =
                          current()/v[1]]" />
      </xsl:apply-templates>
    </xsl:for-each>
  </obj>
</xsl:template>

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]