2017-02-15 17 views
0

в одной из моих полезных данных xml Мне нужно добавить одно пространство имен после строки ниже.Добавление пространства имен с использованием XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<ep:Document xmlns:ep="namespace here" 
xmlns:gk="namespace here" 
xmlns:sh="namespace here" schemaVersion="" creationDate=""> 

после этого я nedd добавить Xmlns пространства имен: XSI = "http://www.w3.org/2001/XMLSchema-instance">

ожидаемый результат должен быть

<?xml version="1.0" encoding="UTF-8"?> 
<ep:Document xmlns:ep="namespace here" 
xmlns:gk="namespace here" 
xmlns:sh="namespace here" schemaVersion="" creationDate=""xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

не могли бы вы помочь в этом. Позвольте мне уточнить мое требование. В фактическом входном сообщении я получаю полезную нагрузку без каких-либо пространств имен. Это выглядит ниже.

<?xml version="1.0" encoding="UTF-8"?> 
<document> 
</document> 

в ч/б документе у нас есть запас полезной нагрузки.

после этого я использовал XSLT-код для добавления пространств имен и префиксов в полезной нагрузке. ниже - мой XSLT-код.

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ep="namespace here" 
xmlns:sh="namespace here" 
xmlns:gk="namespace here"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 


    <!-- identity transform --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

    <xsl:template match="Document"> 
    <ep:Document> 
    <xsl:apply-templates select="node()|@*"/> 
    </ep:Document> 
    </xsl:template> 

<xsl:template match="Extension|Extension//*"> 
<xsl:element name="gk:{name()}"> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
    </xsl:template> 

<xsl:template match="Header|Header//*"> 
<xsl:element name="sh:{name()}"> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 

</xsl:stylesheet> 

после использования этого кода выхода я получаю выглядит, как показано ниже.

<?xml version="1.0" encoding="UTF-8"?> 
<ep:Document xmlns:ep="namespace here" 
xmlns:gk="namespace here" 
xmlns:sh="namespace here" schemaVersion="" creationDate=""> 

и остальные payload.so мне нужно еще одно пространство имен после версии схемы и CreationDate в существующем коде, как указано в сообщении.

+0

Нам нужно увидеть существующий XSLT - по крайней мере, часть, которая обрабатывает элемент 'ep: Document'. Обратите внимание, что это (другое?) Избыточное требование: если вашему выводу нужна привязка префикса 'xsi', ваш процессор автоматически включил бы его (или выбросил ошибку). –

+0

Позвольте мне уточнить мое требование. в фактической полезной нагрузке ввода я получаю сообщение без каких-либо пространств имен. –

+0

Я отредактировал свой вопрос. пожалуйста, узнайте подробности. –

ответ

0

Если добавить необходимое объявление пространства имен для вашего xsl:stylesheet элемента, т.е .:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ep="namespace here" 
xmlns:sh="namespace here" 
xmlns:gk="namespace here" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

будет вероятно появляются в начальном теге выходного в корневой ep:Document элемент, как вы ожидаете. Я говорю «возможно», потому что XSLT-процессор не должен включать избыточную декларацию пространства имен.

У вас нет контроля над порядком, в котором атрибуты и объявления пространства имен будут отображаться в начальном теге. Заказ по определению незначителен.

+0

, поэтому версия схемы и дата создания будут доступны только после xmlns: xsi namespace? не раньше этого? –

+0

Это полностью зависит от вашего XSLT-процессора. Большинство процессоров сначала перечисляют все пространства имен, а затем атрибуты. Имейте в виду, что XSLT-процессор работает на дереве XML *, а не на самом XML * файле *. Только в конце процесса дерево результатов сериализуется для создания выходного файла. –