【问题标题】:How to add namespace and xsi to the Incoming XML with no namespace如何将命名空间和 xsi 添加到没有命名空间的传入 XML
【发布时间】:2018-10-04 21:47:38
【问题描述】:

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

我试过了:

  1. 使用了添加命名空间管道组件。 (它刚刚添加 命名空间而不是 xsi 位)
  2. 使用地图建立所需的格式,是的,没有运气 只是命名空间。

需要您的帮助。

我的源 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>

【问题讨论】:

  • 非常重要的问题,为什么?这是一个非常奇怪的场景,一个系统在 Empty Namespace 中生成内容,但另一个系统需要 Namespace 中完全相同的结构。这似乎是他们之间的沟通问题,而不是真正需要解决的问题。
  • 请注意“MyNamespace”不是有效的 URI,不能使用。

标签: xslt biztalk biztalk-mapper


【解决方案1】:

像这样使用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)。

【讨论】:

  • 嗨 Ferestes,这是抛出错误 'xsl:template' 不能是 'xsl:template' 元素的子元素。
  • 您好,我收到的 XML 没有任何命名空间,我需要将所有字段映射到目标架构,该架构完全相同,只是为了添加命名空间而创建的。
  • 作为注释添加,xsl:namespace 仅适用于 XSLT-2.0 及更高版本,不适用于 XSLT-1.0。
  • 您不能将模板放入模板中。 xsl:stylesheet 包含模板。请在您的问题中添加您的 xsl 代码以获得进一步的帮助。
  • 虽然这是 XSLT 2.0 的正确答案,但问题是关于只允许 XSLT 1.0 的 BizTalk Server。不幸的是,OP 没有说明这一点。
【解决方案2】:

BizTalk 答案:

首先,好在传入的文档没有命名空间。 Xml 命名空间的麻烦远远超过其价值,应尽可能避免/删除。

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

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

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

【讨论】:

  • 嗨约翰,我实际上创建了两个模式,没有命名空间的源和具有命名空间和 XSI 位的目标。使用 Map 和批量复制 functoid ,能够获取目标命名空间但无法获取元素中的 xsi。如果有任何方法,请帮助我。
  • @Ramjeet 您不需要 xsi,除非 xsi 命名空间中有节点,而您没有。如果接收者坚持认为它就在那里,他们就会误解它是如何工作的……你可以通过坚持他们接受有效的 xml 来解决这个问题。你试过了吗?具体发生了什么?
  • 通过这种方法,当我测试地图并对其进行调试时,我能够获得所需格式的 xml。在接收端口上使用传递管道时,这是失败的。我无法使用 XML 接收,因为我的传入架构中没有命名空间。如果有任何解决方法,请告诉我。
  • 我正在考虑在接收端使用添加命名空间管道组件,一旦添加命名空间,我就可以触发地图以添加 xsi。但不确定如何仅在已经存在的命名空间上添加 xsi 位.将 转换为 w3.org/2001/XMLSchema-instance">
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2017-09-21
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多