XSLT 1.0 и подсчет строк
Так что я пытаюсь решить проблему в xslt, которую я обычно знаю, как это сделать на императивном языке. Я добавляю ячейки в таблицу из списка элементов XML, стандартные вещи. Так:
<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. Вся эта функция оценки состояния без состояния сбивает меня с толку.
1 ответ
Приход на этот форум из xsl-list - это все равно что вернуться на 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>