Html 如何包装<;h2>;及<;p>;a中的标签<;第节>;xslt中的标记?
我想将标题和段落包装在节标记中。节标记在下一个标题出现时结束 输入:Html 如何包装<;h2>;及<;p>;a中的标签<;第节>;xslt中的标记?,html,xml,xslt,Html,Xml,Xslt,我想将标题和段落包装在节标记中。节标记在下一个标题出现时结束 输入: <body> <h2>text text</h2> <p> some text </p> <p> some text </p> <h2> text text </h2> <p> some text </p> <p> some text &
<body>
<h2>text text</h2>
<p> some text </p>
<p> some text </p>
<h2> text text </h2>
<p> some text </p>
<p> some text </p>
<p> some text </p>
</body>
文本
一些文本
一些文本
文本
一些文本
一些文本
一些文本
输出:
<body>
<section>
<h2>text text</h2>
<p> some text </p>
<p> some text </p>
</section>
<section>
<h2> text text </h2>
<p> some text </p>
<p> some text </p>
<p> some text </p>
</section>
</body>
文本
一些文本
一些文本
文本
一些文本
一些文本
一些文本
如评论中所述,这是一个分组问题
如果您使用的是XSLT2.0,那么可以使用xsl:for each group/@group,以开头
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/body">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:for-each-group select="*" group-starting-with="h2">
<section>
<xsl:copy-of select="current-group()"/>
</section>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这两个样式表产生相同的输出。您是否只需要处理每个h2
和p
标记,或者是否还需要处理其他标记(例如h3
或p
以外的“节”内容)?是的,在h2标记下面可以有其他标记。但该节必须从h2标记开始,在下一个h2标记之前结束。这是一个分组问题。XSLT1.0或2.0的答案是不同的。无论如何,进行搜索-这可能是这里最常问的问题。中以
示例开头的每个组的,应该可以让您了解是否可以使用XSLT 2.0处理器。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="sectElems" match="/body/*[not(self::h2)]"
use="generate-id(preceding-sibling::h2[1])"/>
<xsl:template match="/body">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="h2"/>
</xsl:copy>
</xsl:template>
<xsl:template match="h2">
<xsl:variable name="id">
<xsl:value-of select="generate-id()"/>
</xsl:variable>
<section>
<xsl:copy-of select=".|key('sectElems',$id)"/>
</section>
</xsl:template>
</xsl:stylesheet>