В XSLT 1.0 есть несколько способов сделать это. Один из способов - создать временное дерево результатов, которое содержит отдельные значения и для каждого элемента, например:<xsl:variable name="items"> <xsl:for-each select="item[not(product_type='configurable')]"> <item> <xsl:value-of select="qty_ordered * custom_options/custom_option/value" /> </item> </xsl:for-each> </xsl:variable>
value
items
Однако в XSLT 1.0 вам нужно будет использовать функцию расширения для доступа к узлам в переменной (поскольку items
переменная имеет тип «фрагмент результирующего дерева» и должна быть преобразована в набор узлов, предназначенный для использования с функцией sum ). Наиболее распространенным из них является exslt.
Попробуйте этот XSLT (я упростил выражение xpath для краткости)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exslt="http://exslt.org/common"
exclude-result-prefixes="exslt"
version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="items">
<xsl:variable name="items">
<xsl:for-each select="item[not(product_type='configurable')]">
<item>
<xsl:value-of select="qty_ordered * custom_options/custom_option/value" />
</item>
</xsl:for-each>
</xsl:variable>
<result>
<xsl:value-of select="sum(exslt:node-set($items)/item)" />
</result>
</xsl:template>
</xsl:stylesheet>
Когда вы применяете его к этому XML
<items>
<item>
<qty_ordered>5.0000</qty_ordered>
<custom_options>
<custom_option>
<name>Aantal pagina's in PDF</name>
<value>1</value>
<sku/>
<option_id>2686</option_id>
</custom_option>
</custom_options>
</item>
<item>
<qty_ordered>2.0000</qty_ordered>
<custom_options>
<custom_option>
<name>Aantal pagina's in PDF - Vol 2</name>
<value>3</value>
<sku/>
<option_id>2687</option_id>
</custom_option>
</custom_options>
</item>
</items>
Результатом этого является ...
<result>11</result>
EDIT: немного сложно объяснить, как интегрировать это с вашим существующим кодом, потому что вы недостаточно показали свой существующий XSLT
Но где вы сейчас это делаете ...
<xsl:value-of
select="sum(objects/object/items/item[not(product_type='configurable' and
count(custom_options/custom_option[option_id='2686']) >
0)]/custom_options/custom_option[option_id='2686']/value)" />
Вы, вероятно, захотите изменить его на это ...
<xsl:variable name="items">
<xsl:for-each select="objects/object/items/item[not(product_type='configurable' and count(custom_options/custom_option[option_id='2686']) > 0)]">
<item>
<xsl:value-of select="qty_ordered * custom_options/custom_option[option_id='2686']/value" />
</item>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="sum(exslt:node-set($items)/item)" />