XSLT - 为每个兄弟姐妹使用for-each-group

时间:2015-09-11 16:38:40

标签: xml xslt xslt-2.0

我的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>作为一组返回,但不会单独返回。

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

1 个答案:

答案 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>