Xpoint
   [напомнить пароль]

XSLT-Вывести последоательность в таблицу по N в строке

Метки: [без меток]
2008-07-14 19:17:42 [обр] Principal AG(5/11)[досье]

Все бодрого в.с.
Сам понимаю, что вопрос дилетантский, но напрочь отшибло "как".
Есть набор картинок:
    <images>
        <img xlink:type="simple" xlink:href="img/HR2450.1.jpg"/>
        <img xlink:type="simple" xlink:href="img/HR2450.25s.jpg"/>
        <img xlink:type="simple" xlink:href="img/HR2450.18s.jpg"/>
        <img xlink:type="simple" xlink:href="img/HR2450.12s.jpg"/>
        <img xlink:type="simple" xlink:href="img/HR2450.14s.jpg"/>
        <img xlink:type="simple" xlink:href="img/HR2450.4s.jpg"/>
        <img xlink:type="simple" xlink:href="img/HR2450.11s.jpg"/>
    </images>
Нужно их вывести в HTML-ную табличку, ну скажем по 3шт. в строке. Без сортировок, просто нарезать на ряды.
В цикл xsl:for-each я их загнал, а вот дальше что?
  <xsl:template match="images">
    <xsl:element name="table" use-attribute-sets="attZeros">
      <xsl:for-each select="img">

      </xsl:for-each>
    </xsl:element>
  </xsl:template>

Плз. не пинайте ногами, просто подскажите, давно этим не занимался, напрочь всё забыл.

Заранее спасибо.

спустя 6 часов [обр] Principal AG(5/11)[досье]
Сам вывод я вроде как сделал:
  <xsl:template match="images">
    <xsl:variable name="cnt" select="3"/>
    <xsl:element name="table">
      <xsl:for-each select="img">
        <xsl:variable name="pos" select="position()"/>
        <xsl:if test="$pos mod $cnt = 1">
          <xsl:element name="tr">
            <xsl:for-each select="parent::node()/img[position() &gt;= $pos and position() &lt; $pos + $cnt]">
              <xsl:element name="td">
                <xsl:apply-templates select="."/>
              </xsl:element>
            </xsl:for-each>
          </xsl:element>
        </xsl:if>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>
Остался последний момент - как добить недостающие ячейки пустышками типа <td>&nbsp;</td>, а то не красиво как-то расчитывать colspan для последней ячейки.
Вобщем нужно закрутить цикл на пустом месте типа:
<xsl:variable name="from" select="1"/>
<xsl:variable name="to" select="3"/>
и пустить цикл, чтобы он сделал 3 оборота.
Есть какие ни будь мнения?
Заранее спасибо.
спустя 8 часов [обр] GRAy(64/259)[досье]
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="2.0" xmlns:xlink="urn:aaa/aaa" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" indent="yes" />
<xsl:param name="bound" select="3" />
<xsl:template match="/">
  <xsl:apply-templates select="images" />
</xsl:template>
<xsl:template match="images">
  <xsl:for-each select="img[position() mod $bound = 1]">
  <xsl:variable name="delta" select="$bound - count(.|following-sibling::img[position() &lt; $bound])" />
    <tr>
      <xsl:apply-templates select=".|following-sibling::img[position() &lt; $bound]" />
      <xsl:apply-templates select="../img[position() &lt;= $delta]" mode="dummy" />
    </tr>
  </xsl:for-each>
</xsl:template>
<xsl:template match="img">
  <td><xsl:value-of select="@xlink:href" /></td>
</xsl:template>
<xsl:template match="img" mode="dummy">
  <td>dummy</td>
</xsl:template>
</xsl:stylesheet>
Пояснения нужны?
спустя 2 часа 4 минуты [обр] Principal AG(5/11)[досье]

Нет, пояснения не нужны.
Спасибо конечно, но алгоритм несколько дырявенький.
У меня была аналогичная мысль - просто пропаразитировать на первых N записях, отобрав из них то количество, которого не хватает для пустых ячеек.
А если таких записей нет, вернее не хватает?
Предположим записей попало только 2, а мы пытаемся их нарезать по 5?
По Вашему алгоритму создастся таблица из 4-х ячеек, а нужно из 5-ти.

Поэтому хотелось бы акцентировать ваше внимание на вопросе из моего второго поста:

Вобщем нужно закрутить цикл на пустом месте типа:
<xsl:variable name="from" select="1"/>
<xsl:variable name="to" select="3"/>
и пустить цикл, чтобы он сделал 3 оборота.

Можно ли это как-то сделать?
XSLT 1.0

спустя 8 минут [обр] Principal AG(5/11)[досье]
П.С. Можно конечно пропаразитировать и на всех элементах документа, их то уж точно хватит:
<xsl:for-each select="/descendant::*[position() &lt; $bound]">
Но уж как-то очень не красиво.
спустя 1 час 4 минуты [обр] GRAy(64/259)[досье]

Principal AG[досье]

Вобщем нужно закрутить цикл на пустом месте типа:
...
Можно ли это как-то сделать?

Ответ - нельзя. XSLT функциональный язык ;) так что никаких циклов, изменения значений "переменных" и т.п.

спустя 2 часа 23 минуты [обр] Principal AG(5/11)[досье]
Да я уже кое что вспоминаю, просто последние года 3 этим вообще не занимался, подзабылось.
Остановился на варианте с colspan-ом, как на наименее уродливом.
Тему можно закрывать.
GRay - спасибо за участие.
спустя 2 часа 31 минуту [обр] GRAy(64/259)[досье]
Principal AG[досье] Есть такая книжица - XSLT Cookbook (O'Reily). Там есть пример генерации node-set`а заданной длины. Только там такое навёрнуто ;) - ух, без поллитры не разберёшься. Я, по крайней мере, не смог. Интересно?
спустя 3 часа 54 минуты [обр] Principal AG(5/11)[досье]
Ты знаешь, наверное очень интересно. Когда от основной работы мозги окончательно вспотевают, люблю поковыряться в навороченных алгоритмах. А она есть где-то в электронке? На сколько я знаю, книги O'Reily очень редко выкладываются, тем более целиком.
спустя 1 день 8 часов [обр] Dennis F. Latypoff aka funky_dennis(10/78)[досье]
IMHO, лучше/быстрее/эффективнее подавать на вход уже сгруппированные/удобные данные:
<images>
  <row>
    <img xlink:type="simple" xlink:href="img/HR2450.1.jpg" />
    <img xlink:type="simple" xlink:href="img/HR2450.25s.jpg" />
    <img xlink:type="simple" xlink:href="img/HR2450.18s.jpg" />
  </row>
  <row>
    <img xlink:type="simple" xlink:href="img/HR2450.12s.jpg" />
    <img xlink:type="simple" xlink:href="img/HR2450.14s.jpg" />
    <img xlink:type="simple" xlink:href="img/HR2450.4s.jpg" />
  </row>
  <row>
    <img xlink:type="simple" xlink:href="img/HR2450.11s.jpg" />
    <img />
    <img />
  </row>
</images>
спустя 6 часов [обр] Principal AG(5/11)[досье]
[quote]подавать на вход уже сгруппированные/удобные данные[/quote]
Т.е. подразбавить содержание элементами оформления?
спустя 2 часа 37 минут [обр] Dennis F. Latypoff aka funky_dennis(10/78)[досье]

Principal AG[досье]
не, ну если скорость не важна, то можно использовать многоэтажные xslt конструкции.
есть еще вариант, тут как бы претензия на оформление скрадывается:

<images>
  <img xlink:type="simple" xlink:href="img/HR2450.1.jpg" group="1" />
  <img xlink:type="simple" xlink:href="img/HR2450.25s.jpg" group="1" />
  <img xlink:type="simple" xlink:href="img/HR2450.18s.jpg" group="1" />
  <img xlink:type="simple" xlink:href="img/HR2450.12s.jpg" group="2" />
  <img xlink:type="simple" xlink:href="img/HR2450.14s.jpg" group="2" />
  <img xlink:type="simple" xlink:href="img/HR2450.4s.jpg" group="2" />
  <img xlink:type="simple" xlink:href="img/HR2450.11s.jpg" group="3" />
  <img group="3" />
  <img group="3" />
</images>

а в xslt заюзать группировку

спустя 1 час 17 минут [обр] GRAy(64/259)[досье]
Dennis F. Latypoff aka funky_dennis[досье] Ну как же, скрадывается ;))) Вместо элементов теперь значит атрибуты, да ещё надо добивать набор до кратного некому числу, определяемому ислючительно оформлением.
Powered by POEM™ Engine Copyright © 2002-2005