Правильно ли я считаю, что вы хотите воспроизвести почти точную копию входного XML с добавлением декларации пространства имен xsi, отсутствующей во входных данных?
Во-первых, как и сейчас, ваш ввод не является правильно сформированным XML, просто из-за отсутствия объявления пространства имен xsi. Следовательно, нет никакого способа использовать XSLT для его добавления: любой XSLT-процессор захлебнется неправильной формой ввода.
Во-вторых, вы должны проверить чувствительность к регистру: в настоящее время ни одно из входных узлов не соответствует выражению <xsl:for-each select="HEADER">
select. Если вы измените его на "Header"
, правило шаблона действительно заменит ввод <Header>
на <HEADER>
, содержимое которого копируется одинаково. Но ... только если у вас есть объявления пространства имен в праве ввода ...
Итак, если цель действительно состоит в том, чтобы «обновить» некорректно сформированный XML до правильно сформированной версии, я бы предложил поискать другие инструменты, такие как Perl, Awk или любой другой простой поиск / замена. решение, которое работает с простым текстом и может просто добавить отсутствующее объявление пространства имен в элемент документа:
<Header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<End_Date xsi:nil="true"/>
</Header>
(Конечно, вы также можете использовать функцию unparsed-text($href)
в XSLT 2.0, которая позволяет вам читать любой файл в виде неразобранного текста, который затем можно будет обработать с помощью <xsl:analyze-string>
. См. Статью Майкла Кея Наверх -конверсия с использованием XSLT 2.0 для дальнейшего вдохновения. Поскольку это довольно неуклюжий способ обработки не-XML с помощью инструмента XML, я даю это просто для полноты - если добавление префикса пространства имен является единственной проблемой, которую нужно решить, я определенно выбрал бы более дешевый вариант поиска / замены.)
Надеюсь, это поможет,
Рон