[Home] [By Thread] [By Date] [Recent Entries]
Jostein Austvik Jacobsen wrote:
I've got this flat-structured XML: The following stylesheet creates above output structure, only white space/indenting is different from what you posted: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mf="http://example.com/2009/mf" exclude-result-prefixes="xs mf"> <xsl:output indent="yes"/> <xsl:strip-space elements="*"/> <xsl:function name="mf:group" as="node()*"> <xsl:param name="nodes" as="node()*"/> <xsl:param name="level" as="xs:integer"/> <xsl:for-each-group select="$nodes" group-starting-with="headline[@level = $level]"> <xsl:choose> <xsl:when test="self::headline[@level = $level]"> <xsl:element name="level{$level}"> <xsl:element name="h{$level}"> <xsl:value-of select="."/> </xsl:element> <xsl:sequence select="mf:group(current-group() except ., $level + 1)"/> </xsl:element> </xsl:when> <xsl:otherwise> <xsl:copy-of select="current-group()"/> </xsl:otherwise> </xsl:choose> </xsl:for-each-group> </xsl:function> <xsl:template match="document"> <xsl:variable name="v1"> <headline level="1"><xsl:value-of select="metaData/title"/></headline> <xsl:copy-of select="contentSection/node()"/> </xsl:variable> <body> <xsl:sequence select="mf:group($v1/node(), 1)"/> </body> </xsl:template> </xsl:stylesheet> -- Martin Honnen http://msmvps.com/blogs/martin_honnen/
|

Cart



