正如所指出的,XSLT 可以随意在目标文档上创建节点(我不知道这一点,这是关键部分)。事实证明,我需要的是 XSLT 中的一个简单的 for 循环。一旦我意识到这一点,快速的谷歌搜索产生了以下结果:
http://quomon.com/question-How-to-make-a-for-loop-in-xslt-not-for-each-809.aspx
http://snippets.dzone.com/posts/show/930
另一件值得注意的事情是(正如第一个链接所指出的),XSLT 是一种功能语言,而不是过程语言,因此有时您必须求助于使用递归或扩展。这种情况绝对是其中一种情况,因为我无法使用 xsl:for-each 上的 select 属性仔细选择节点(因为此填充数据不是源文档的一部分)。
具体来说,对于这种情况,我所做的是:
添加一个脚本functoid。添加两个输入:
- 值为“1”的常量(这是 i 变量的初始值)
- 循环的长度(循环主体的重复次数)
将以下 XSLT 模板粘贴为“内联 XSLT 调用模板”脚本:
<xsl:template name="ForLoop">
<xsl:param name="i" /> <!-- index counter, 1-based, will be incremented with every recursive call -->
<xsl:param name="length" /> <!-- exit loop when i >= length -->
<!-- Output the desired node(s) if we're still looping -->
<!-- The base case is when i > length (in that case, do nothing) -->
<xsl:if test="$i <= $length">
<Filler>
<Padding>999999</Padding>
</Filler>
</xsl:if>
<!-- Call the ForLoop template recursively, incrementing i -->
<xsl:if test="$i <= $length">
<xsl:call-template name="ForLoop">
<xsl:with-param name="i">
<xsl:value-of select="$i + 1"/>
</xsl:with-param>
<xsl:with-param name="length">
<xsl:value-of select="$length"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>