#xml #xslt-1.0
#xml #xslt-1.0
Вопрос:
Я использую ‘sum function’ для вычисления общего количества, структура XML немного сложная, я искал в Интернете, функцию sum можно использовать в XSLT 1.0, но я попробовал, у меня это не работает, я не знаю почему?
мой XSLT:
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th>Quantity</th>
</tr>
<xsl:for-each select="warehouses/warehouse">
<tr>
<td><xsl:value-of select="sum(items/item/s_qty)"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
мой XML :
<warehouses>
<warehouse>
<w_id>22</w_id>
<w_name>Namekagon</w_name>
<address>
<w_city>Indonesia</w_city>
<w_country>Indonesia</w_country>
</address>
<items>
<item>
<i_name>MECLIZINE HYDROCHLORIDE</i_name>
<s_qty>909</s_qty>
</item>
</items>
</warehouse>
<warehouse>
<w_id>21</w_id>
<w_name>kagon</w_name>
<address>
<w_city>Indonesia</w_city>
<w_country>Indonesia</w_country>
</address>
<items>
<item>
<i_name>MECLIZINE HYDROCHLORIDE</i_name>
<s_qty>587</s_qty>
</item>
</items>
</warehouse>
<warehouse>
<w_id>21</w_id>
<w_name>kagon</w_name>
<address>
<w_city>Singapore</w_city>
<w_country>Singapore</w_country>
</address>
<items>
<item>
<i_name>MECLIZINE HYDROCHLORIDE</i_name>
<s_qty>587</s_qty>
</item>
</items>
</warehouse>
результат должен быть: 1496
Ответ №1:
если вам нужна сумма для всех s_qty, вам нужно изменить
<xsl:for-each select="warehouses">
<tr>
<td><xsl:value-of select="sum(warehouse/items/item/s_qty)"/></td>
</tr>
</xsl:for-each>
смотрите преобразование на https://xsltfiddle.liberty-development.net/bnnZW7
также вы можете использовать <xsl:value-of select="sum(//s_qty)"/>
Комментарии:
1. Большое вам спасибо!! кстати, если я добавлю условие, например, в одной конкретной стране, warehouse[descendant::w_country=’Indonesia’] , то же самое может не сработать, знаете почему?
2. можете ли вы поделиться своим вводом, насколько я вижу ваш текущий ввод, он не содержал w_country =’indonesia’
3. конечно, я изменил этот XML, теперь он содержит ‘indonesia’, мой код
xsl:for-each select="warehouses"> <xsl:if test="warehouse[descendant::country='Indonesia']"> <tr> <td><xsl:value-of select="warehouse/items/item/name"/></td> <td><xsl:value-of select="sum(warehouse/items/item/qty)"/></td> </tr> </xsl:if> </xsl:for-each>
4. смотрите обновленное преобразование на https://xsltfiddle. liberty-development.net/bnnZW7/1 , также, как я вижу, вы используете
descendant::country='Indonesia'
вместоdescendant::w_country='Indonesia'