Проблемы с пространством имен - PullRequest
1 голос
/ 25 апреля 2019

Мне нужно ввести xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" в заголовок сообщения, которое нужно отправить третьей стороне.
Или есть способ удалить атрибут xsi:release, но также сохранить xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance?

Это мой xslt:

<xsl:choose>
    <xsl:when test="$msgtype='Nomination_Document'">
        <xsl:element name="Nomination_Document" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" namespace="{$msgns}">
            <xsl:attribute name="xsi:release" xmlns="http://www.w3.org/2001/XMLSchema-instance">
            </xsl:attribute> 
            <xsl:attribute name="release" xmlns="http://www.w3.org/2001/XMLSchema-instance">
                <xsl:value-of select="'3'"/>
            </xsl:attribute> 

Это мой ввод:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<TSMessage xmlns="http://ECG.NOMSInhouse/V1.1.0.0">
    <Header>
        <MsgNumber Revision="1" MsgNo="840711"/>
        <GenerationDate Date="2019-04-16T11:55:22+02:00"/>
        <MsgSender Role="ZSH" Label="" CodeAgency="" ID=""/>
        <MsgReceiver Role="ZSO" Label="" CodeAgency="" ID=""/>
        <MsgType TypeCode="TN"/>
        <Subject Text=""/>
        <MsgPeriod TimeTo="2019-04-18T06:00:00+02:00" TimeFrom="2019-04-17T06:00:00+02:00"/>
        <Contract ContractID=""/>

Вот что я получаю сейчас:

<?xml version="1.0" encoding="UTF-8"?><Nomination_Document 
 xmlns="urn:easeegas.eu:edigas:nominationandmatching:nominationdocument:5:1" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:release="" 
 release="3">

Мне нужен заголовок сообщения, похожий на:

<?xml version="1.0" encoding="UTF-8"?><Nomination_Document 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="urn:easeegas.eu:edigas:nominationandmatching:nominationdocument:5:1 " release="3">

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Не используйте <xsl:element> и <xsl:attribute> , кроме , когда имена элементов / атрибутов рассчитываются динамически.Если они исправлены (как в этом случае), просто запишите элементы / атрибуты напрямую.

Эта таблица стилей:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ecg="http://ECG.NOMSInhouse/V1.1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="urn:easeegas.eu:edigas:nominationandmatching:nominationdocument:5:1"
    exclude-result-prefixes="ecg xsi"
>
    <xsl:output indent="yes" encoding="utf-8" />

    <xsl:template match="ecg:TSMessage[ecg:Header/ecg:MsgType/@TypeCode = 'TN']">
        <Nomination_Document release="3">
            <xsl:comment> ... more processing ... </xsl:comment>
        </Nomination_Document>
    </xsl:template>
</xsl:stylesheet>

Применимо к этому XML:

<TSMessage xmlns="http://ECG.NOMSInhouse/V1.1.0.0">
    <Header>
        <MsgNumber Revision="1" MsgNo="840711"/>
        <GenerationDate Date="2019-04-16T11:55:22+02:00"/>
        <MsgSender Role="ZSH" Label="" CodeAgency="" ID=""/>
        <MsgReceiver Role="ZSO" Label="" CodeAgency="" ID=""/>
        <MsgType TypeCode="TN"/>
        <Subject Text=""/>
        <MsgPeriod TimeTo="2019-04-18T06:00:00+02:00" TimeFrom="2019-04-17T06:00:00+02:00"/>
        <Contract ContractID=""/>
    </Header>
</TSMessage>

дает такой результат:

<?xml version="1.0" encoding="utf-8"?>
<Nomination_Document release="3" xmlns="urn:easeegas.eu:edigas:nominationandmatching:nominationdocument:5:1">
    <!-- ... more processing ... -->
</Nomination_Document>

Примечания:

  • Я рекомендую предпочесть несколько <xsl:template match="something specific"> одному <xsl:coose>, просто потому, что ваш код будет менее глубоко вложенным.
  • Объявите все пространства имен, которые вы собираетесь использовать, на уровне <xsl:stylesheet>.
  • Вы можете свободно выбирать префиксы пространства имен - я выбрал ecg для пространства имен http://ECG.NOMSInhouse/V1.1.0.0, вы можете выбратьчто-то, что вам нравится больше.
  • Используйте exclude-result-prefixes, чтобы предотвратить появление ненужных объявлений пространства имен в выводе.
0 голосов
/ 25 апреля 2019

Вы можете удалить xsi:release и добавить эту строку <xsl:namespace name="xsi" select="'http://www.w3.org/2001/XMLSchema-instance'"/>

Пример, подобный приведенному ниже:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">

<xsl:output method="xml" indent="yes"/>

<xsl:variable name="msgtype" select="'Nomination_Document'" />
<xsl:variable name="msgns" select="'urn:easeegas.eu:edigas:nominationandmatching:nominationdocument:5:1'" />

<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="$msgtype='Nomination_Document'">
            <xsl:element name="Nomination_Document" namespace="{$msgns}">
                <xsl:namespace name="xsi" select="'http://www.w3.org/2001/XMLSchema-instance'"/>
                <xsl:attribute name="release">
                    <xsl:value-of select="'3'" />
                </xsl:attribute>
            </xsl:element>
        </xsl:when>
    </xsl:choose>
</xsl:template>

https://xsltfiddle.liberty -развитие.net / jyRYYiB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...