我有一个映射问题,我试图在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>
我当前的映射无法处理这种情况。有人可以提供有关如何制作/编辑映射的建议,以便两种情况都能正常工作吗?
答案 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
前缀)