0

我想通过顶级h1标签将 XML(实际上是 XHTML)文档分成几部分。从第一个<h1>到下一个的所有内容都应该包含在<section>元素中,依此类推,直到文档结束。

例如,如果我有这个源文档:

<article>
    <h1>Heading 1</h1>
    <p>Some text</p>
    <p>Some more text</p>

    <h1>Heading 2</h1>
    <p>Some text</p>
    <h2>Subheading</h2>
    <p>Some text</p>

    <h1 id="heading3">Heading 3</h1>
    <p>Some text</p>
</article>

我希望结果完全像这样:

<article>
    <section>
        <h1>Heading 1</h1>
        <p>Some text</p>
        <p>Some more text</p>
    </section>
    <section>
        <h1>Heading 2</h1>
        <p>Some text</p>
        <h2>Subheading</h2>
        <p>Some text</p>
    </section>
    <section>
        <h1 id="heading3">Heading 3</h1>
        <p>Some text</p>
    </section>
</article>

问题是我只有 libxslt1.1(因此,XSLT 1.0 + EXSLT)。使用 XSLT 2.0,我可以做一些漂亮的事情,<xsl:for-each-group select="*" group-starting-with="h1">但遗憾的是,这对我来说不是一个可行的选择。

我不想对属性值进行分组(我没有任何有意义的属性),因此,据我所知,Muenchian 分组对我来说不是一个技巧。不过,也许我错了——我几分钟前才读过这种方法。

有没有办法用 XSLT 1.0 实现这一点?

4

2 回答 2

2

据我了解,Muenchian 分组对我来说不是一个技巧。

好吧,非常接近它的东西会:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="grpById" match="*[not(self::h1)]" use="generate-id(preceding-sibling::h1[1])" />

<xsl:template match="/article">
    <xsl:copy>
        <xsl:for-each select="h1">
            <section>
                <xsl:copy-of select=". | key('grpById', generate-id())"/>
            </section>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
于 2016-06-11T19:31:32.407 回答
2

使用一个键name="group" match="article/*[not(self::h1)]" use="count(preceding-sibling::h1)",然后在模板匹配中将模板article应用到h1子元素并在模板中h1创建部分并复制.|key('group', position())

于 2016-06-11T19:41:03.650 回答