Как показать символ n раз в XSLT? - PullRequest
9 голосов
/ 23 февраля 2011

У меня есть шаблон с параметром. Как я могу вставить символ табуляции n раз?

n - это значение параметра.

Ответы [ 6 ]

12 голосов
/ 23 февраля 2011

Просто назовите это рекурсивно;выведите вкладку, затем вызовите тот же шаблон еще раз с переданным n-1, если 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>

Как было отмечено, этот пример фактически выдает минимум один.По моему опыту, когда вывод - это пробел, он обычно нужен.Вы можете адаптировать принцип рекурсивного шаблона таким образом, как считаете нужным.

11 голосов
/ 23 февраля 2011

В XSLT 2.0:

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

(К сожалению, я подозреваю, что если бы вы использовали XSLT 2.0, вам не нужно было бы задавать вопрос).

Другая техника, часто используемая в XSLT 1.0, - это хак:

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

, который работает при условии, что количество элементов в исходном документе превышает количество символов табуляции, которые вы хотите вывести.

2 голосов
/ 03 февраля 2017

(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>

Пример использования:

<xsl:call-template name="tabs">
   <xsl:with-param name="n" select="3"/>
</xsl:call-template>
1 голос
/ 17 июня 2016

Это кажется мне самым простым и гибким.

Для XSLT 1.0 (или, возможно, 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),'')"/>

Конечно, переменная count - это место, где вы присваиваете свой параметр n .

Я использовал переменную repeat для удержания символа tab , но вы можете просто заменить $ repeat на символ табуляции в одинарных кавычках в последовательности элемент. Примечание: Эта переменная может иметь длину больше 1, что создает целый ряд возможностей.

Он не использует рекурсию, поэтому не достигнет предела рекурсии.

Я не знаю максимального значения, которое вы можете использовать для подсчета, но я проверял его до 10 000.

1 голос
/ 16 июля 2015

Глобально определить достаточно длинный массив вкладок:

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

Тогда используйте вот так:

<xsl:value-of select="fn:substring($TABS, 1, fn:number($COUNT))" />
0 голосов
/ 27 января 2018

Я обнаружил лицензированную LGPL библиотеку для этого, называемую functx, так как я был уверен, что кто-то уже должен был это делать ... Это библиотека XSLT типа «стандартная библиотека», которая содержит функцию с именем repeat-строка.Из документов:

Функция functx: repeat-string возвращает строку, состоящую из заданного числа копий объединенного вместе $ stringToRepeat.

Где я использую ее какэто в моем коде:

<?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>

Так что для печати символа табуляции n раз, назовите это так:

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

Я знаю, что этот вопрос старый, но я надеюсь, что это все еще можетпомогите кому-нибудь.

Документация для функции повторения строк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...