В XSLT 1.0 есть несколько способов сделать это. Один из способов - создать временное дерево результатов, содержащее отдельные значения qty_ordered
и value
для каждого элемента, например:
<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>
Однако в XSLT 1.0 вам потребуется использовать функцию расширения для доступа к узлам в переменной (поскольку переменная items
имеет тип «фрагмент дерева результатов» и должна быть преобразована в набор узлов). для использования с функцией суммы). Наиболее распространенным из них является 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>
РЕДАКТИРОВАТЬ: Немного сложно объяснить, как интегрировать это в существующий код, потому что вы недостаточно показали свой существующий 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)" />