Loop xslt шаблон - PullRequest
       3

Loop xslt шаблон

1 голос
/ 09 июня 2011

Я знаю, что есть похожие, более сложные посты, но я просто не могу заставить эту простую вещь работать.У меня есть очень простой цикл XSLT, который мне нужно выполнить 5 раз.Вот и все.

Вот что у меня есть:

<xsl:template match="/">
  <div id="container">
    <xsl:for-each select="$currentPage/myItems/data/item">
      <img src="image.gif" />
    </xsl:for-each>
  </div>
</xsl:template>

Это отлично работает, мне просто нужно зациклить эту часть:

    <xsl:for-each select="$currentPage/myItems/data/item">
      <img src="image.gif" />
    </xsl:for-each>

пять раз, так чтовывод буквально просто повторяется 5 раз.Я не хочу просто копировать и вставлять его пять раз (хотя это работает), так как должен быть лучший способ справиться с этим.

Может кто-нибудь указать мне правильное направление на это?Спасибо!

Ответы [ 4 ]

2 голосов
/ 09 июня 2011

Технически XSLT предназначен для преобразования данных; зацикливание заданного числа раз больше соответствовало бы генерации данных. К сожалению, подходящим способом было бы скопировать и вставить его 5 раз.

Кроме того, вы, вероятно, потратили больше времени на задание этого вопроса, чем на копирование и вставку:)

1 голос
/ 09 июня 2011

В XSLT 2.0 вы можете сделать:

<xsl:for-each select="1 to $n">
   ....
</xsl:for-each>

В 1.0 у вас есть выбор: вы можете использовать рекурсию (шаблон вызывает сам себя, передавая счет в качестве параметра, и завершается, когда счет падает донуль);или вы можете использовать обходной путь

<xsl:for-each select="(//node())[position() &lt;= $n]">

при условии, что в вашем документе более $ n узлов.

Конечно, как уже отмечали другие, если $ n всегда и всегда будетвсегда быть 5, вы можете просто повторить код 5 раз.

1 голос
/ 09 июня 2011

Извините, но какая разница с использованием:

<xsl:template match="/">
  <div id="container">
    <xsl:for-each select="$currentPage/myItems/data/item">
      <img src="image.gif" />
      <img src="image.gif" />
      <img src="image.gif" />
      <img src="image.gif" />
      <img src="image.gif" />
    </xsl:for-each>
  </div>
</xsl:template>

или, лучше:

<xsl:template match="/">
  <div id="container">
        <xsl:apply-templates select="$currentPage/myItems/data/item" mode="image"/>
  </div>
</xsl:template>

<xsl:template match="item" mode="image">
    <img src="image.gif" />
    <img src="image.gif" />
    <img src="image.gif" />
    <img src="image.gif" />
    <img src="image.gif" />
</xsl:template>
1 голос
/ 09 июня 2011

Единственная обязательная циклическая конструкция в XSLT - это for-each, но она зацикливается на узлах во входном документе.Если вы не хотите реализовывать с помощью рекурсии, поместите внутреннюю часть цикла в именованный шаблон и затем используйте call-template пять раз для его вызова.

Что-то вроде:

<xsl:template name='inside-loop'>
  <xsl:for-each select="$currentPage/myItems/data/item">
    <img src="image.gif" />
  </xsl:for-each>
</xsl:template>

и затем, где вы хотите назвать это:

<xsl:call-template name='inside-loop' />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...