我的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>
s没有兄弟姐妹。 (参见第1和第3 <h1>
条的结果)
2)<a>
未单独添加到<h2>
个节点。但它会将<a>
添加到连续放置的<h2>
组中。 (请参阅结果中的第2 <h1>
项)但我需要为<a>
分别添加<h2>
。
我已使用<xsl:apply-templates select="current-group()[self::h2]"/>
来获取<h2>
,并且它似乎将所有<h2>
作为一组返回,但不会单独返回。
任何人都可以建议我解决这个问题的方法..
答案 0 :(得分:1)
将...
.Select(f => f.FullName + " " + FileSizeDisplay(f, 70))
...
更改为
<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>