XSLT:根据元素值删除 XML 个节点并删除另一个节点中的元素

XSLT : Remove XML one node based on element value & remove an element in another node

我面临以下问题:

XML 输入是:

<root>
    <ITEM_DATA>
        <DOC_NUMBER>0021182064</DOC_NUMBER>
        <ITM_NUMBER>000010</ITM_NUMBER>
        <ITEM_CATEG>ZBOM</ITEM_CATEG>
        <HG_LV_ITEM>000000</HG_LV_ITEM>
    </ITEM_DATA>                

    <ITEM_DATA>
        <DOC_NUMBER>0021182064</DOC_NUMBER>
        <ITM_NUMBER>000020</ITM_NUMBER>
        <ITEM_CATEG>ZAN</ITEM_CATEG>
        <REL_FOR_BI>A</REL_FOR_BI>
        <HG_LV_ITEM>000010</HG_LV_ITEM>
        <ALTERN_ITM>000000</ALTERN_ITM>
    </ITEM_DATA>

    <ITEM_DATA>
        <DOC_NUMBER>0021182064</DOC_NUMBER>
        <ITM_NUMBER>000030</ITM_NUMBER>
        <ITEM_CATEG>ZAN</ITEM_CATEG>
        <REL_FOR_BI>A</REL_FOR_BI>
        <HG_LV_ITEM>000010</HG_LV_ITEM>
        <ALTERN_ITM>000000</ALTERN_ITM>
    </ITEM_DATA>
    
    <ITEM_DATA>
        <DOC_NUMBER>0021182064</DOC_NUMBER>
        <ITM_NUMBER>000040</ITM_NUMBER>
        <ITEM_CATEG>ZTAT</ITEM_CATEG>
        <REL_FOR_BI>A</REL_FOR_BI>
        <ALTERN_ITM>000000</ALTERN_ITM>
    </ITEM_DATA>        
</root>

我想删除具有值为 ZBOM 的元素“ITEM_CATEG”的 XML 节点“ITEM_DATA”。为此,我应用了这个 XSLT 代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
<xsl:template match="ITEM_DATA[ITEM_CATEG = 'ZBOM']"/>
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

很好用。但我也想删除其他节点中的元素“HG_LV_ITEM”,它们的值等于“ITM_NUMBER”值和“ITEM_CATEG”= ZBOM。

预期的输出结果是:

<root>
    <ITEM_DATA>
        <DOC_NUMBER>0021182064</DOC_NUMBER>
        <ITM_NUMBER>000020</ITM_NUMBER>
        <ITEM_CATEG>ZAN</ITEM_CATEG>
        <REL_FOR_BI>A</REL_FOR_BI>
        <ALTERN_ITM>000000</ALTERN_ITM>
    </ITEM_DATA>

    <ITEM_DATA>
        <DOC_NUMBER>0021182064</DOC_NUMBER>
        <ITM_NUMBER>000030</ITM_NUMBER>
        <ITEM_CATEG>ZAN</ITEM_CATEG>
        <REL_FOR_BI>A</REL_FOR_BI>
        <ALTERN_ITM>000000</ALTERN_ITM>
    </ITEM_DATA>
    
    <ITEM_DATA>
        <DOC_NUMBER>0021182064</DOC_NUMBER>
        <ITM_NUMBER>000040</ITM_NUMBER>
        <ITEM_CATEG>ZTAT</ITEM_CATEG>
        <REL_FOR_BI>A</REL_FOR_BI>
        <ALTERN_ITM>000000</ALTERN_ITM>
    </ITEM_DATA>        
</root>

能否请您分享您的建议?

提前致谢。

请尝试以下 XSLT。

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ITEM_DATA[ITEM_CATEG = 'ZBOM']"/>

    <xsl:template match="HG_LV_ITEM[. = ../ITM_NUMBER][../ITEM_CATEG = 'ZBOM']"/>
</xsl:stylesheet>