必须从 XML 中删除没有子元素的元素

Have to remove element without child element from XML

我们输入了 XML。其中,Loop 元素是 StockLine 标签。但是当它重复时,它还会在 Comment Line 标签内创建空的子元素评论。

假设我们有 2 个 stocklines.we 恰好有 2 个 commentLine 标签。这两个 commentLine 标签未使用。想从 XML 中删除。但同时不应删除带有注释的 CommentLine。只有没有评论的评论行应该被删除。

基本上,我们想删除这部分:

<CommentLine>
            <OrderLineID>OR-1593605</OrderLineID>
         </CommentLine>

输入XML:

<?xml version="1.0" encoding="Windows-1252"?>
<SalesOrders xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
             xsd:noNamespaceSchemaLocation="SDOC.XSD">
   <Orders>
      <OrderHeader>
      <Customer>0TARGT</Customer>
     </OrderHeader>
      <OrderDetails>
         <StockLine>
            <CustomerPoLine>9999</CustomerPoLine>
            <StockCode>xyz</StockCode>
            <StockDescription>xyz desc</StockDescription>
            <OrderQty>10.0</OrderQty>
            <OrderUom>CS</OrderUom>
            <Price>93.48</Price>
            <PriceUom>CS</PriceUom>
            <AlwaysUsePriceEntered>Y</AlwaysUsePriceEntered>
            <UserDefined>1</UserDefined>
            <OrderLineID>OR-1593605</OrderLineID>
         </StockLine>
         <CommentLine>
            <OrderLineID>OR-1593605</OrderLineID>
         </CommentLine>
         <CommentLine>
            <Comment>TEST PURPOSE</Comment>
            <OrderLineID>OR-1810120</OrderLineID>
         </CommentLine>
         <CommentLine>
            <Comment>This is for test purpose</Comment>
            <OrderLineID>OR-1810121</OrderLineID>
         </CommentLine>
         <CommentLine>
            <Comment>EDI-TEST</Comment>
            <OrderLineID>OR-1810123</OrderLineID>
         </CommentLine>
      </OrderDetails>
   </Orders>
</SalesOrders>

我们尝试了以下 XSLT:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="Windows-1252" indent="yes"/>

        <xsl:template match="@xsi:nil[.='true']" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
    <xsl:template match="@*|node()">
        <xsl:copy copy-namespaces="no">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    </xsl:stylesheet>

预期输出:

<?xml version="1.0" encoding="Windows-1252"?>
    <SalesOrders xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
                 xsd:noNamespaceSchemaLocation="SDOC.XSD">
       <Orders>
          <OrderHeader>
          <Customer>0TARGT</Customer>
         </OrderHeader>
          <OrderDetails>
             <StockLine>
                <CustomerPoLine>9999</CustomerPoLine>
                <StockCode>xyz</StockCode>
                <StockDescription>xyz desc</StockDescription>
                <OrderQty>10.0</OrderQty>
                <OrderUom>CS</OrderUom>
                <Price>93.48</Price>
                <PriceUom>CS</PriceUom>
                <AlwaysUsePriceEntered>Y</AlwaysUsePriceEntered>
                <UserDefined>1</UserDefined>
                <OrderLineID>OR-1593605</OrderLineID>
             </StockLine>
             <CommentLine>
                <Comment>TEST PURPOSE</Comment>
                <OrderLineID>OR-1810120</OrderLineID>
             </CommentLine>
             <CommentLine>
                <Comment>This is for test purpose</Comment>
                <OrderLineID>OR-1810121</OrderLineID>
             </CommentLine>
             <CommentLine>
                <Comment>EDI-TEST</Comment>
                <OrderLineID>OR-1810123</OrderLineID>
             </CommentLine>
          </OrderDetails>
       </Orders>
    </SalesOrders>

如果要删除所有 CommentLine 个没有 Comment 子元素的元素,请添加模板 <xsl:template match="CommentLine[not(Comment)]"/>

如果您只想删除 StockLine 同级中带有 OrderLineIDCommentLine,则添加模板 <xsl:template match="CommentLine[OrderLineID = preceding-sibling::StockLine/OrderLineID and not(Comment)]"/>