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>
我 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>