2010-08-17 24 views
7

Miré alrededor en el sitio pero no pude encontrar una solución a un problema XSL en particular. Si reconoces esto como una publicación duplicada, me disculpo y agradeceré que me apuntes en la dirección correcta.Límite ordenado xsl condicional: para-cada resultado para n valores

Basado en el conjunto de datos XML relativamente simple a continuación, quiero crear una tabla por proyecto, pero también limitar las entradas a algo más 'digestible' como el '10 más nuevo' para ese proyecto.

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

datos de origen XML de la forma:

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

soy capaz de mostrar TODAS resultados para cada proyecto con variaciones adecuadas de lo siguiente 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> 

Pregunta :

¿Es posible limitar los resultados a los 10 más nuevos (o 20 ...)? Y si es así, ¿cómo sugerirías que esto se haga?

He intentado utilizar position() de la siguiente manera, por ejemplo,

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

o

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

Pero hasta ahora no pude conseguir que funcione. Ciertamente porque es más rastro y error en este momento.

Muchas gracias por leer este y cualquier posible consejo. -T

+0

Buena pregunta (1). Ver mi respuesta para una solución detallada. –

Respuesta

12

Estás bastante cerca de la solución correcta.

Uso:

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

+1 Estabas bien, lo veo ahora. Eliminar mi respuesta –

+0

¡Impresionante! Muchas gracias :) – Tobias

Cuestiones relacionadas