BizTalk映射程序:同级之间的链接
我需要转换以下XML:BizTalk映射程序:同级之间的链接,biztalk,biztalk-2010,biztalk-mapper,Biztalk,Biztalk 2010,Biztalk Mapper,我需要转换以下XML: <?xml version="1.0" encoding="utf-8"?> <TestRecords> <TestData> <Users> <User> <Id>BG123</Id> <Name>Bill Gates</Name> </User> <User>
<?xml version="1.0" encoding="utf-8"?>
<TestRecords>
<TestData>
<Users>
<User>
<Id>BG123</Id>
<Name>Bill Gates</Name>
</User>
<User>
<Id>SN123</Id>
<Name>Satya Nadella</Name>
</User>
</Users>
<UserDetails>
<UserDetail>
<UserId>SN123</UserId>
<CompanyName>Microsoft Corp</CompanyName>
</UserDetail>
<UserDetail>
<UserId>
<UserId>BG123</UserId>
<CompanyName>Bill Gates Foundation</CompanyName>
</UserId>
</UserDetail>
</UserDetails>
BG123
比尔盖茨
SN123
萨蒂亚·纳德拉
SN123
微软公司
BG123
比尔盖茨基金会
我需要将此XML映射到以下XML:
<?xml version="1.0" encoding="utf-8"?>
<TestRecords>
<TestData>
<Users>
<User>
<Id>BG123</Id>
<Name>Bill Gates</Name>
<CompanyName>Bill Gates Foundation</CompanyName>
</User>
<User>
<Id>SN123</Id>
<Name>Satya Nadella</Name>
<CompanyName>Microsoft Corp</CompanyName>
</User>
</Users>
</TestData>
</TestRecords>
BG123
比尔盖茨
比尔盖茨基金会
SN123
萨蒂亚·纳德拉
微软公司
当我在Users/User上循环时,我需要找到UserDetail,其中UserDetail/UserId等于当前用户/Id
谢谢你,并致以最良好的问候
Michael如果您不想按照FCR的建议进行自定义XSLT,那么当您有不同的循环结构时,唯一的其他选择就是使用一个中间模式和两个映射 产生
<TestRecords>
<TestData>
<Users>
<User>
<Id>BG123</Id>
<Name>Bill Gates</Name>
<UserDetails>
<UserID>SN123</UserID>
<CompanyName>Microsoft Corp</CompanyName>
</UserDetails>
<UserDetails>
<UserID>BG123</UserID>
<CompanyName>Bill Gates Foundation</CompanyName>
</UserDetails>
</User>
<User>
<Id>SN123</Id>
<Name>Satya Nadella</Name>
<UserDetails>
<UserID>SN123</UserID>
<CompanyName>Microsoft Corp</CompanyName>
</UserDetails>
<UserDetails>
<UserID>BG123</UserID>
<CompanyName>Bill Gates Foundation</CompanyName>
</UserDetails>
</User>
</Users>
</TestData>
</TestRecords>
BG123
比尔盖茨
SN123
微软公司
BG123
比尔盖茨基金会
SN123
萨蒂亚·纳德拉
SN123
微软公司
BG123
比尔盖茨基金会
然后,您可以运行第二个映射以生成所需的结果
但是,如果第二个列表很大,这将变得非常低效。这是
xslt
中常见的查找模式,也可以使用xsl:key
创建索引,从而提高大型文档的性能。如果需要将.btm
转换为xslt
(另外,我假设在最后一个UserDetails/UserDetails
元素上没有双包装器UserId
):
这是很常见的情况。您不能使用标准函数来完成此操作。实现这一点的最简单方法是自定义XSLT模板函数。尝试在谷歌上搜索“BizTalk合并/加入消息”,例如:谢谢,我设法使它按照博客中的解释工作post@FCR实际上,使用标准functoid是可能的,但有时可能不是最有效的方法。见下面我的答案。另外,你提到的那篇博文是我的一位同事写的。是的,我没有想到这一点。有点奇怪的解决方案,顺便说一句=)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="userLookup"
match="/TestRecords/TestData/UserDetails/UserDetail" use="UserId"/>
<!--identity template - copy everything by default -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!--i.e.match only Users in the first Users/User tree. Actually the explicit
ancestor qualifier is redundant because of the other suppress template -->
<xsl:template match="User[ancestor::Users]">
<User>
<xsl:copy-of select="child::*" />
<CompanyName>
<xsl:value-of select="key('userLookup', Id)/CompanyName"/>
</CompanyName>
</User>
</xsl:template>
<!--Suppress the second userdetails part of the tree entirely -->
<xsl:template match="UserDetails" />
</xsl:stylesheet>