Вопрос

Так что я пытаюсь решить проблему в 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.Весь целая нестандартная, функция оценка функции бросает меня на петлю.

Это было полезно?

Решение

Приходя на этот форум из 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>
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top