XSLT を使用して、XML ドキュメントをある Doctype から別の Doctype に変換しています。簡略化した形式では、次のようなものがあります。
<section>
    <title>Title</title>
    <a>content1</a>
    <a>content2</a>
    <a>content3</a>
    <a>content4</a>
    <b>other content</b>
    <a>content5</a>
    <a>content6</a>
    <a>content7</a>
    <c>other content</c>
    <a>content8</a>
    <a>content9</a>
    <a>content10</a>
</section>
私が望むのは、<a>要素のグループの周りにラッパーを配置することです。そのため、翻訳された結果は次のようになります。
<section>
    <title>Title</title>
    <a-wrapper>
        <a>content1</a>
        <a>content2</a>
        <a>content3</a>
        <a>content4</a>
    </a-wrapper>
    <b>other content</b>
    <a-wrapper>
        <a>content5</a>
        <a>content6</a>
        <a>content7</a>
    </a-wrapper>
    <c>other content</c>
    <a-wrapper>
        <a>content8</a>
        <a>content9</a>
        <a>content10</a>
    </a-wrapper>
</section>
私の現在のテンプレートは次のようになります。
<xsl:template match="a">
    <xsl:choose>
        <xsl:when test="not(preceding-sibling::a)">
            <xsl:element name="a-wrapper">
                <xsl:element name="a">
                    <xsl:apply-templates/>
                </xsl:element>
                <xsl:apply-templates select="following-sibling::a[generate-id(preceding-sibling::a[last()]) = generate-id(current())]"/>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="a">
                <xsl:apply-templates/>
            </xsl:element>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
これは私をそこに途中で連れて行きます。問題は、apply-templates タグの select 句がすべてのタグを取得している<a>ことです。最初の非タグで停止したい場合<a>、つまり、最初のタグの処理によって<a>10 個すべてのタグが最初のタグ内に配置さ<a>れます。<a-wrapper>最初の 4 つだけが必要な場合。<a-wrapper>これには、5 番目のタグによって生成されるようなネストされたタグを挿入する効果もありますが、これ<a>は DTD では許可されていません。
問題は、最初の非<a>タグで終わる次の兄弟のサブセットをどのように選択するかです。