首页 > 解决方案 > XSLT 按项目值过滤

问题描述

仅当代码唯一时,我才尝试对项目求和。

我有这个 XML:

<ITEM>
    <NAME>Brambory 10 kg</NAME>
    <CODE>4</CODE>
    <AMOUNT>23</AMOUNT>
    <COUNT>19</COUNT>
</ITEM>
<ITEM>
    <NAME>Česnek 1 kg</NAME>
    <CODE>89</CODE>
    <AMOUNT>11</AMOUNT>
    <COUNT>10</COUNT>
</ITEM>
<ITEM>
    <NAME>Neděle - Příbram</NAME>
    <CODE>SHIPPING140</CODE>
    <AMOUNT>16</AMOUNT>
    <COUNT>16</COUNT>
</ITEM>
<ITEM>
    <NAME>Úterý - Liberec</NAME>
    <CODE>SHIPPING122</CODE>
    <AMOUNT>10</AMOUNT>
    <COUNT>10</COUNT>
</ITEM>

如果交货地点是这样,我想只计算货物的数量SHIPPING122

我使用这个 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
 <xsl:strip-space elements="*"/>
  <xsl:key name="itemkey" match="ITEM" use="concat(NAME, CODE)"/>
<xsl:template match="/ORDERS">
  <xsl:copy> 
      <xsl:apply-templates select="descendant::ITEM[generate-id() = generate-id(key('itemkey', concat(NAME, CODE))[1])]"/>
    </xsl:copy> 
  </xsl:template>
  <xsl:template match="ITEM">   
    <xsl:copy>      
        <xsl:variable name="curr-group" select="key('itemkey', concat(NAME, CODE))" />  
       <xsl:copy-of select="CODE|NAME"/>        
        <AMOUNT>         
            <xsl:value-of select="sum($curr-group/AMOUNT)"/>        
        </AMOUNT>       
    </xsl:copy>         
  </xsl:template>
</xsl:stylesheet>

它工作得很好,但我有所有商品的总和。但如果交货代码是 SHIPPING122,我只需要 sum。我尝试按测试过滤CODE = 'SHIPPING107',但它不起作用。

首选 XML 输出:

<ITEM>
    <NAME>Brambory 10 kg</NAME>
    <CODE>4</CODE>
    <AMOUNT>10</AMOUNT>
</ITEM>
<ITEM>
    <NAME>Česnek 1 kg</NAME>
    <CODE>89</CODE>
    <AMOUNT>3</AMOUNT>
</ITEM>
<ITEM>
    <NAME>Úterý - Liberec</NAME>
    <CODE>SHIPPING122</CODE>
    <AMOUNT>10</AMOUNT>
    <COUNT>10</COUNT>
</ITEM>

何时是交货地点,CODE = 'SHIPPING122'我想仅从该交货地点而不是所有订单(所有交货地点)合计货物 Brambory、Česnek 等。

标签: xmlxslt

解决方案


我仍然不确定您要对哪些数据进行分组和求和,但要显示一个将您的条件包含在谓词中的版本是

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
 <xsl:strip-space elements="*"/>
  <xsl:key name="itemkey" match="ITEM[CODE = 'SHIPPING122']" use="concat(NAME, CODE)"/>
  <xsl:template match="/ORDERS">
    <xsl:copy> 
      <xsl:apply-templates select="descendant::ITEM[CODE != 'SHIPPING122'] | descendant::ITEM[CODE = 'SHIPPING122'][generate-id() = generate-id(key('itemkey', concat(NAME, CODE))[1])]"/>
    </xsl:copy> 
  </xsl:template>
  <xsl:template match="ITEM[CODE != 'SHIPPING122']">
     <xsl:copy>
         <xsl:copy-of select="CODE | NAME | AMOUNT"/>
     </xsl:copy>
  </xsl:template>
  <xsl:template match="ITEM[CODE = 'SHIPPING122']">
    <xsl:copy>      
        <xsl:variable name="curr-group" select="key('itemkey', concat(NAME, CODE))" />  
       <xsl:copy-of select="CODE|NAME"/>        
        <AMOUNT>         
            <xsl:value-of select="sum($curr-group/AMOUNT)"/>        
        </AMOUNT>       
    </xsl:copy>         
  </xsl:template>
</xsl:stylesheet>

这只会对任何ITEM具有相同NAMECODE所在位置的CODEs进行分组和求和'SHIPPING122'


推荐阅读