xsl-list
[Top] [All Lists]

Re: [xsl] From flat to hierarchical structure

2014-10-22 06:34:17
nick public nickpubl(_at_)gmail(_dot_)com wrote:

I need to convert a flat structure like this

<root>
    <H>1</H>
    <I>1-1</I>
    <I>1-2</I>
    <I>1-3</I>
    <H>2</H>
    <I>2-1</I>
    <I>2-2</I>
  </root>

in one like this

<root>
    <H>
       1
       <I>1-1</I>
       <I>1-2</I>
       <I>1-3</I>
    </H>
    <H>
       2
       <I>2-1</I>
       <I>2-2</I>
    </H>
</root>

Can't you use XSLT 2.0 with

  <xsl:template match="root">
    <xsl:copy>
      <xsl:for-each-group select="*" group-starting-with="H">
        <xsl:copy>
          <xsl:apply-templates select="node(), current-group() except ."/>

? That way it is easy to process your input.

With XSLT 1.0 you might want to define a key

<xsl:key name="group" match="I" use="generate-id(preceding-sibling::H[1])"/>

and then you can use

<xsl:template match="root">
  <xsl:copy>
    <xsl:apply-templates select="H"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="H">
  <xsl:copy>
    <xsl:apply-templates select="node() | key('group', generate-id())"/>
  </xsl:copy>
</xsl:template>

Both approaches need the identity transformation template to copy the remaining nodes like the I elements.
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--

<Prev in Thread] Current Thread [Next in Thread>