Ограничить отсортированный условный xsl: for-each результаты до n значений - PullRequest
8 голосов
/ 17 августа 2010

Я осмотрел сайт, но не смог найти решение конкретной проблемы 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>

Я могу показать ALL результаты для каждого проекта с соответствующими вариациями следующего XSL:

<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>

Но пока я не мог заставить его работать. Конечно, потому что сейчас больше ошибок и следов.

Большое спасибо за то, что даже прочитали это и любой потенциальный совет. -Т

1 Ответ

13 голосов
/ 17 августа 2010

Вы достаточно близки к правильному решению.

Используйте

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...