这是XSLT 2.0样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mf="http://example.com/mf" exclude-result-prefixes="xs mf" version="2.0"> <xsl:output indent="yes"/> <xsl:function name="mf:group" as="node()*"> <xsl:param name="elements" as="element()*"/> <xsl:param name="level" as="xs:integer"/> <xsl:for-each-group select="$elements" group-starting-with="*[local-name() eq concat('h', $level)]"> <xsl:choose> <xsl:when test="self::*[local-name() eq concat('h', $level)]"> <section level="{$level}"> <xsl:element name="header{$level}"><xsl:apply-templates/></xsl:element> <xsl:sequence select="mf:group(current-group() except ., $level + 1)"/> </section> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="current-group()"/> </xsl:otherwise> </xsl:choose> </xsl:for-each-group> </xsl:function> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@*, node()"/> </xsl:copy> </xsl:template> <xsl:template match="/html"> <document> <xsl:apply-templates select="body"/> </document> </xsl:template> <xsl:template match="body"> <xsl:sequence select="mf:group(*, 1)"/> </xsl:template></xsl:stylesheet>它应该按照您的要求执行操作,尽管它不会在四个嵌套级别处停止,而是只要找到
h[n]元素就可以分组。



