2012-03-11 3 views
4

Итак, я пытаюсь решить проблему в xslt, которую я обычно знаю, как делать на императивном языке. Я добавляю ячейки в таблицу из списка элементов xml, стандартных файлов. Итак:XSLT 1.0 и подсчет строк

<some-elements> 
    <element>"the"</element> 
    <element>"minds"</element> 
    <element>"of"</element> 
    <element>"Douglas"</element> 
    <element>"Hofstadter"</element> 
    <element>"and"</element> 
    <element>"Luciano"</element> 
    <element>"Berio"</element> 
</some-elements> 

Однако, я хочу, чтобы отрезать одну строку и начать новый после определенного максимального символа достигнут. Скажем, я допускаю максимум 20 символов в строке. Я бы в конечном итоге с этим:

<table> 
<tr> 
    <td>"the"</td> 
    <td>"minds"</td> 
    <td>"of"</td> 
    <td>"Douglas"</td> 
</tr> 
<tr> 
    <td>"Hofstadter"</td> 
    <td>"and"</td> 
    <td>"Luciano"</td> 
</tr> 
<tr> 
    <td>"Berio"</td> 
</tr> 
</table> 

В императивном языке, я бы добавить элементы в ряд, добавляя каждый элементы строкового количество до некоторой изменчивой переменной. Когда эта переменная превысила 20, я бы остановился, построил новую строку и перезапустил весь процесс (начиная с остановленного элемента) в этой строке после возврата числа строк до нуля. Однако я не могу изменить значения переменных в XSLT. Вся эта функция бездействия, функция оценки функции бросает меня за цикл.

ответ

9

Далее в этом форуме из XSL-списка, как собирается на 10 лет назад, почему все используют XSLT 1 :-)

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output indent="yes"/> 

<xsl:template match="some-elements"> 
<table> 
    <xsl:apply-templates select="element[1]"/> 
</table> 
</xsl:template> 


<xsl:template match="element"> 
<xsl:param name="row"/> 
<xsl:choose> 
    <xsl:when test="(string-length($row)+string-length(.))>20 
      or 
      not(following-sibling::element[1])"> 
    <tr> 
    <xsl:copy-of select="$row"/> 
    <xsl:copy-of select="."/> 
    </tr> 
    <xsl:apply-templates select="following-sibling::element[1]"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:apply-templates select="following-sibling::element[1]"> 
    <xsl:with-param name="row"> 
    <xsl:copy-of select="$row"/> 
    <xsl:copy-of select="."/> 
    </xsl:with-param> 
    </xsl:apply-templates> 
    </xsl:otherwise> 
</xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 
+0

Очень красиво сделано. – ColinE

+0

, потому что symphony-cms использует XSLT 1.0. Я бы переключился, если бы смог. –

 Смежные вопросы

  • Нет связанных вопросов^_^