Как указывалось, XSLT может создавать узлы на целевом документе по желанию (я не знал этого, и это была ключевая часть).
Оказывается, мне нужен простой цикл for в XSLT. Как только я понял это, быстрый поиск в Google дал следующие результаты:
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 является функциональным языком, а не процедурным, поэтому иногда вам приходится прибегать к рекурсии или расширению.
Этот случай определенно является одним из тех случаев, когда я не смог использовать тщательный выбор узлов, используя атрибут select в xsl: for-each (поскольку эти данные-заполнители не были частью исходного документа).
В частности, для этого случая я сделал следующее:
Добавьте функтоид Scripting.
Добавьте два входа:
- Константа со значением "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>