将XSL用于每个特定记录受位置限制的语句

时间:2016-01-11 00:46:38

标签: xml loops xslt 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,

考虑以某种方式定义每个循环周期的新变量/参数,然后使用:

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

我想尽可能提高效率。对xsl来说是新手。谢谢。

1 个答案:

答案 0 :(得分:0)

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

<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