【问题标题】:Group and sort into muliple columns XSLT分组和排序到多列 XSLT
【发布时间】:2011-10-04 18:04:33
【问题描述】:

我有一个 XML 格式的动物列表。我想按班级对它们进行分组,并将它们显示在三行的表格中。我可以使用 XSLT 2.0 和 for-each-group 来完成此操作

<zoo>
<animal class="fish">Koi</animal>
<animal class="fish">Lamprey</animal>
<animal class="bird">Chicken</animal>
<animal class="fish">Firefish</animal>
<animal class="fish">Bluegill</animal>
<animal class="bird">Eagle</animal>
<animal class="fish">Eel</animal>
<animal class="bird">Osprey</animal>
<animal class="bird">Turkey</animal>
<animal class="fish">Guppy</animal>
</zoo>

XSLT 是:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" name="html" doctype-system="about:legacy-compat" />
<xsl:template match="/">
<html><head></head><body>
      <xsl:for-each-group select="//animal" group-by="@class">
        <table>
            <xsl:for-each-group select="current-group()" group-adjacent="ceiling(position() div 3)">
           <tr>
               <xsl:for-each select="current-group()">
                   <xsl:apply-templates select="."/>
               </xsl:for-each>
            </tr>
        </xsl:for-each-group>
        </table>
      </xsl:for-each-group>
    </body></html>
</xsl:template>

<xsl:template match="animal">
  <td><xsl:value-of select="."/></td>
</xsl:template>

</xsl:stylesheet>

除了我需要对动物名称进行排序之外,输出几乎是完美的。

我尝试使用 就像 Michael Kay 向某人 here 建议的那样。但这导致了堆栈溢出。任何想法如何在我的分组和多列列表中对动物的名称进行排序?

【问题讨论】:

    标签: xslt-2.0 xslt-grouping


    【解决方案1】:

    &lt;xsl:for-each&gt;内添加排序标签

    <xsl:for-each select="current-group()">
        <xsl:sort data-type="text" select="." order="ascending"/>
        <xsl:apply-templates select="."/>
    </xsl:for-each>
    

    【讨论】:

    • 对行中的每一行进行排序,每行三个。我需要对整个列表进行排序。
    【解决方案2】:

    这是一个有效的解决方案(虽然我不确定我是否理解为什么)。

    <xsl:variable name="unsorted" select="current-group()"/>
    <xsl:variable name="sorted">
      <xsl:perform-sort select="current-group()">
        <xsl:sort select="."/>
      </xsl:perform-sort>
    </xsl:variable>
    <xsl:for-each-group select="$sorted/animal" group-adjacent="ceiling(position() div 3)">
       <tr>
       <xsl:for-each select="current-group()">
         <xsl:apply-templates select="."/>
       </xsl:for-each>
       </tr>
    </xsl:for-each-group>
    

    (当然你不需要任何“未排序”变量。它只是为了比较)

    奇怪的是,如果我在 for-each-group 中使用 $unsorted,它会像我期望的那样构建未排序的列表。但是,如果我使用 $sorted,我必须使用“$sorted/animal”,原因我不太明白。

    【讨论】:

    • 我认为这很好,你做了什么。
    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多