|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: XSLT 1.0: Grouping Adjacent Elements in Embedded
Hi Joe,
Sorry to do it this way, but it was easier for me to rewrite the script than to debug it. I have once build a stylesheet that converts mapping rules into a xsl. This mapping definition contained a command to gather sequences of elements into a wrapper element. It is related to the sort grouping problem, but that doesn't help you if you have to interfere the wrapping at the encounter of a certain element and continue it afterwards. Anyhow, I conceived some nice methods to just do the trick you are trying to do. In your case the code would look like the following. Note that I have wrapped you initial dataset in a DATA element. Msxsl seems to give the correct output. Grtz, Geert <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!--+ ==============================================================
| output
+--><xsl:output method="xml" indent="yes" encoding="utf-8" /> <!--+ ==============================================================
| main group
+--> <xsl:template match="DATA">
<html>
<xsl:apply-templates select="node()" />
</html>
</xsl:template> <xsl:template match="OL_LI">
<!-- jump to start-top-level-list group to start top level nesting -->
<xsl:apply-templates select="." mode="start-top-level-list"/>
</xsl:template> <xsl:template match="EM_OL_LI">
<!-- suppress at this level, you are outside the top-level wrappers! -->
</xsl:template><!--+ ==============================================================
| group top-level-list
+--> <xsl:template match="@*|node()" mode="start-top-level-list">
<!-- jump back to main group, if nothing else matches! -->
<xsl:apply-templates select="." />
</xsl:template> <xsl:template match="OL_LI" mode="start-top-level-list">
<p>
<ol>
<li><xsl:apply-templates /></li>
<!-- jump to continue-top-level-list to find out whether sub level list should be started -->
<xsl:apply-templates select="following-sibling::node()[1]" mode="continue-top-level-list"/>
</ol>
</p>
</xsl:template> <xsl:template match="EM_OL_LI" mode="start-top-level-list">
<!-- suppress at this level, you are outside the top-level wrappers! -->
</xsl:template><!--+ ==============================================================
| group continue-top-level-list
+--><xsl:template match="@*|node()" mode="continue-top-level-list"> <!-- skip attributes, text, comments and pi's --> <!-- Note: you might want to copy these with xsl:copy-of select="." or call an other template group, perhaps the main group --> <xsl:apply-templates select="following-sibling::node()[1]" mode="continue-top-level-list"/> </xsl:template> <xsl:template match="*" mode="continue-top-level-list">
<!-- end continuation as an element is encountered that doesn't belong in this group -->
</xsl:template> <xsl:template match="EM_OL_LI" mode="continue-top-level-list">
<!-- jump to top-level-list group to start top level nesting -->
<xsl:apply-templates select="." mode="start-sub-level-list"/>
<!-- this also stops continuation in this group, as the sub-level-list continues itself -->
</xsl:template><!--+ ==============================================================
| group start-sub-level-list
+--> <xsl:template match="@*|node()" mode="start-sub-level-list">
<!-- jump back to continue-top-level-list, if nothing else matches! -->
<xsl:apply-templates select="." mode="continue-top-level-list" />
</xsl:template> <xsl:template match="EM_OL_LI" mode="start-sub-level-list">
<p>
<ol>
<li><xsl:apply-templates /></li>
<xsl:apply-templates select="following-sibling::node()[1]" mode="continue-sub-level-list"/>
</ol>
</p>
</xsl:template><!--+ ==============================================================
| group continue-sub-level-list
+--><xsl:template match="@*|node()" mode="continue-sub-level-list"> <!-- skip attributes, text, comments and pi's --> <!-- Note: you might want to copy these with xsl:copy-of select="." or call an other template group, perhaps the main group --> <xsl:apply-templates select="following-sibling::node()[1]" mode="continue-sub-level-list"/> </xsl:template> <xsl:template match="*" mode="continue-sub-level-list">
<!-- end continuation as an element is encountered that doesn't belong in this group -->
</xsl:template> <xsl:template match="EM_OL_LI" mode="continue-sub-level-list">
<!-- output sub level list item -->
<li><xsl:apply-templates /></li>
<!-- continue with following EM_OM_LI elements -->
<xsl:apply-templates select="following-sibling::node()[1]" mode="continue-sub-level-list"/>
</xsl:template></xsl:stylesheet>
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








