XSLT中的条件位置检查

时间:2011-09-29 12:37:18

标签: xslt xpath position conditional

我有一个呈现文章的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() &lt; $limit">

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

有人能用最佳/最好的方式指出我正确的方向吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

只需使用

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

<强>解释

  1. 如果$limit的值可转换为数字,则上面select属性中的表达式选择不超过$limit个节点

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