Преобразуйте целочисленное значение к повторному символу

Когда мои таблицы стилей XSL встречаются с этим узлом:

<node attribute="3"/>

... это должно преобразовать его в этот узел:

<node attribute="***"/>

Мой шаблон соответствует атрибуту и воссоздает его, но я не знаю, как установить значение к: символ '*' повторенный так же много раз как значение исходного атрибута.

<xsl:template match="node/@attribute">
    <xsl:variable name="repeat" select="."/>
    <xsl:attribute name="attribute">
        <!-- What goes here? I think I can do something with $repeat... -->
    </xsl:attribute>
</xsl:template>

Спасибо!

6
задан Dimitre Novatchev 12 July 2010 в 12:56
поделиться

3 ответа

Достаточно грязный, но прагматичный подход - это выяснить, какое наибольшее число вы ожидаете увидеть в атрибуте , а затем использовать

substring("****...", 1, $repeat)

, где у вас столько же * s в этой строке как ожидаемое максимальное число. Но я надеюсь, что есть что-то получше!

8
ответ дан 8 December 2019 в 04:51
поделиться

Добавляя к двум красивым ответам @AakashM и @Tomalak, это делается естественным образом в XSLT 2.0 :

Это преобразование XSLT 2.0 :

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="@attribute">
   <xsl:attribute name="{name()}">
     <xsl:for-each select="1 to .">
       <xsl:value-of select="'*'"/>
     </xsl:for-each>
   </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML документ :

<node attribute="3"/>

дает желаемый результат :

<node attribute="***"/>

Обратите внимание на , как оператор XPath 2.0 - используется в инструкция.

7
ответ дан 8 December 2019 в 04:51
поделиться

Общее рекурсивное решение (XSLT 1.0):

<xsl:template name="RepeatString">
  <xsl:param name="string" select="''" />
  <xsl:param name="times"  select="1" />

  <xsl:if test="number($times) &gt; 0">
    <xsl:value-of select="$string" />
    <xsl:call-template name="RepeatString">
      <xsl:with-param name="string" select="$string" />
      <xsl:with-param name="times"  select="$times - 1" />
    </xsl:call-template>
  </xsl:if>
</xsl:template>

Звоните как:

<xsl:attribute name="attribute">
  <xsl:call-template name="RepeatString">
    <xsl:with-param name="string" select="'*'" />
    <xsl:with-param name="times"  select="." />
  </xsl:call-template>
</xsl:attribute>
9
ответ дан 8 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: