Мы хотим, чтобы удалить пустой тег, который CommentLine из XMLИспользование XSLT, как удалить пустой элемент, который не имеет атрибута или данных, в документе XML?
<CommentLine/>
ВХОДА XML:
<?xml version="1.0" encoding="WINDOWS-1252"?>
<SalesOrders xsd:noNamespaceSchemaLocation="SDOC.XSD" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance">
<Orders>
<OrderHeader>
<CustomerPoNumber>AB-54354</CustomerPoNumber>
</OrderHeader>
<OrderDetails>
<CommentLine>
<Comment>Ensure saddle is color coded</Comment>
<OrderLineID>OR-1810127</OrderLineID>
</CommentLine>
<CommentLine>
<Comment>EDI-001</Comment>
<OrderLineID>OR-1810128</OrderLineID>
</CommentLine>
<StockLine>
<CustomerPoLine>9999</CustomerPoLine>
<StockCode>ABSH-SMH-12OZ-01</StockCode>
<StockDescription>SMH ABS BALANCE SHAMPOO 12OZ</StockDescription>
<OrderQty>1.0</OrderQty>
</StockLine>
<CommentLine>
<Comment>This is for test purpose</Comment>
<OrderLineID>OR-1810124</OrderLineID>
</CommentLine>
<CommentLine>
<Comment>EDI-SAVE</Comment>
<OrderLineID>OR-1810125</OrderLineID>
</CommentLine>
<CommentLine/>
</OrderDetails>
</Orders>
</SalesOrders>
Пробовал XML на нем:
<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 xsd:noNamespaceSchemaLocation="SDOC.XSD" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance">
-<Orders>
-<OrderHeader>
<CustomerPoNumber>AB-54354</CustomerPoNumber>
</OrderHeader>
-<OrderDetails>
-<CommentLine> <Comment>Ensure saddle is color coded</Comment>
<OrderLineID>OR-1810127</OrderLineID>
</CommentLine>
-<CommentLine> <Comment>EDI-001</Comment>
<OrderLineID>OR-1810128</OrderLineID>
</CommentLine>
-<StockLine>
<CustomerPoLine>9999</CustomerPoLine>
<StockCode>ABSH-SMH-12OZ-01</StockCode>
<StockDescription>SMH ABS BALANCE SHAMPOO 12OZ</StockDescription>
<OrderQty>1.0</OrderQty> </StockLine>
-<CommentLine> <Comment>This is for test purpose</Comment>
<OrderLineID>OR-1810124</OrderLineID>
</CommentLine>
-<CommentLine>
<Comment>EDI-SAVE</Comment>
<OrderLineID>OR-1810125</OrderLineID>
</CommentLine>
</OrderDetails>
</Orders>
</SalesOrders>
мы должны удалить элемент в полный входной XML.
Любая помощь будет высоко оценена! Спасибо за ценное время.
Related: [Как сказать, используя XPath, если элемент присутствует и не пуст] (http://stackoverflow.com/q/15909348/205233) и [выражение XSL/XPath, чтобы проверить, содержит ли узел хотя бы один непустой дочерний элемент] (http://stackoverflow.com/д/13703478/205233). – Filburt
Попробуйте 'match =" node() [. = ''] "' Вместо 'match =" @ xsi: nil [. = 'True'] "' – JohnLBevan
ps. глядя на ответы на ссылки @ Filburt, есть одно существенное различие между тем, как они себя ведут по сравнению с моим примечанием выше; то есть в обработке элементов, содержащих только пустые элементы: например. '<Детали_Заказов> Детали_Заказов>'. Решите, как вы хотите, чтобы он вел себя в этом сценарии, а затем сравните ответы, представленные с этими тестовыми данными, чтобы увидеть, что подходит (то есть мой сохранит пустой элемент OrderDetails, а другие - нет). Это также можно было бы решить путем добавления других фильтров (например, для таргетинга только элементов, называемых 'CommentLine'). –
JohnLBevan