Во-первых, у вас есть проблема с вашим xsl:for-each
...
<xsl:for-each select="/products/product/size">
. Начав выражение выбора с /
, который представляет узел документа, вы фактически выполняете абсолютный поиск,и игнорируя product
, на котором вы сейчас находитесь.Вы должны просто сделать это, чтобы получить size
элементы для текущего продукта
<xsl:for-each select="size">
И аналогично, для различных операторов xsl:copy-of
вместо того, чтобы делать это ...
<xsl:copy-of select="/products/product/color-code[$occur]"/>
Вы должны сделать это (где ..
получает родительский элемент текущего size
элемента)
<xsl:copy-of select="../color-code[$occur]"/>
Попробуйте использовать этот шаблон вместо
<xsl:template match="/products/product">
<xsl:copy>
<xsl:copy-of select="description|id|name|category|path"/>
<xsl:for-each select="size">
<variation>
<xsl:variable name="occur" select="position()"/>
<xsl:copy-of select="."/>
<xsl:copy-of select="../color-code[$occur]"/>
<xsl:copy-of select="../size-code[$occur]"/>
<xsl:copy-of select="../size-qty[$occur]"/>
<xsl:copy-of select="../size-codeproducer[$occur]"/>
</variation>
</xsl:for-each>
<xsl:copy-of select="imgs|url|price|brand|color|gender"/>
</xsl:copy>
</xsl:template>
(Обратите внимание, что вы также можетевыполните <xsl:copy-of select="following-sibling::color-code[1]"/>
здесь и аналогично для других операторов).