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

如何使用XSLT仅输出所有订单状态均符合要求的请求

修正后的XSLT解决方案

先明确核心需求:你需要保留的<MainReq>节点,要么是所有子订单(<PH>)的<Stat>都属于Stat03/Stat04/Stat05/Stat06,要么是至少有一个子订单的<Stat>属于上述列表。以下分两种场景给出修正代码:


场景1:保留所有子订单状态都符合要求的请求

如果你的需求是仅保留该请求下所有订单状态都在指定列表里的<MainReq>,可以用以下代码:

XSLT 2.0+ 版本(语法更直观)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <!-- 复制根节点结构,筛选符合条件的MainReq -->
  <xsl:template match="/">
    <Root>
      <xsl:apply-templates select="Root/MainReq[every $ph in PH satisfies $ph/Stat = ('Stat03', 'Stat04', 'Stat05', 'Stat06')]"/>
    </Root>
  </xsl:template>

  <!-- 完整复制符合条件的MainReq节点及其所有子内容 -->
  <xsl:template match="MainReq">
    <xsl:copy-of select="."/>
  </xsl:template>
</xsl:stylesheet>

XSLT 1.0 版本(兼容旧环境)

如果你的运行环境只支持XSLT 1.0,用反向排除逻辑实现相同效果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <Root>
      <!-- 排除存在不符合状态订单的MainReq -->
      <xsl:apply-templates select="Root/MainReq[not(PH/Stat[not(. = 'Stat03' or . = 'Stat04' or . = 'Stat05' or . = 'Stat06')])]"/>
    </Root>
  </xsl:template>

  <xsl:template match="MainReq">
    <xsl:copy-of select="."/>
  </xsl:template>
</xsl:stylesheet>

场景2:保留至少有一个订单状态符合要求的请求

如果需求是只要请求下存在任意一个符合状态的订单就保留,代码更简洁:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <Root>
      <xsl:apply-templates select="Root/MainReq[PH/Stat = ('Stat03', 'Stat04', 'Stat05', 'Stat06')]"/>
    </Root>
  </xsl:template>

  <xsl:template match="MainReq">
    <xsl:copy-of select="."/>
  </xsl:template>
</xsl:stylesheet>

测试示例

假设输入XML为:

<Root>
  <MainReq>
    <ReqID>REQ001</ReqID>
    <PH>
      <OrderID>ORD001</OrderID>
      <Stat>Stat03</Stat>
    </PH>
    <PH>
      <OrderID>ORD002</OrderID>
      <Stat>Stat04</Stat>
    </PH>
  </MainReq>
  <MainReq>
    <ReqID>REQ002</ReqID>
    <PH>
      <OrderID>ORD003</OrderID>
      <Stat>Stat01</Stat>
    </PH>
    <PH>
      <OrderID>ORD004</OrderID>
      <Stat>Stat03</Stat>
    </PH>
  </MainReq>
  <MainReq>
    <ReqID>REQ003</ReqID>
    <PH>
      <OrderID>ORD005</OrderID>
      <Stat>Stat06</Stat>
    </PH>
  </MainReq>
</Root>

使用场景1的代码,输出结果为:

<Root>
  <MainReq>
    <ReqID>REQ001</ReqID>
    <PH>
      <OrderID>ORD001</OrderID>
      <Stat>Stat03</Stat>
    </PH>
    <PH>
      <OrderID>ORD002</OrderID>
      <Stat>Stat04</Stat>
    </PH>
  </MainReq>
  <MainReq>
    <ReqID>REQ003</ReqID>
    <PH>
      <OrderID>ORD005</OrderID>
      <Stat>Stat06</Stat>
    </PH>
  </MainReq>
</Root>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:15:38