Условная проверка позиции в XSLT - PullRequest
2 голосов
/ 29 сентября 2011

У меня есть 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 Ответ

2 голосов
/ 29 сентября 2011

Просто используйте :

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

Объяснение :

  1. Если значение $limit преобразуется в число , тогда выражение в атрибуте select выше выбирает не более $limit узлов.

  2. Если значение $limits не может быть преобразовано в число (например, пусто или 'abc'), затем оно преобразуется в NaN.По определению сравнения с участием NaN всегда false(), поэтому предикат not(position() > $limit равен true(), и в этом случае выбираются все узлы в $allNodes.

...