【问题标题】:Conditional position-check in XSLTXSLT 中的条件位置检查
【发布时间】:2011-09-29 12:37:17
【问题描述】:

我有一个呈现文章的 XSLT 文件。我将一个变量传递到 XSLT 文件中,该文件应该限制输出的记录数。问题是,这个“限制”变量是可选的——如果它不存在,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 也不是很好。

谁能用最好/最简洁的方法为我指明正确的方向?

谢谢!

【问题讨论】:

    标签: xslt xpath position conditional


    【解决方案1】:

    只需使用

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

    解释

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 2020-02-20
      相关资源
      最近更新 更多