如何使用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
相关产品推荐
相关产品推荐

