почему функция sum не может работать в XSLT1.0?

#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'