|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Converting siblings to children of a node.
I have a source document something like:
<longdesc> <para style="Normal">This is a regular paragraph.</para> <para style="Normal">So is this but what follows is a list:</para> <para style="LS1">Item one</para> <para style="LS1">Item two</para> <para style="Normal">This is a regular paragraph.</para> <para style="Normal">This is a regular paragraph.</para> <para style="Normal">This is a regular paragraph.</para> <para style="Normal">What follows is a list:</para> <para style="LS1">Item one</para> <para style="LS1">Item two</para> <para style="LS1">Item three</para> <para style="Normal">This is a regular paragraph.</para> </longdesc> I would like to translate this to something like <p>This is a regular paragraph.</p> <p>So is this but what follows is a list:</p> <ul> <li>Item one<li> <li>Item two<li> </ul> <p>This is a regular paragraph.</p> <p>This is a regular paragraph.</p> <p>This is a regular paragraph.</p> <p>What follows is a list:</p> <ul> <li>Item one<li> <li>Item two<li> <li>Item three<li> </ul> <p>This is a regular paragraph.</p> I thought I could do this with something like: <xsl:if test="@style='LS1'">
<xsl:if test="not(preceding-sibling::para/@style='LS1')">
<ul>
<li><xsl:value-of select="."/></li>
</xsl:if><xsl:if test="preceding-sibling::para/@style='LS1' and following-sibling::para/@style='LS1'"> <li><xsl:value-of select="."/></li> </xsl:if> <xsl:if test="preceding-sibling::para/@style='LS1' and not(following-sibling::para/@style='LS1')"> <li><xsl:value-of select="."/></li> </ul> </xsl:if> </xsl:if> But of course that won't work. Then, I thought I could do it with recursion, passing the current para element as a variable: <xsl:template match="para[@style='LS1']">
<xsl:if test="not(preceding-sibling::para[@style='LS1'])">
<xsl:variable name="node">
<xsl:copy-of select="."/>
</xsl:variable>
<ul>
<xsl:call-template name="list">
<xsl:with-param name="listitem" select="$node"/>
</xsl:call-template>
</ul>
</xsl:if>
</xsl:template><xsl:template name="list">
<xsl:param name="listitem"/>
<li><xsl:value-of select="$listitem"/></li>
<xsl:if test="following-sibling::para[@style='LS1']">
<xsl:call-template name="list">
<xsl:with-param name="listitem">
<xsl:copy-of select="following-sibling::para"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>But that doesn't change the context to the preceding-sibling, so it loops. Any suggestions? XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|
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








