结合 XSL for-each 语句,其中特定记录受位置限制

Combine XSL for-each statements where specific records are limited by position

下面的代码实现了预期的结果,但感觉草率。是否可以合并 for-each 语句?

XSL:

            <xsl:for-each select="ROW[Start_Time = '2:00 PM']">
            <xsl:sort select="order" order="descending" data-type="number" />
            <xsl:value-of select="Brand" /><br/>
            </xsl:for-each>

            Top5: 
            <xsl:for-each select="ROW[Start_Time = '2:00 PM']">
            <xsl:sort select="order" order="descending" data-type="number" />
            <xsl:if test="not(position() &gt; '5')">
            <xsl:value-of select="Brand" />, 
            </xsl:if>
            </xsl:for-each>

工作输出:

            Nike
            Addidas
            Coke
            Pepsi
            Burger King
            Sprite
            Root Beer
            Brio Chinotto

            Top5: Nike, Addidas, Coke, Pepsi, Burger King,

正在考虑以某种方式为每个循环周期定义一个新的 variable/parameter,然后使用:

            <xsl:value-of select="$Brand_Position1" />, 
            <xsl:value-of select="$Brand_Position2" />,
            ...
            <xsl:value-of select="$Brand_Position5" />,

我想让它尽可能高效。我是 xsl 的新手。谢谢你。

我认为最好从以下内容开始:

<xsl:variable name="sorted-rows">
    <xsl:for-each select="ROW[Start_Time = '2:00 PM']">
        <xsl:sort select="order" order="descending" data-type="number" />
        <xsl:copy-of select="." />
    </xsl:for-each>
</xsl:variable>

这样节点只排序一次。

然后,假设您使用的是 XSLT 1.0,您可以执行以下操作:

<xsl:variable name="sorted-rows-set" select="exsl:node-set($sorted-rows)/ROW" />

和:

<xsl:for-each select="$sorted-rows-set">
    <xsl:value-of select="Brand"/><br/>
</xsl:for-each>

和:

<xsl:text>Top 5:</xsl:text>
<xsl:for-each select="$sorted-rows-set[position() &lt;= 5]">
    <xsl:value-of select="Brand"/>
    <xsl:text>,</xsl:text>
</xsl:for-each>

参见:http://exslt.org/exsl/functions/node-set/index.html