如何将namespace和xsi添加到没有命名空间的Incoming XML中

时间:2018-04-24 15:01:53

标签: xslt biztalk biztalk-mapper

我有要求我必须在其中添加Namespace和xsi 来自源xml的元素,没有命名空间。 在Source XML中,我只是获取节点,并且没有命名空间 另一个程序需要BizTalk将Namespace和XSI添加到XML进行处理。

我试过了:

  1. 使用添加命名空间管道组件。 (它刚补充说 命名空间而不是xsi位)
  2. 使用Map来提供所需的格式,是的,没有运气 只是命名空间。
  3. 需要你的帮助。

    我的源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 :(得分:4)

使用namespace的{​​{1}}属性,如下所示:

xsl:element

编辑:因为您需要使用XSLT-1.0。使用以下样式表:

<?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>

请注意,您需要知道您的rootnode的名称(在这种情况下为<?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> )。

答案 1 :(得分:1)

BizTalk答案:

首先,传入文档没有名称空间是好事。 Xml命名空间远远超过它们的价值,应尽可能避免/删除。

其次输出格式无效Xml。 “MyNamespace”不是有效的URI,不能用于命名空间。如果这是他们要求的,他们需要先解决这个问题。

但是,如果必须,您的流程不应该是“添加命名空间”。你真正在做的是从SysA的文档转换到SysB的文档。为此,请使用地图。您将使用实际上相同的Schema,一个有一个,一个没有Target Namespace。

Mapper也将为您处理xsi,如果需要