如何在没有命名空间的情况下将命名空间和 xsi 添加到传入 XML

How to add namespace and xsi to the Incoming XML with no namespace

我有要求必须将命名空间和 xsi 添加到 源 xml 中没有命名空间的元素。 在 Source 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>

像这样使用 xsl:elementnamespace 属性:

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

BizTalk 回答:

首先,好在传入文档没有名称空间。 Xml 命名空间带来的麻烦远远超过其价值,应尽可能 avoided/removed。

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

但是,如果必须的话,您的过程不应该是 "add a namespace"。您真正要做的是从 SysA 的文档转换为 SysB 的文档。为此,请使用地图。您将使用几乎相同的模式,一个有目标命名空间,一个没有目标命名空间。

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