2011-02-23 12 views
7

Tengo una plantilla con un parámetro. ¿Cómo puedo insertar un carácter de pestaña n veces?¿Cómo mostrar un personaje n veces en XSLT?

n es el valor del parámetro.

+4

@Alejandro creo que debería haber comentado en la respuesta, o añadir su propia respuesta si usted pensó que la respuesta aceptada era demasiado mal. Editó el contenido proporcionado por otro usuario, y solo se recomienda para mejorar la legibilidad o agregar información. –

+0

Tenga en cuenta que la respuesta aceptada es incorrecta. –

+0

@Alejandro Puede preguntar en http://meta.stackoverflow.com/ para aclarar cualquier duda. Un abrazo! –

Respuesta

10

Simplemente llámelo recursivamente; salida de una ficha, a continuación, llamar a la misma plantilla de nuevo con n-1 aprobada en, si n> 1.

<xsl:template name="repeat"> 
    <xsl:param name="output" /> 
    <xsl:param name="count" /> 
    <xsl:if test="$count &gt; 0"> 
    <xsl:value-of select="$output" /> 
    <xsl:call-template name="repeat"> 
     <xsl:with-param name="output" select="$output" /> 
     <xsl:with-param name="count" select="$count - 1" /> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

Como se ha señalado, este ejemplo realmente salida de un mínimo de uno. En mi experiencia, donde el resultado es el espacio en blanco, por lo general es necesario. Puede adaptar el principio de una plantilla recursiva como esta de la forma que mejor le parezca.

+1

Esto está mal: itera '$ count + 1' veces. –

+1

@Alejandro: Ah, eso tiene más sentido; la prueba debería ser '> 1', no 0. No se molestó en explicar por qué estaba mal antes. Se SUPONE la salida de al menos uno, ya que cada vez que desee insertar X espacios en blanco, en el 99% de los casos debe insertar al menos uno, por lo tanto, el ' Flynn1179

+1

De mi [revisión] (http://stackoverflow.com/posts/5089179/revisions) título de la propiedad: * "Prueba de iteración cero primero." * –

8

En XSLT 2.0:

<xsl:for-each select="1 to $count">&#x9;</xsl:for-each> 

(Por desgracia, aunque, sospecho que si estuviera usando XSLT 2.0 que no tendría que hacer la pregunta).

Otra técnica utilizada a menudo con XSLT 1.0 es el truco:

<xsl:for-each select="//*[position() &lt;= $count]">&#x9;</xsl:for-each> 

los trabajos proporcionados al número de elementos en el documento de origen es mayor que el número de caracteres de tabulación que desea generar.

+2

+1 Para la iteración fija "podría ir al infierno si usa este patrón". Muchas veces, la hoja de estilos tiene suficientes nodos por lo que 'document ('') // node()' es útil. –

1

definir globalmente un tiempo suficiente variedad de fichas:

<xsl:variable name="TABS" select="'&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;'" /> 

A continuación, utilice la siguiente manera:

<xsl:value-of select="fn:substring($TABS, 1, fn:number($COUNT))" /> 
1

Esta parece ser la más simple y más flexible para mí.

Para XSLT 1.0 (o quizás 1.1).

<xsl:variable name="count">10</xsl:variable> 
<xsl:variable name="repeat"><xsl:text>&#9;</xsl:text></xsl:variable> 
<xsl:sequence select="string-join((for $i in 1 to $count return $repeat),'')"/> 

Por supuesto, el recuento la variable en la que asignará el parámetro n .

que utiliza la variable de repetición para mantener la pestaña carácter, pero sólo podría reemplazar el $ repetición con el carácter de tabulación entre comillas simples en el elemento de la secuencia. Nota: Esta variable puede tener una longitud mayor que 1, lo que crea un montón de posibilidades.

No utiliza recursividad, por lo que no se ejecutará en un límite de recursión.

No conozco el valor máximo que puede usar para el recuento, pero lo probé hasta 10.000.

+1

"* Para XSLT 1.0 (o quizás 1.1). *" No. Esto requiere XSLT 2.0 –

1

XSLT (1,0)

<xsl:template name="tabs"> 
    <xsl:param name="n"/> 

    <xsl:if test="$n > 0">        <!-- When n = 0, output nothing.   --> 
     <xsl:call-template name="tabs">     <!-- Recursive call: call same template... --> 
      <xsl:with-param name="n" select="$n - 1"/> <!-- ... for writing n - 1 tabs.   --> 
     </xsl:call-template> 
     <xsl:text>&#x9;</xsl:text>      <!-- Add one tab character.    --> 
    </xsl:if> 

</xsl:template> 

Ejemplo de uso:

<xsl:call-template name="tabs"> 
    <xsl:with-param name="n" select="3"/> 
</xsl:call-template> 
0

he descubierto una biblioteca con licencia LGPL para hacer esto se llama functx, ya que estaba seguro de que alguien tenía que ya lo han hecho esto ... Esta es una biblioteca XSLT tipo "biblioteca estándar", que contiene una función llamada repeat-string.De los documentos:

La función functx: repeat-string devuelve una cadena que consiste en un número dado de copias de $ stringToRepeat concatenadas juntas.

Cuando lo uso como esto en mi código:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:functx="http://www.functx.com"> 
    <xsl:import href="../buildlib/functx-1.0.xsl"/> 

    <xsl:output omit-xml-declaration="yes" /> 

    <xsl:variable name="INDENT" select="' '" /> 
    .... 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*" /> 
     </xsl:copy> 
    </xsl:template> 

     <xsl:template match="data-pusher-properties"> 
      <xsl:for-each select="property"> 
       <xsl:choose> 
        ... 
        <xsl:when test="boolean(@value = '${pusher.notifications.server}')"> 
         <xsl:value-of select="functx:repeat-string($INDENT, @indent)" /> 
         <xsl:text>&quot;</xsl:text> 
         <xsl:value-of select="@name" /> 
         <xsl:text>&quot;: </xsl:text> 
         <xsl:text>&quot;</xsl:text> 
         <xsl:value-of select="$pusher.notifications.email.server" /> 
         <xsl:text>&quot;\&#xA;</xsl:text> 
        </xsl:when> 
        ... 
       </xsl:choose> 
      </xsl:for-each> 
     </xsl:template> 
    </xsl:stylesheet> 

Así que para imprimir un carácter de tabulación n veces, lo llaman así:

<xsl:value-of select="functx:repeat-string('&#x9;', n)" /> 

Sé que esta pregunta es viejo , pero espero que esto todavía pueda ayudar a alguien.

Documentation for the repeat-string function

Cuestiones relacionadas