必须从 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
同级中带有 OrderLineID
的 CommentLine
,则添加模板 <xsl:template match="CommentLine[OrderLineID = preceding-sibling::StockLine/OrderLineID and not(Comment)]"/>
。
我们输入了 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
同级中带有 OrderLineID
的 CommentLine
,则添加模板 <xsl:template match="CommentLine[OrderLineID = preceding-sibling::StockLine/OrderLineID and not(Comment)]"/>
。