我有一个呈现文章的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并不是很好。
有人能用最佳/最好的方式指出我正确的方向吗?
谢谢!
答案 0 :(得分:2)
只需使用:
<xsl:for-each select="$allNodes[not(position() > $limit)]">
<强>解释强>:
如果$limit
的值可转换为数字,则上面select
属性中的表达式选择不超过$limit
个节点
如果$limits
的值不能转换为数字(例如空或'abc'),则转换为NaN。根据定义,涉及NaN的比较始终为false()
,因此谓词not(position() > $limit
为true()
,在这种情况下,$allNodes
中的所有节点都会被选中。