我正在尝试编写一个XSLT,根据标题级别将HTML文件组织到不同的部分级别。这是我的输入:
<html> <head> <title></title> </head> <body> <h1>HEADER 1 CONTENT</h1> <p>Level 1 para</p> <p>Level 1 para</p> <p>Level 1 para</p> <p>Level 1 para</p> <h2>Header 2 CONTENT</h2> <p>Level 2 para</p> <p>Level 2 para</p> <p>Level 2 para</p> <p>Level 2 para</p> </body> </html>
目前,我正在使用一个非常简单的结构,因此该模式在一段时间内将保持不变。我需要这样的输出…
<document> <section level="1"> <header1>Header 1 CONTENT</header1> <p>Level 1 para</p> <p>Level 1 para</p> <p>Level 1 para</p> <p>Level 1 para</p> <section level="2"> <header2>Header 2 CONTENT</header2> <p>Level 2 para</p> <p>Level 2 para</p> <p>Level 2 para</p> <p>Level 2 para</p> </section> </section> </document>
但是,我无法使其完全满足我的需要。
我正在使用Saxon 9在Oxygen中运行xslt for dev。我将在生产中使用cmd / bat文件。还是Saxon9。如果可能的话,我想处理多达4个嵌套部分。
任何帮助深表感谢!
我需要附加到此,因为我遇到了另一个规定。我可能以前应该想到这一点。
我遇到以下代码示例
<html> <head> <title></title> </head> <body> <p>Level 1 para</p> <p>Level 1 para</p> <p>Level 1 para</p> <p>Level 1 para</p> <h1>Header 2 CONTENT</h1> <p>Level 2 para</p> <p>Level 2 para</p> <p>Level 2 para</p> <p>Level 2 para</p> </body> </html>
正如你所看到的,<p>是一个孩子<body>,而在我的第一个片段,<p>总是头水平的孩子。我希望得到的结果与上述相同,只是当我<p>还是的孩子时遇到的时候<body>,应该将它包裹起来<section level="1">。
<p>
<body>
<section level="1">
<document> <section level="1"> <p>Level 1 para</p> <p>Level 1 para</p> <p>Level 1 para</p> <p>Level 1 para</p> </section> <section level="1"> <header1>Header 2 CONTENT</header1> <p>Level 2 para</p> <p>Level 2 para</p> <p>Level 2 para</p> <p>Level 2 para</p> </section> </document>
这是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]元素就可以分组。
h[n]