基于源字段的存在,删除节点所需的XSLT代码

问题描述 投票:0回答:1

在输入文件中,如果despatchAdviceLineItem包含字段serialNumber(如果存在),那么我们需要删除相应的despatchAdviceLineItem。请通过XSLT代码帮助我,以提供此要求,并提供输入和输出详细信息。

输入和输出:

<despatchAdviceLogisticUnit>
         <logisticUnitIdentification>
            <sscc>200000000000000001</sscc>
         </logisticUnitIdentification>
         <despatchAdviceLineItem>
            <lineItemNumber>5001</lineItemNumber>
            <transactionalTradeItem>
               <gtin>18901148101194</gtin>
                 <transactionalItemData>
                  <lotNumber>283763</lotNumber>
                  <tradeItemQuantity>600</tradeItemQuantity>
               </transactionalItemData>
            </transactionalTradeItem>
         </despatchAdviceLineItem>
         <despatchAdviceLineItem>
            <lineItemNumber>5002</lineItemNumber>
            <transactionalTradeItem>
               <gtin>18901148101194</gtin>
               <transactionalItemData>
                  <lotNumber>296474</lotNumber>
                  <tradeItemQuantity>400</tradeItemQuantity>
               </transactionalItemData>
            </transactionalTradeItem>
         </despatchAdviceLineItem>
         <despatchAdviceLineItem>
            <lineItemNumber>5002</lineItemNumber>
            <transactionalTradeItem>
               <gtin>18901148101194</gtin>
                <transactionalItemData>
                  <lotNumber>296474</lotNumber>
                  <serialNumber>SN00000000001</serialNumber>
                  <tradeItemQuantity>2</tradeItemQuantity>
               </transactionalItemData>
            </transactionalTradeItem>
         </despatchAdviceLineItem>
      </despatchAdviceLogisticUnit>  
Desired output:
<despatchAdviceLogisticUnit>
         <logisticUnitIdentification>
            <sscc>200000000000000001</sscc>
         </logisticUnitIdentification>
         <despatchAdviceLineItem>
            <lineItemNumber>5001</lineItemNumber>
            <transactionalTradeItem>
               <gtin>18901148101194</gtin>
                 <transactionalItemData>
                  <lotNumber>283763</lotNumber>
                  <tradeItemQuantity>600</tradeItemQuantity>
               </transactionalItemData>
            </transactionalTradeItem>
         </despatchAdviceLineItem>
         <despatchAdviceLineItem>
            <lineItemNumber>5002</lineItemNumber>
            <transactionalTradeItem>
               <gtin>18901148101194</gtin>
               <transactionalItemData>
                  <lotNumber>296474</lotNumber>
                  <tradeItemQuantity>400</tradeItemQuantity>
               </transactionalItemData>
            </transactionalTradeItem>
         </despatchAdviceLineItem>       
      </despatchAdviceLogisticUnit> ```
xslt xslt-1.0 xslt-2.0 xslt-grouping xslt-3.0
1个回答
0
投票

所有这些代码都以可以在XSLT 3中声明的身份转换模板开始

<xsl:mode on-no-match="shallow-copy"/>

然后,您只需为不想复制的元素添加一个空模板,例如

<xsl:template match="despatchAdviceLineItem[.//serialNumber]"/>

您可以在https://xsltfiddle.liberty-development.net/a9GPfL处看到它的运行状态。

对于较早的版本,您需要拼写身份转换模板,而不是使用xsl:mode

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

<xsl:template match="despatchAdviceLineItem[.//serialNumber]"/>

https://xsltfiddle.liberty-development.net/a9GPfL/1

© www.soinside.com 2019 - 2024. All rights reserved.