XSLT 1.0 e a seqüência de contagem
-
11-12-2019 - |
Pergunta
Então, eu estou tentando resolver um problema em xslt que eu normalmente teria de saber como fazer em uma linguagem imperativa.Eu sou de adicionar células a uma tabela a partir de uma lista de elementos xml, padrão coisas.Assim:
<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>
No entanto, eu quero cortar uma linha e iniciar um novo, depois de um certo carácter máximo foi atingido.Então, digamos que eu permitir, no máximo, 20 caracteres por linha.Eu gostaria de acabar com isso:
<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>
Em uma linguagem imperativa, eu gostaria de acrescentar os elementos de uma linha, enquanto a adição de elementos de cada seqüência de contagem para alguns mutável variável.Quando essa variável exceder de 20, que eu ia parar, construir uma nova linha, e repetir todo o processo (desde a parou elemento) em que linha depois de voltar a seqüência de contagem a zero.No entanto, eu não posso alterar os valores da variável em XSLT.Todo este estado, a função de avaliação coisa que está me jogando para um loop.
Solução
Vinda a este fórum de xsl-lista, é como ir de volta mais de 10 anos, por que todo mundo usar o 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>