如何在没有命名空间的情况下将命名空间和 xsi 添加到传入 XML
How to add namespace and xsi to the Incoming XML with no namespace
我有要求必须将命名空间和 xsi 添加到
源 xml 中没有命名空间的元素。
在 Source XML 中,我只是获取节点并且没有命名空间
另一个程序需要 BizTalk 将命名空间和 XSI 添加到 XML 以进行处理。
我试过了:
- 使用了添加命名空间管道组件。 (刚刚加了
命名空间而不是 xsi 位)
- 使用 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:element
的 namespace
属性:
<?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,如果需要。
我有要求必须将命名空间和 xsi 添加到 源 xml 中没有命名空间的元素。 在 Source XML 中,我只是获取节点并且没有命名空间 另一个程序需要 BizTalk 将命名空间和 XSI 添加到 XML 以进行处理。
我试过了:
- 使用了添加命名空间管道组件。 (刚刚加了 命名空间而不是 xsi 位)
- 使用 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:element
的 namespace
属性:
<?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,如果需要。