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

如何通过XSLT 1.0实现按行项目(Line Item)的qty值匹配输出对应数量的bbb serial信息

解决按行项目qty分配对应数量bbb信息的问题

我明白你现在的需求是让每个行项目(对应<abc>里的<aaa>)根据qty属性值,依次取用指定数量的<bbb>的serial值,输出成要求的格式。原XSLT的问题在于它把所有<bbb>的内容都重复输出了,没有做数量截取和顺序分配。

下面是修改后的XSLT 1.0代码,完全符合你的需求:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="UTF-8"/>

  <xsl:template match="/xyz">
    <!-- 遍历每个行项目abc -->
    <xsl:for-each select="ddd/abc">
      <xsl:variable name="current-qty" select="aaa/@qty"/>
      <!-- 计算当前行项目之前所有qty的总和,用来确定要取哪些bbb -->
      <xsl:variable name="prev-total" select="sum(preceding-sibling::abc/aaa/@qty)"/>
      
      <!-- 输出qty标识和数值 -->
      <xsl:text>qty </xsl:text>
      <xsl:value-of select="$current-qty"/>
      <xsl:text> bbb </xsl:text>
      
      <!-- 选取对应范围的bbb,输出serial值,用空格分隔 -->
      <xsl:for-each select="../following-sibling::bbb[position() > $prev-total and position() <= $prev-total + $current-qty]">
        <xsl:value-of select="@serial"/>
        <!-- 最后一个serial后面不要加空格 -->
        <xsl:if test="position() != last()">
          <xsl:text> </xsl:text>
        </xsl:if>
      </xsl:for-each>
      
      <!-- 行项目之间加空格,最后一个行项目后面不加 -->
      <xsl:if test="position() != last()">
        <xsl:text> </xsl:text>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

关键逻辑说明:

  • $prev-total变量:计算当前<abc>之前所有兄弟<abc>的qty总和,这样就能确定当前要从第几个<bbb>开始取。比如第一个<abc>的$prev-total是0,第二个就是2(第一个的qty值)。
  • <bbb>的范围选择:通过position() > $prev-total and position() <= $prev-total + $current-qty精准筛选出当前行项目需要的<bbb>节点。
  • 格式控制:加入了判断逻辑,避免在最后一个serial或者最后一个行项目后面多出空格,保证输出格式完全符合预期。

用这个样式表处理你的源XML,会输出:

qty 2 bbb 1111 2222 qty 3 bbb 3333 4444 5555

内容的提问来源于stack exchange,提问作者Pooja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:17:44