XSL过滤IDOC XML:保留含PARTNER_Q='AG'的E1EDL20节点
过滤SHPMNT05 IDOC XML的XSLT方案
以下是实现需求的XSLT代码,核心是通过精准的节点筛选保留符合条件的E1EDL20节点,同时保留原XML的其他结构:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份转换模板:复制所有未被特殊匹配的节点 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 仅保留包含E1ADRM1且PARTNER_Q='AG'的E1EDL20节点 --> <xsl:template match="E1EDL20[not(E1ADRM1/PARTNER_Q = 'AG')]"/> </xsl:stylesheet>
关键说明:
- 身份转换模板确保原XML中所有未被过滤的节点(包括IDOC头部、其他非
E1EDL20节点等)都被完整复制。 - 第二个模板通过
match="E1EDL20[not(E1ADRM1/PARTNER_Q = 'AG')]"匹配不满足条件的E1EDL20节点,空模板意味着这些节点会被直接丢弃,只有符合条件的E1EDL20会被身份模板保留。 - 如果
E1ADRM1是E1EDL20的深层子节点(而非直接子元素),只需调整路径即可,比如E1ADRM1在E1EDL20/E1ADRMT/E1ADRM1,则把条件改为[E1ADRMT/E1ADRM1/PARTNER_Q = 'AG']。
示例验证:
假设原XML片段如下:
<IDOC BEGIN="1"> <E1EDL20> <E1ADRM1> <PARTNER_Q>AG</PARTNER_Q> <NAME>客户A</NAME> </E1ADRM1> <DELIVERY_NUM>12345</DELIVERY_NUM> </E1EDL20> <E1EDL20> <E1ADRM1> <PARTNER_Q>WE</PARTNER_Q> <NAME>仓库B</NAME> </E1ADRM1> <DELIVERY_NUM>67890</DELIVERY_NUM> </E1EDL20> </IDOC>
转换后会只保留第一个E1EDL20节点:
<IDOC BEGIN="1"> <E1EDL20> <E1ADRM1> <PARTNER_Q>AG</PARTNER_Q> <NAME>客户A</NAME> </E1ADRM1> <DELIVERY_NUM>12345</DELIVERY_NUM> </E1EDL20> </IDOC>
内容的提问来源于stack exchange,提问作者Mike Dole
相关产品推荐
相关产品推荐

