XSLT - 对以下兄弟姐妹使用 for-each-group

XSLT - Using for-each-group for following siblings

我 xml 如下,

<doc>
    <h1>header 1</h1>
    <p>para</p>
    <p>para</p>

    <h1>header 2</h1>
    <p>para</p>
    <h2>header 2 sub h1</h2>
    <h2>header 2 sub h2</h2>

    <h1>header 3</h1>
    <p>para</p>
    <p>para</p>

    <h1>header 4</h1>
    <h2>header 4 sub h1</h2>
    <p>para</p> 

</doc>

我需要的是分别获取所有 <h1><h2> 节点并创建一个带链接的无序列表,

所以期望的输出是,

<doc>
   <ul>
      <li><h1><a href="page-header1-1">header 1</a></h1></li>

      <li><h1><a href="page-header1-2">header 2</a></h1></li>
         <ul> 
            <li><h2><a href="page-header2-1">header 2 sub h1</a></h2></li>
            <li><h2><a href="page-header2-2">header 2 sub h2</a></h2></li>
         </ul>

      <li><h1><a href="page-header1-3">header 3</a></h1></li>

      <li><h1><a href="page-header1-4">header 4 sub h1</a></h1></li>
         <ul>
            <li><h2><a href="page-header2-3">zz</a></h2></li>
         </ul>
   </ul>
</doc>

我已经编写了以下 xsl 来完成此任务,

<xsl:template match="doc">
        <div>
            <ul>
                <xsl:for-each-group select="*" group-starting-with="h1">
                    <li><a href="page-header1-{count(preceding::h1)+1}"> <xsl:copy-of select="."/></a> </li>
                    <ul>
                        <li><a href="page-header2-{count(preceding::h2)+1}"><xsl:apply-templates select="current-group()[self::h2]"/></a></li>
                    </ul>
                </xsl:for-each-group>
            </ul>
        </div>
    </xsl:template>

我的输出是这样的,

 <doc>
    <ul>
        <li><a href="page-header1-1"><h1>header 1</h1></a></li>
            <ul><li><a href="page-header2-1"/></li></ul>

        <li><a href="page-header1-2"><h1>header 2</h1></a></li>
            <ul>
                <li>
                    <a href="page-header2-1">
                        <h2>header 2 sub h1</h2>
                        <h2>header 2 sub h2</h2>
                    </a>
                </li>
            </ul>

        <li><a href="page-header1-3"><h1>header 3</h1></a></li>
            <ul><li><a href="page-header2-3"/></li></ul>

        <li><a href="page-header1-4"><h1>header 4</h1></a></li>
            <ul>
                <li>
                    <a href="page-header2-3">
                        <h2>header 4 sub h1</h2>
                    </a>
                </li>
            </ul>
    </ul>
</doc>

我发现了 2 个错误

1) 它添加空 <a href="page-header2-x"></a> 值,其中没有 <h1> 的后续兄弟。 (见第 1 和第 3 <h1> 秒的结果)

2) <a> 没有单独添加到 <h2> 个节点。但它将 <a> 添加到连续放置的 <h2> 组中。 (请参阅结果中的第 2 个 <h1>)但是我需要为每个 <h2>.

分别添加 <a>

我已经使用 <xsl:apply-templates select="current-group()[self::h2]"/> 获得了 <h2> ,它似乎 returns 所有 <h2> 作为一个组而不是 returns 分开。

任何人都可以建议我解决这个问题的方法..

<ul> <li><a href="page-header2-{count(preceding::h2)+1}"><xsl:apply-templates select="current-group()[self::h2]"/></a></li> </ul>改为

<xsl:variable name="h2" select="current-group()[self::h2]"/> <xsl:if test="$h2"> <ul> <xsl:apply-templates select="$h2"/> </ul> </xsl:if>

并添加模板 <xsl:template match="h2"> <li><a href="page-header2-{position()"><xsl:copy-of select="."/></a></li> </xsl:template>