我有一个呈现文章的XSLT文件。我正在将变量传递到XSLT文件中,该文件应该限制记录输出的数量。麻烦的是,这个'limit'变量是可选的-如果不存在,则XSLT文件需要输出所有值;如果'limit'变量是一个数字,则只需要输出该数目的项目(大概使用position()测试)。
这是我的代码:
<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() < $limit">
但是然后我需要重复两次代码。必须有一个更好的方法,也许使用模板,但是我无法弄清楚它如何工作,而我的XSLT也不是很好。
谁能以最佳/最正确的方式指出正确的方向?
谢谢!
最佳答案
只需使用:
<xsl:for-each select="$allNodes[not(position() > $limit)]">
说明:
如果
$limit
的值可强制转换为数字,则上述select
属性中的表达式选择的节点不超过$limit
个。如果
$limits
的值不能转换为数字(例如空或'abc'),则将其转换为NaN。根据定义,涉及NaN的比较始终为false()
,因此谓词not(position() > $limit
为true()
,在这种情况下,选择$allNodes
中的所有节点。
关于xslt - XSLT中的条件位置检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7597424/