Чтобы создать заготовки соответствующей длины, вы можете:
<!-- make sure you put in more blanks than you'll need -->
<xsl:variable name="blanks" select="'___[...100 blanks...]___'" />
<!-- and later -->
<xsl:value-of select="substring($blanks, 1, @fieldlength)" />
Или
<xsl:template name="create-blanks">
<xsl:param name="todo" select="0" />
<xsl:if test="$todo > 0">
<xsl:text>_</xsl:text>
<xsl:call-template name="create-blanks">
<xsl:with-param name="todo" select="$todo - 1" />
</xsl:call-template>
</xsl:choose>
</xsl:template>
<!-- and later -->
<xsl:variable name="blanks">
<xsl:call-template name="create-blanks">
<xsl:with-param name="todo" select="@fieldlength" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$blanks" />
С точки зрения производительности, первый подход явно заслуживает одобрения. Последнее можно несколько улучшить, создавая более одного пробела (например, 10) каждый раз и вызывая его не @fieldlength
, а ceiling(@fieldlength div 10)
раз, используя substring()
в результате. Этот расчет, конечно, может происходить в самом шаблоне.
Если разумный максимум пробелов не может быть предопределен (я полагаю, что это несколько невероятно для вашего случая), последний метод гарантирует, что вы никогда не «исчерпаете».