xsl-list
[Top] [All Lists]

RE: XSLT 1.0: Grouping Adjacent Elements in Embedded Lists

2004-11-05 09:26:51
Ok, I've made slight progress on this by changing the following transforms so 
that when I exit the embedded list, that is where I need to check if the next 
item is in the top-level list. The changes are as follows:

<xsl:template match="OL_LI">
<xsl:if test="not(preceding-sibling::*[1][self::OL_LI|self::EM_OL_LI])">
        <p>
                <ol>
                        <xsl:apply-templates select="." mode="li"/>
                </ol>
        </p>
</xsl:if>
</xsl:template>

<xsl:template name="OL_LI" match="OL_LI" mode="li">
        <li><xsl:apply-templates /></li>
        <xsl:apply-templates select="following-sibling::*[1][self::EM_OL_LI]"/>
        <xsl:apply-templates select="following-sibling::*[1][self::EM_UL_LI]"/>
        <xsl:apply-templates select="following-sibling::*[1][self::OL_LI]" 
mode="li"/>
</xsl:template>

<xsl:template match="EM_OL_LI">
        <xsl:if test="not(preceding-sibling::*[1][self::EM_OL_LI])">
                <p>
                        <ol>
                                <xsl:apply-templates select="." mode="li"/>
                        </ol>
                </p>
        </xsl:if>
        <xsl:apply-templates select="following-sibling::*[1][self::OL_LI]" 
mode="li"/>
        <xsl:apply-templates select="following-sibling::*[1][self::UL_LI]" 
mode="li"/>
</xsl:template>

<xsl:template match="EM_OL_LI" mode="li">
        <li><xsl:apply-templates/></li>
        <xsl:apply-templates select="following-sibling::*[1][self::EM_OL_LI]" 
mode="li"/>
</xsl:template>



But now my problem is my output is:

<p>
   <ol>
      <li>Top: Item 1</li>
      <p>
         <ol>
            <li>Sub A: Item 1</li>
         </ol>
      </p>
      <li>Top: Item 2</li>
      <p>
         <ol>
            <li>Sub B: Item 1</li>
            <li>Sub B: Item 2</li>
            <li>Sub B: Item 3</li>
         </ol>
      </p>
   </ol>
</p>

And the list cuts off after the second item without continuing to the next 
item. My output should be:

<p>
   <ol>
      <li>Top: Item 1</li>
      <p>
         <ol>
            <li>Sub A: Item 1</li>
         </ol>
      </p>
      <li>Top: Item 2</li>
      <p>
         <ol>
            <li>Sub B: Item 1</li>
            <li>Sub B: Item 2</li>
            <li>Sub B: Item 3</li>
         </ol>
      </p>
      <li>Top: Item 3</li>
      <p>
         <ol>
            <li>Sub C: Item 1</li>
            <li>Sub C: Item 2</li>
         </ol>
      </p>
   </ol>
</p>