在嵌套的XSLT for-each循环中对元素进行排序

时间:2018-03-07 11:57:24

标签: html xml sorting xslt foreach

我正在使用从XML到HTML的XSLT转换创建一个已排序标题的项目符号列表。

现在我正在以未分类的方式打印出每个标题:

<xsl:template match="/">
        <html>
            <head>
            </head>
            <body>
                <p>This file contains correspondence: </p>
                <ul>
                    <xsl:for-each select="ead/archdesc/dsc/c01">
                        <xsl:for-each select="c02">                        
                            <li><xsl:value-of select="did/unittitle"/></li>
                        </xsl:for-each>
                    </xsl:for-each>
                </ul>
            </body>
        </html>
    </xsl:template>

每个c02元素都包含在c01元素中,其中有许多元素。因此,如果我将xsl:sort元素放在第二个foreach循环中,对单元标题进行排序,则每个c02元素将被单独排序,而不是完整列表。

将排序元素放在第二个for-each循环中时的输出会重置每个c01元素后的排序。

         <li>Kuiper</li>
         <li>Oort</li>
         <li>Oosterhoff</li>
         <li>Schlesinger</li>
         <li>Shapley</li>
         <li>Sitter, A. de</li>
         <li>Tisdale</li>
         <li>Van Gent</li>
         <li>Bosscha Observatory</li> //Sorting resets

我的问题是,当我在这种情况下嵌套for-each循环时,我如何对整个元素列表进行排序。

编辑:XML源代码段

<dsc>
            <c01 level="series" id="c01">
                <did>
                    <unittitle label="Contents: ">Correspondence by correspondent (no
                        1-6)</unittitle>
                    <daogrp linktype="extended">
                        <daoloc label="reference"
                            href="http://digitalcollections.library.leiden.edu//.html"
                            linktype="locator"/>
                    </daogrp>
                </did>
                <c02 level="item" id="c01.1">
                    <did>
                        <unitid type="EAD">1</unitid>
                        <unittitle label="Contents: ">Van Gent</unittitle>

1 个答案:

答案 0 :(得分:1)

您不需要在此处嵌套xsl:for-each,只需使用一个....

<xsl:for-each select="ead/archdesc/dsc/c01/c02">
   <xsl:sort select="did/unittitle" />
   <li><xsl:value-of select="did/unittitle"/></li>
</xsl:for-each>