BizTalk映射问题

时间:2012-06-14 13:22:40

标签: mapping biztalk

我有一个映射问题,我试图在BizTalk的映射工具中解决。

考虑以下输入文件:

<person>
    <ID>APersonID</ID>
    <relatives>
        <relative>
            <name>Relative name 1</name>
        </relative>
        <relative>
            <name>Relative name 2</name>
        </relative>
    </relatives>
</person>

注意:相对元素的 minOccurs 设置为 0 ,相对元素的 maxOccurs 设置为 unbounded < / em>的

此输入应映射到以下输出:

<relatives>
    <person>
        <ID>APersonID</ID>
        <relative>Relative name 1</relative>
    </person>
    <person>
        <ID>APersonID</ID>
        <relative>Relative name 2</relative>
    </person>
<relatives>

注意:person元素的 minOccurs 1 maxOccurs unbounded

我有一个使用循环functoid的映射,它将输入文件的相对元素链接到输出文件中的person元素。但是现在有一种情况,我给出了以下输入文件:

<person>
    <ID>APersonID</ID>
    <relatives />
</person>

哪个应该映射到

<relatives>
    <person>
        <ID>APersonID</ID>
    </person>
<relatives>

我当前的映射无法处理这种情况。有人可以提供有关如何制作/编辑映射的建议,以便两种情况都能正常工作吗?

1 个答案:

答案 0 :(得分:3)

事情比最初看起来要复杂得多,因为我们需要在进展之前测试至少一个relatives/relative的存在。除了使用XSLT之外,我想不出任何其他方式 - 请参阅here,了解如何从地图中提取XSLT并将BTM更改为使用XSLT而不是可视化函数映射。

以下XSLT

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
    exclude-result-prefixes="msxsl var"
    version="1.0"
    xmlns:ns0="http://BizTalk_Server_Project5.Schema1">
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
    <xsl:template match="/">
        <xsl:apply-templates select="/ns0:person" />
    </xsl:template>
    <xsl:template match="/ns0:person">
        <relatives>
            <xsl:variable name="personId" select="ns0:ID/text()" />
            <xsl:choose>
                <xsl:when test="not(ns0:relatives) or not(ns0:relatives/ns0:relative)">
                    <person>
                        <ID>
                            <xsl:value-of select="$personId" />
                        </ID>
                    </person>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:for-each select="ns0:relatives/ns0:relative">
                        <person>
                            <ID>
                                <xsl:value-of select="$personId" />
                            </ID>
                            <relative>
                                <xsl:value-of select="ns0:name/text()" />
                            </relative>
                        </person>
                    </xsl:for-each>
                </xsl:otherwise>
            </xsl:choose>
        </relatives>
    </xsl:template>
</xsl:stylesheet>

生成您描述的输出。 (显然要更改你的命名空间以匹配,我假设你已经elementFormDefault="qualified"(如果没有,请删除ns0前缀)