[XML-DEV Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Generating implicit wrapper element
(I am sorry to continue this thread on xml-dev) Please try this XSLT stylesheet <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" /> <xsl:template match="/root"> <root> <xsl:for-each select="*"> <xsl:choose> <xsl:when test="self::par"> <p><xsl:value-of select="." /></p> </xsl:when> <xsl:otherwise> <xsl:if test="(name(preceding-sibling::*[1]) = 'par') or (position() = 1)"> <ul> <xsl:call-template name="makegroup"> <xsl:with-param name="nodeset" select="self::* | following-sibling::*" /> </xsl:call-template> </ul> </xsl:if> </xsl:otherwise> </xsl:choose> </xsl:for-each> </root> </xsl:template> <xsl:template name="makegroup"> <xsl:param name="nodeset" /> <xsl:if test="name($nodeset[1]) = 'li'"> <xsl:copy-of select="$nodeset[1]" /> <xsl:call-template name="makegroup"> <xsl:with-param name="nodeset" select="$nodeset[position() > 1]" /> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet> For e.g. when it is applied to XML <root> <par>my first para</par> <par>second para</par> <li>first list item of first list</li> <li>second list item of first list</li> <li>third list item of first list</li> <par>third para</par> <li>first list item of second list</li> <par>fourth para</par> <li>first list item of third list</li> <li>second list item of third list</li> </root> The output produced is <?xml version="1.0" encoding="UTF-8"?> <root> <p>my first para</p> <p>second para</p> <ul> <li>first list item of first list</li> <li>second list item of first list</li> <li>third list item of first list</li> </ul> <p>third para</p> <ul> <li>first list item of second list</li> </ul> <p>fourth para</p> <ul> <li>first list item of third list</li> <li>second list item of third list</li> </ul> </root> Regards, Mukul --- Ferdinand Soethe <xml-dev@s...> wrote: > > I have an XML-document with paragraphs and list > items that have no > wrapper element around each list. > > Something like this: > > <par>my first para</par> > <par>second para</par> > <li>first list item of first list</li> > <li>second list item of first list</li> > <li>third list item of first list</li> > <par>third para</par> > <li>first list item of second list</li> > <par>fourth para</par> > <li>first list item of third list</li> > <li>second list item of third list</li> > > In my transformation I would like to add these > implicit wrapper > element around each of the list to get something > like > > <p>my first para</p> > <p>second para</p> > <ul> > <li>first list item of first list</li> > <li>second list item of first list</li> > <li>third list item of first list</li> > </ul> > <p>third para</p> > <ul> > <li>first list item of second list</li> > </ul> > <p>fourth para</p> > <ul> > <li>first list item of third list</li> > <li>second list item of third list</li> > </ul> > > My attempt to solve this with > > <xsl:template match="Aufzaehlungspunkt"> > > <xsl:if test="not(preceding-sibling::li)"> > <ul> > </xsl:if> > > <li><xsl:apply-templates/></li> > > <xsl:if test="not(following-sibling::li)"> > </ul> > </xsl:if> > > </xsl:template> > > ran into two separate problems: > > 1. I'm not allowed to use <ul> without the matching > </ul> (even though > that is in a separate if-branch below. > > 2. The preceding-sibling and following-sibling-axes > are only true when > dealing with the very first and the very last > <li> in the document. > So rather than meaning 'previous element is not > <li>' the meaning > 'there is no more previous <li>-element in this > document'. > > Any ideas how to solve these problems with XML? > > Oh, btw. I saw the solution suggested some years ago > > <officers> > <xsl:for-each select='/doc/person[@er="officer"]'> > <person><xsl:value-of select='.'/></person> > </xsl:for-each> > </officers> > > <xsl:for-each > select='/doc/person[not(@er="officer")]'> > <person><xsl:value-of select='.'/></person> > </xsl:for-each> > > </perslist> > </xsl:template> > > but this doesn't seem to be an option since I'm not > using the > procedural style of processing my document. > > Thanks for any input, > > -- > Ferdinand > > -- > Ferdinand Soethe ____________________________________________________ Start your day with Yahoo! - make it your home page http://www.yahoo.com/r/hs
|
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
|