如何用XSLT的for-each筛选总库存>1的size元素
筛选总库存大于1的size生成变体XML
需要转换给定的XML文件,筛选出总库存(对当前size下所有stock的available_stock_quantity属性求和)大于1的size元素,生成指定格式的变体XML。尝试用xsl:for-each实现但未成功,以下是相关文件及期望输出:
示例XML
<?xml version="1.0" encoding="utf-8"?> <offer> <products> <product> <sizes> <size id="B" name="38" available="in_stock" priority="5"> <price/> <stock id="5" quantity="1" available_stock_quantity="1" /> <stock id="4" quantity="0" available_stock_quantity="0" /> </size> <size id="C" name="38" available="in_stock" priority="5"> <price/> <stock id="5" quantity="45" available_stock_quantity="45" /> </size> <size id="D" name="38" available="in_stock" priority="5"> <price/> <stock id="5" quantity="43" available_stock_quantity="43" /> <stock id="4" quantity="1" available_stock_quantity="1" /> <stock id="2" quantity="22" available_stock_quantity="22" /> </size> <size id="E" name="38" available="in_stock" priority="5"> <price/> <stock id="5" quantity="20" available_stock_quantity="20" /> <stock id="4" quantity="1" available_stock_quantity="1" /> <stock id="2" quantity="4" available_stock_quantity="4" /> </size> </sizes> </product> </products> </offer>
尝试的XSLT代码片段
<xsl:for-each select="sizes/size/stock[@quantity > '1']">
求和代码片段:
<xsl:element name="stocks"> <xsl:value-of select="sum(.//stock/@available_stock_quantity)"/> </xsl:element>
期望输出
<variants groupingAttribute="size"> <variant> <id>C</id> <size>38</size> <stocks>45</stocks> <prices/> </variant> <variant> <id>D</id> <size>38</size> <stocks>66</stocks> <prices/> </variant> <variant> <id>E</id> <size>38</size> <stocks>25</stocks> <prices/> </variant> </variants>
正确的XSLT实现
之前的问题在于xsl:for-each的选择目标错误(选了stock而非size),且求和范围未限定在当前size节点下。以下是完整的XSLT代码:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <variants groupingAttribute="size"> <!-- 遍历所有size元素,筛选总库存大于1的节点 --> <xsl:for-each select="offer/products/product/sizes/size[sum(stock/@available_stock_quantity) > 1]"> <variant> <id><xsl:value-of select="@id"/></id> <size><xsl:value-of select="@name"/></size> <stocks><xsl:value-of select="sum(stock/@available_stock_quantity)"/></stocks> <prices/> </variant> </xsl:for-each> </variants> </xsl:template> </xsl:stylesheet>
关键说明:
- 筛选条件:对每个
size节点下所有stock的available_stock_quantity求和,仅保留总和大于1的size - 遍历目标:直接选中符合条件的
size元素,而非stock元素,避免不必要的节点遍历 - 求和范围:在
size节点内部求和,确保计算的是当前变体的总库存,而非全局所有库存总和
内容的提问来源于stack exchange,提问作者XD N
相关产品推荐
相关产品推荐

