2011-09-29 67 views
2

我有一个呈现文章的XSLT文件。我将一个变量传递给XSLT文件,该文件应该限制记录输出的数量。麻烦的是,这个'limit'变量是可选的 - 如果不存在,XSLT文件需要输出所有值;如果“限制”变量是一个数字,那么它只需要输出该数量的项目(大概使用position()测试)。XSLT中的条件位置检查

这里是我的代码:

<xsl:variable name="limit" select="/macro/limit"/> 

<xsl:template match="/"> 
    <xsl:variable name="allNodes" select="$localSiteRoot/descendant-or-self::*[articles != '']"/> 
    <xsl:for-each select="$allNodes"> 

    <div class="articleItem"> 
     <h3><xsl:value-of select="./articleHeader"/></h3> 
     <xsl:if test="./articleSubheader != ''"> 
     <h4><xsl:value-of select="./articleSubheader"/></h4> 
     </xsl:if> 
    </div> 

    </xsl:for-each> 
</xsl:template> 

显然我只是做这周围的XSLT选择,并说

<xsl:choose> 
    <xsl:when select="$limit!= ''"> 
    <xsl:if test="position() &lt; $limit"> 

但后来我需要重复的代码的两倍。必须有更好的方式,也许使用模板,但我无法弄清楚它是如何工作的,而我的XSLT并不好。

任何人都可以用最好/最好的方式指出我正确的方向吗?

谢谢!

回答

2

只需使用

<xsl:for-each select="$allNodes[not(position() > $limit)]"> 

说明

  1. 如果$limit的值是可浇注到一个数,然后在select表达上述属性选择不多于$limit节点。

  2. 如果$limits的值不能转换为数字(例如,空或'abc'),则将其转换为NaN。根据定义,涉及NaN的比较始终为false(),因此谓词not(position() > $limittrue(),并且在这种情况下,选择了$allNodes中的所有节点。

+0

非常整齐 - 很喜欢它,谢谢! – Dan

+0

@丹:不客气。 –