xml - 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 等。
解决方案
我仍然不确定您要对哪些数据进行分组和求和,但要显示一个将您的条件包含在谓词中的版本是
<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
具有相同NAME
和CODE
所在位置的CODE
s进行分组和求和'SHIPPING122'
。
推荐阅读
- graphite - 石墨图像渲染在漫长的传说下留下了很多空白
- angular - Angular 服务更改字段值
- javascript - 嵌套子路由器视图仍然创建多次调用
- arrays - 渲染从 firebase firestore 获取的数组数据
- javascript - 如何将对象数组推入另一个对象数组
- capl - 自适应检索 CAN 通道的 sysVar BusLoad
- yaml - 如何删除 .toYaml 在 helm 中添加的新行?
- html - 如何通过单击 image3 来影响两个元素(image1 和 image2)
- php - 尝试创建使用 usort 对数组进行排序的基本函数
- jmeter - 如何将响应代码保存在变量中并在其他采样器中使用 JSR223 侦听器进行断言