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>
我面临以下问题:
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>