Я хочу сохранить внешний XML-файл, в котором я буду хранить те элементы / атрибуты, которые должны быть удалены из входного файла. Поэтому всякий раз, когда необходимо удалить новый элемент / атрибут, я просто добавлю это во внешний XML-файл.
Я создал XSLT, который удаляет элемент, сопоставляя имена во входящем файле с моим внешним файлом. Проблема в том, что это не соответствует всем элементам, только первое вхождение удаляется. Элементы / атрибуты, которые я хочу удалить, могут находиться в любом месте входного файла.
Мой XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>
<xsl:template match="/">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<!-- @=attribuutti -->
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="node()[name() = name(document('TagsDB.xml')/INVOICE_CENTER/ElementsToRemove/*)]"/>
</xsl:stylesheet>
Input.xml
<INVOICE_CENTER>
<CONTENT_FRAME>
<Test1>123</Test1>
<INVOICES>
<INVOICE>
<HEADER>
<PROCESS_CODE>00</PROCESS_CODE>
</HEADER>
<ROWS>
<ROW>
<ROW_NUMBER>0</ROW_NUMBER>
<Test2>12345</Test2>
</ROW>
</ROWS>
</INVOICE>
</INVOICES>
</CONTENT_FRAME>
</INVOICE_CENTER>
Мой внешний файл (TagsDB.xml), в котором я упомянул элемент / атрибут, который должен быть удален:
<INVOICE_CENTER>
<ElementsToRemove>
<Test1/>
<Test2/>
</ElementsToRemove>
<AttributesToRemove Att1="" Att2=""/>
</INVOICE_CENTER>
Ожидаемый результат:
<INVOICE_CENTER>
<CONTENT_FRAME>
<INVOICES>
<INVOICE>
<HEADER>
<PROCESS_CODE>00</PROCESS_CODE>
</HEADER>
<ROWS>
<ROW>
<ROW_NUMBER>0</ROW_NUMBER>
</ROW>
</ROWS>
</INVOICE>
</INVOICES>
</CONTENT_FRAME>
</INVOICE_CENTER>
Итак, Test1 и Test2 должны быть удалены из XML, потому что они определены в моем внешнем XML-файле.