2016-07-19 1 views
0

Мы хотим, чтобы удалить пустой тег, который 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.

Любая помощь будет высоко оценена! Спасибо за ценное время.

+1

Related: [Как сказать, используя XPath, если элемент присутствует и не пуст] (http://stackoverflow.com/q/15909348/205233) и [выражение XSL/XPath, чтобы проверить, содержит ли узел хотя бы один непустой дочерний элемент] (http://stackoverflow.com/д/13703478/205233). – Filburt

+0

Попробуйте 'match =" node() [. = ''] "' Вместо 'match =" @ xsi: nil [. = 'True'] "' – JohnLBevan

+1

ps. глядя на ответы на ссылки @ Filburt, есть одно существенное различие между тем, как они себя ведут по сравнению с моим примечанием выше; то есть в обработке элементов, содержащих только пустые элементы: например. '<Детали_Заказов>'. Решите, как вы хотите, чтобы он вел себя в этом сценарии, а затем сравните ответы, представленные с этими тестовыми данными, чтобы увидеть, что подходит (то есть мой сохранит пустой элемент OrderDetails, а другие - нет). Это также можно было бы решить путем добавления других фильтров (например, для таргетинга только элементов, называемых 'CommentLine'). – JohnLBevan

ответ

1

Это решение позволит удалить все пустые элементы, не удаляя их родительские элементы (то есть, если у вас <OrderDetails><CommentLine/></OrderDetails> вы получите и пустой OrderDetails элемент в результирующем наборе.

<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="@*|node()[./node()]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

т.е. я говорю систему в возвращать только узлы, которые имеют дочерние узлы (будь они элемент или текст) <xsl:template match="@*|node()[./node()]">

Demo:. http://xsltransform.net/jyRYYjs

Per @ комментарии Filburt, в случае вы хотите также удалить элементы, которые становятся пустыми, как только их пустые дочерние элементы удаляются, следует консультируют по этим ссылкам:

+0

, когда я добавляю этот шаблон, получаю следующую ошибку: http://paste.ofcode.org/AibFyqZYNCv4ZHhSmsdDEd Я также получаю повторяющиеся данные для тега . можно удалить дубликат тега, используя xslt 2.0 – NEO

 Смежные вопросы

  • Нет связанных вопросов^_^