В XSLT 2.0 , среди вариантов цикла xsl:for-each
есть select="1 to <final_value>"
.
В вашем случае это final_value задается элементом qty
.
Но нужно еще одно действие.Поскольку внутри xsl:for-each
элемент контекста изменяется на текущий элемент цикла (в данном случае это число), вы должны:
- сохранить «внешний» контекст (текущий
item
)элемент) в переменной (я назвал ее itm
), - использует эту переменную в качестве начальной точки выражения XPath , относящегося к
sku
дочернему элементу.
Таким образом, весь скрипт может выглядеть следующим образом:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<products>
<xsl:for-each select="items/item">
<xsl:copy>
<xsl:variable name="itm" select="."/>
<xsl:for-each select="1 to qty">
<artnr><xsl:value-of select="$itm/sku" /></artnr>
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</products>
</xsl:template>
</xsl:transform>
Рабочий пример с исходным XML см. В: http://xsltransform.net/pNEhB36
Если вы вынуждены использовать XSLT 1.0 , вы должны использовать рекурсивный шаблон, вызывая себя снова и снова, до определенной глубины (один из его параметров).
Edit
Я написал приведенный выше примерпри условии, что qty
и sku
являются дочерними элементами .Но теперь я понял, что вы на самом деле написали, что по крайней мере qty
является атрибутом .
Таким образом, элемент item
может быть, например:
<item qty="2">
<sku>23456</sku>
</item>
Тогда вместо«обычный» qty
вы должны написать @qty
.