xsl-list
[Top] [All Lists]

Re: [xsl] Creating a complex hierarchical structure from flat strcuture

2007-03-16 02:38:24
I have tried this template and managed to achieve my desired results:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
   <xsl:template match="section">
       <section>
<xsl:for-each-group select="para" group-adjacent="if (matches(@class, 'epigraphsource')) then replace(@class, 'epigraphsource', 'epigraphpara') else if (matches(@class, 'subsection\dpara')) then replace(@class, 'subsection\dpara', 'subsection1para') else @class">
               <xsl:choose>
<xsl:when test="current-grouping-key() = 'epigraphpara'">
                       <epigraph>
                           <xsl:apply-templates select="current-group()"/>
                       </epigraph>
                   </xsl:when>
<xsl:when test="current-grouping-key() eq 'subsection1para'"> <xsl:for-each-group select="current-group()" group-starting-with="para[child::inline[(_at_)class='subsection1title']]">
                           <subsection1>
<xsl:for-each-group select="current-group()" group-adjacent="replace(@class, 'subsection[23]para', 'subsection2para')">
                                   <xsl:choose>
<xsl:when test="current-grouping-key() eq 'subsection2para'">
                                           <subsection2>
<xsl:for-each-group select="current-group()" group-adjacent="replace(@class, 'subsection[3]para', 'subsection3para')">
                                                   <xsl:choose>
<xsl:when test="current-grouping-key() eq 'subsection3para'">
                                                           <subsection3>
<xsl:apply-templates select="current-group()"/>
                                                           </subsection3>
                                                       </xsl:when>
                                                       <xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
                                                       </xsl:otherwise>
                                                   </xsl:choose>
                                               </xsl:for-each-group>
                                           </subsection2>
                                       </xsl:when>
                                       <xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
                                       </xsl:otherwise>
                                   </xsl:choose>
                               </xsl:for-each-group>
                           </subsection1>
                       </xsl:for-each-group>
                   </xsl:when>
                   <xsl:otherwise>
                       <xsl:apply-templates select="current-group()"/>
                   </xsl:otherwise>
               </xsl:choose>
           </xsl:for-each-group>
       </section>
   </xsl:template>
   <xsl:template match="para[child::inline[matches(@class, 'title')]]">
       <title>
           <xsl:copy-of select="."/>
       </title>
   </xsl:template>
   <xsl:template match="node() | @*">
       <xsl:copy>
           <xsl:apply-templates select="node() | @*"/>
       </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

However, i'm not sure upto what level my hierarchy is there a more general or better way to do this?
--
*Jeff Sese*

Jeff Sese wrote:
Hi,

This is a little deviation from my previous problem in http://www.biglist.com/lists/xsl-list/archives/200703/msg00310.html.

Now I have some flat xml like

<section>
  <para class="epigraphpara">...</para>
  <para class="epigraphpara">...</para>
  <para class="epigraphpara">...</para>
  <para class="epigraphpara">...</para>
  <para class="epigraphsource">...</para>
<para class="subsection1para"><inline class="subsection1title">...</inline></para>
  <para class="subsection1para">...</para>
  <para class="subsection1para">...</para>
<para class="subsection2para"><inline class="subsection2title">...</inline></para>
  <para class="subsection2para">...</para>
  <para class="subsection2para">...</para>
  <para class="subsection1para">...</para>
  <para class="subsection1para">...</para>
<para class="subsection1para"><inline class="subsection1title">...</inline></para>
  <para class="subsection1para">...</para>
  <para class="subsection1para">...</para>
</section>

that needs to be into this:

<section>
  <epigraph>
      <para class="epigraphpara">...</para>
      <para class="epigraphpara">...</para>
      <para class="epigraphpara">...</para>
      <para class="epigraphpara">...</para>
      <para class="epigraphsource">...</para>
  </epigraph>
  <subsection1>
<title><para class="subsection1para"><inline class="subsection1title">...</inline></para></title>
      <para class="subsection1para">...</para>
      <para class="subsection1para">...</para>
      <subsection2>
<title><para class="subsection2para"><inline class="subsection2title">...</inline></para></title>
          <para class="subsection2para">...</para>
          <para class="subsection2para">...</para>
      </subsection>
      <para class="subsection1para">...</para>
      <para class="subsection1para">...</para>
  </subsection1>
  <subsection1>
<title><para class="subsection1para"><inline class="subsection1title">...</inline></para></title>
      <para class="subsection1para">...</para>
      <para class="subsection1para">...</para>
      <para class="subsection1para">...</para>
      <para class="subsection1para">...</para>
  </subsection1>
</section>

My current xsl:

<xsl:template match="section">
   <section>
<xsl:for-each-group select="para" group-adjacent="replace(@class, 'epigraphsource', 'epigraphpara')">
           <xsl:choose>
               <xsl:when test="current-grouping-key() = 'epigraphpara'">
                   <epigraph>
                       <xsl:apply-templates select="current-group()"/>
                   </epigraph>
               </xsl:when>
<xsl:when test="current-grouping-key() eq 'subsection1para'"> <xsl:for-each-group select="current-group()" group-starting-with="para[child::inline[(_at_)class='subsection1title']]">
                       <subsection1>
<xsl:apply-templates select="current-group()"/>
                       </subsection1>
                   </xsl:for-each-group>
               </xsl:when>
               <xsl:otherwise>
                  <xsl:apply-templates select="current-group()"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each-group>
   </section>
</xsl:template>

Which so far produced:

<section>
   <epigraph>
       <para class="epigraphpara">...</para>
       <para class="epigraphpara">...</para>
       <para class="epigraphpara">...</para>
       <para class="epigraphpara">...</para>
       <para class="epigraphsource">...</para>
   </epigraph>
   <subsection1>
<para class="subsection1para"><inline class="subsection1title">...</inline></para>
       <para class="subsection1para">...</para>
       <para class="subsection1para">...</para>
   </subsection1>
<para class="subsection2para"><inline class="subsection2title">...</inline></para>
   <para class="subsection2para">...</para>
   <para class="subsection2para">...</para>
   <subsection1>
       <para class="subsection1para">...</para>
       <para class="subsection1para">...</para>
   </subsection1>
   <subsection1>
<para class="subsection1para"><inline class="subsection1title">...</inline></para>
       <para class="subsection1para">...</para>
       <para class="subsection1para">...</para>
   </subsection1>
</section>


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