限制排序的条件xsl:for-each结果为n个值

时间:2010-08-17 18:43:08

标签: xslt

我在网站上环顾四周,但无法找到特定XSL问题的解决方案。如果你认为这是一个重复的帖子,我道歉并感谢你指出正确的方向。

基于下面相对简单的XML数据集,我想按项目创建一个表,但也将条目限制为更容易“消化”的项目,如该项目的“最新”10。

+---------------------------------------------------+  
| Alpha                   | Beta                    |  
+---------------------------------------------------+  
| Log_20091014_0900PM.xml | Log_20091015_0900PM.xml |  
| Log_20091013_0900PM.xml | ...                     |  
| ...                     |                         |  
+---------------------------------------------------+  
| Gamma                   | Delta                   |  
+---------------------------------------------------+  
| ...                     | ...                     |  
+---------------------------------------------------+  

表单的XML源数据:

<LogResults>
  <Result>
    <Project>Alpha</Project>
    <Data>Log_20091013_0900PM.xml</Data>
    <Name>Log_20091013_0900PM.xml</Name>
  </Result>
  <Result>
    <Project>Alpha</Project>
    <Data>Log_20091014_0900PM.xml</Data>
    <Name>Log_20091014_0900PM.xml</Name>
  </Result>
  <Result>
    <Project>Beta</Project>
    <Data>Log_20091015_0900PM.xml</Data>
    <Name>Log_20091015_0900PM.xml</Name>
  </Result>
  <Result>
    <Project>Gamma</Project>
    <Data>Log_20091016_0900PM.xml</Data>
    <Name>Log_20091016_0900PM.xml</Name>
  </Result>
  <Result>
    <Project>Delta</Project>
    <Data>Log_20091019_0900PM.xml</Data>
    <Name>Log_20091019_0900PM.xml</Name>
  </Result>
  <Result>
    <Project>Delta</Project>
    <Data>Log_20091020_0900PM.xml</Data>
    <Name>Log_20091020_0900PM.xml</Name>
  </Result>
  ...
</LogResults>

我可以使用以下XSL的适当变体显示每个项目的 ALL 结果:

<xsl:for-each select="LogResults/Result">
  <xsl:sort select="Data" order="descending" />
  <xsl:if test="(Project='Alpha')">
    <li>
      <a style="font-size:11pt;">
        <xsl:attribute name="href">
          Alpha/<xsl:value-of select="Data" />
        </xsl:attribute>
        <xsl:value-of select="Name" />
      </a>
    </li>
  </xsl:if>
</xsl:for-each>

问题:

是否可以将结果限制为“最新”10(或20 ......)?如果是这样,你会怎么建议这样做?

我尝试以下列方式使用position(),例如

<xsl:for-each select="(LogResults/Result) [position &lt; 11]">

<xsl:if test="(Project='Alpha')">
  <xsl:for-each select=". [position &lt; 11]">
    <li>
      <a style="font-size:11pt;">
        <xsl:attribute name="href">
          Alpha/<xsl:value-of select="Data" />
        </xsl:attribute>
        <xsl:value-of select="Name" />
      </a>
    </li>
  </xsl:for-each>
</xsl:if>

但到目前为止我无法让它发挥作用。当然,因为现在更多的是追踪和错误。

非常感谢您阅读本书以及任何可能的建议。 -T

1 个答案:

答案 0 :(得分:13)

你非常接近正确的解决方案。

使用

<xsl:for-each select="LogResults/Result[Project='Alpha']">
  <xsl:sort select="Data" order="descending" />
  <xsl:if test="not(position() > 10)">
    <li>
      <a style="font-size:11pt;">
        <xsl:attribute name="href">
          Alpha/<xsl:value-of select="Data" />
        </xsl:attribute>
        <xsl:value-of select="Name" />
      </a>
    </li>
  </xsl:if>
</xsl:for-each>