You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:50:30