Как добавить пространство имен и xsi во входящий XML без пространства имен - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть требование, где я должен добавить Пространство имен и xsi к элементу из исходного XML без Пространства имен.В исходном XML я просто получаю узлы, а пространство имен отсутствует, а другой программе нужен BizTalk для добавления пространства имен и XSI в XML для его обработки.

Я пытался:

  1. Используетсядобавить компонент конвейера пространства имен.(Он просто добавил пространство имен, а не биты xsi)
  2. Использовал Map для установки желаемого формата и да, не повезло, поскольку получил только пространство имен.

Нужна ваша помощь в этом.

Мой исходный XML-код похож на

<?xml version="1.0" encoding="UTF-16"?> 
<Document>
    <CstmrPmtStsRpt>
        <GrpHdr>
            <MsgId></MsgId>
            <CreDtTm></CreDtTm>
            <InitgPty>                 
                <Id>
                    <OrgId>
                        <BICOrBEI></BICOrBEI>
                    </OrgId>
                </Id>
            </InitgPty>
        </GrpHdr>
        <OrgnlGrpInfAndSts>
             <OrgnlMsgId></OrgnlMsgId>
            <OrgnlMsgNmId></OrgnlMsgNmId>
            <OrgnlNbOfTxs></OrgnlNbOfTxs>
            <OrgnlCtrlSum></OrgnlCtrlSum>
            <GrpSts>ACCP</GrpSts>
        </OrgnlGrpInfAndSts>
    </CstmrPmtStsRpt>
</Document>

Мой обязательный формат указан ниже:

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="MyNamespace">     
    <CstmrPmtStsRpt>
        <GrpHdr>
            <MsgId></MsgId>
            <CreDtTm></CreDtTm>
            <InitgPty>                 
                <Id>
                    <OrgId>
                        <BICOrBEI></BICOrBEI>
                    </OrgId>
                </Id>
            </InitgPty>
        </GrpHdr>
        <OrgnlGrpInfAndSts>
            <OrgnlMsgId></OrgnlMsgId>
            <OrgnlMsgNmId></OrgnlMsgNmId>
            <OrgnlNbOfTxs></OrgnlNbOfTxs>
            <OrgnlCtrlSum></OrgnlCtrlSum>
            <GrpSts>ACCP</GrpSts>
        </OrgnlGrpInfAndSts>
    </CstmrPmtStsRpt>
</Document>

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

BizTalk Ответ:

Во-первых, это хорошо, что входящий документ не имеет пространства имен . Пространства имен XML - это гораздо, гораздо больше проблем, чем они того стоят, и их следует избегать / по возможности избегать.

Во-вторых, формат вывода не является допустимым Xml. «MyNamespace» не является допустимым URI и не может использоваться для пространства имен. Если это то, что они просят, им нужно сначала это исправить.

Но, если вам нужно, ваш процесс не должен быть "добавить пространство имен". То, что вы действительно делаете, - это Преобразование из Документа SysA в Документ SysB. Для этого используйте карту. Вы будете использовать для практически идентичных схем, одну с другой, а другую без целевого пространства имен.

Mapper также будет обрабатывать xsi для вас, , если это необходимо .

0 голосов
/ 24 апреля 2018

Используйте атрибут namespace xsl:element, например:

<?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:template match="*">
        <xsl:element name="{local-name()}" namespace="MyNamespace">
            <xsl:namespace name="xsi" select="'http://www.w3.org/2001/XMLSchema-instance'"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Редактировать : Поскольку вам нужно работать с XSLT-1.0. Используйте следующую таблицу стилей:

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

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

    <xsl:template match="/Document">
        <Document xmlns="MyNamespace" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <xsl:apply-templates/>           
        </Document>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name()}" namespace="MyNamespace">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

Обратите внимание, что для этого вам нужно знать имя вашего корневого узла (в данном случае Document).

...