当我的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>
谢谢!
答案 0 :(得分:9)
通用,递归解决方案(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>
答案 1 :(得分:8)
一种相当肮脏但务实的方法是打电话给你attribute
期望看到的最高数字,然后使用
substring("****...", 1, $repeat)
您在该字符串中拥有与您期望的最大数量一样多的*
s。但我希望有更好的东西!
答案 2 :(得分:7)
添加@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="***"/>
请注意如何在to
指令中使用XPath 2.0 <xsl:for-each>
运算符。