Когда мои таблицы стилей 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>
Спасибо!
Достаточно грязный, но прагматичный подход - это выяснить, какое наибольшее число вы ожидаете увидеть в атрибуте
, а затем использовать
substring("****...", 1, $repeat)
, где у вас столько же *
s в этой строке как ожидаемое максимальное число. Но я надеюсь, что есть что-то получше!
Добавляя к двум красивым ответам @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 -
используется в
инструкция.
Общее рекурсивное решение (XSLT 1.0):
<xsl:template name="RepeatString">
<xsl:param name="string" select="''" />
<xsl:param name="times" select="1" />
<xsl:if test="number($times) > 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>