BizTalk XSLT映射
我有两个输入csv文件,一个用于成员,另一个用于如下所示的好处 成员xml看起来像BizTalk XSLT映射,xslt,biztalk,Xslt,Biztalk,我有两个输入csv文件,一个用于成员,另一个用于如下所示的好处 成员xml看起来像 <Root xmlns="http://TestTwoInput.MemberSchema"> <Record xmlns=""> <EmployeeID>12</EmployeeID> <MemberText>MEMBER</MemberText> <SPID>007609952</SPID>
<Root xmlns="http://TestTwoInput.MemberSchema">
<Record xmlns="">
<EmployeeID>12</EmployeeID>
<MemberText>MEMBER</MemberText>
<SPID>007609952</SPID>
<MPID>007609952</MPID>
<SAID>12</SAID>
<ACode>05</ACode>
</Record>
<Record xmlns="">
<EmployeeID>14</EmployeeID>
<MemberText>MEMBER</MemberText>
<SPID>004482352</SPID>
<MPID>004482352</MPID>
<SAID>14</SAID>
<ACode>05</ACode>
</Record>
</Root>
这是我的地图
但这会像这样抛出输出
12,MEMBER,007609952,007609952,12,05
12,BENEFIT,MEA,001,0100189
12,BENEFIT,DEN,002,0100189
,,,,
,,,,
,,,,
,,,,
14,MEMBER,004482352,004482352,14,05
12,BENEFIT,MEA,001,0100189
12,BENEFIT,DEN,002,0100189
,,,,
,,,,
,,,,
,,,,
下面是用于映射的XSLT
<?xml version="1.0" encoding="UTF-16"?>
<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 s1 s0 s2 userCSharp" version="1.0" xmlns:s1="http://TestTwoInput.BenefitSchema" xmlns:ns0="http://TestTwoInput.OutputSchema" xmlns:s0="http://TestTwoInput.MemberSchema" xmlns:s2="http://schemas.microsoft.com/BizTalk/2003/aggschema" xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:template match="/">
<xsl:apply-templates select="/s2:Root" />
</xsl:template>
<xsl:template match="/s2:Root">
<ns0:Root>
<xsl:for-each select="InputMessagePart_0/s0:Root/Record">
<Record>
<Member>
<EID>
<xsl:value-of select="EmployeeID/text()" />
</EID>
<Text>
<xsl:value-of select="MemberText/text()" />
</Text>
<SPID>
<xsl:value-of select="SPID/text()" />
</SPID>
<MPID>
<xsl:value-of select="MPID/text()" />
</MPID>
<SIAD>
<xsl:value-of select="SAID/text()" />
</SIAD>
<ACode>
<xsl:value-of select="ACode/text()" />
</ACode>
</Member>
<xsl:for-each select="../../../InputMessagePart_1/s1:Root/Record">
<xsl:variable name="var:v1" select="userCSharp:LogicalEq(string(EmployeeID/text()) , string(../../../InputMessagePart_0/s0:Root/Record/EmployeeID/text()))" />
<xsl:variable name="var:v3" select="string(EmployeeID/text())" />
<xsl:variable name="var:v4" select="string(../../../InputMessagePart_0/s0:Root/Record/EmployeeID/text())" />
<xsl:variable name="var:v5" select="userCSharp:LogicalEq($var:v3 , $var:v4)" />
<Benefit>
<xsl:if test="string($var:v1)='true'">
<xsl:variable name="var:v2" select="EmployeeID/text()" />
<ID>
<xsl:value-of select="$var:v2" />
</ID>
</xsl:if>
<xsl:if test="string($var:v5)='true'">
<xsl:variable name="var:v6" select="BenefitText/text()" />
<Text>
<xsl:value-of select="$var:v6" />
</Text>
</xsl:if>
<xsl:if test="string($var:v5)='true'">
<xsl:variable name="var:v7" select="BCode/text()" />
<BCode>
<xsl:value-of select="$var:v7" />
</BCode>
</xsl:if>
<xsl:if test="string($var:v5)='true'">
<xsl:variable name="var:v8" select="ELR/text()" />
<ELR>
<xsl:value-of select="$var:v8" />
</ELR>
</xsl:if>
<xsl:if test="string($var:v5)='true'">
<xsl:variable name="var:v9" select="Control/text()" />
<Control>
<xsl:value-of select="$var:v9" />
</Control>
</xsl:if>
</Benefit>
</xsl:for-each>
</Record>
</xsl:for-each>
</ns0:Root>
</xsl:template>
<msxsl:script language="C#" implements-prefix="userCSharp"><![CDATA[
public bool LogicalEq(string val1, string val2)
{
bool ret = false;
double d1 = 0;
double d2 = 0;
if (IsNumeric(val1, ref d1) && IsNumeric(val2, ref d2))
{
ret = d1 == d2;
}
else
{
ret = String.Compare(val1, val2, StringComparison.Ordinal) == 0;
}
return ret;
}
public bool IsNumeric(string val)
{
if (val == null)
{
return false;
}
double d = 0;
return Double.TryParse(val, System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out d);
}
public bool IsNumeric(string val, ref double d)
{
if (val == null)
{
return false;
}
return Double.TryParse(val, System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out d);
}
]]></msxsl:script>
</xsl:stylesheet>
我不知道如何通过XSLT实现输出。非常感谢您的帮助好的。因此,您发布的输入消息与AGGSHEMA格式的输入消息不完全相同,如下所示:
<Root xmlns="http://schemas.microsoft.com/BizTalk/2003/aggschema">
<InputMessagePart_0 xmlns="">
<Root xmlns="http://TestTwoInput.MemberSchema">
<Record xmlns="">
<EmployeeID>12</EmployeeID>
<MemberText>MEMBER</MemberText>
<SPID>007609952</SPID>
<MPID>007609952</MPID>
<SAID>12</SAID>
<ACode>05</ACode>
</Record>
<Record xmlns="">
<EmployeeID>14</EmployeeID>
<MemberText>MEMBER</MemberText>
<SPID>004482352</SPID>
<MPID>004482352</MPID>
<SAID>14</SAID>
<ACode>05</ACode>
</Record>
</Root>
</InputMessagePart_0>
<InputMessagePart_1 xmlns="">
<Root xmlns="http://TestTwoInput.BenefitSchema">
<Record xmlns="">
<EmployeeID>12</EmployeeID>
<BenefitText>BENEFIT</BenefitText>
<BCode>MEA</BCode>
<ELR>001</ELR>
<Control>0100189</Control>
</Record>
<Record xmlns="">
<EmployeeID>12</EmployeeID>
<BenefitText>BENEFIT</BenefitText>
<BCode>DEN</BCode>
<ELR>002</ELR>
<Control>0100189</Control>
</Record>
<Record xmlns="">
<EmployeeID>14</EmployeeID>
<BenefitText>BENEFIT</BenefitText>
<BCode>DEN</BCode>
<ELR>002</ELR>
<Control>0100189</Control>
</Record>
<Record xmlns="">
<EmployeeID>14</EmployeeID>
<BenefitText>BENEFIT</BenefitText>
<BCode>MEA</BCode>
<ELR>001</ELR>
<Control>0100189</Control>
</Record>
<Record xmlns="">
<EmployeeID>14</EmployeeID>
<BenefitText>BENEFIT</BenefitText>
<BCode>MEA</BCode>
<ELR>001</ELR>
<Control>0100189</Control>
</Record>
<Record xmlns="">
<EmployeeID>14</EmployeeID>
<BenefitText>BENEFIT</BenefitText>
<BCode>DEN</BCode>
<ELR>002</ELR>
<Control>0100189</Control>
</Record>
</Root>
</InputMessagePart_1>
</Root>
这将为您提供以下输出:
<ns0:Root xmlns:ns0="http://TestTwoInput.OutputSchema">
<Record>
<Member>
<EID>12</EID>
<Text>MEMBER</Text>
<SPID>007609952</SPID>
<MPID>007609952</MPID>
<SIAD>12</SIAD>
<ACode>05</ACode>
</Member>
<Benefit>
<ID>12</ID>
<Text>BENEFIT</Text>
<BCode>MEA</BCode>
<ELR>001</ELR>
<Control>0100189</Control>
</Benefit>
<Benefit>
<ID>12</ID>
<Text>BENEFIT</Text>
<BCode>DEN</BCode>
<ELR>002</ELR>
<Control>0100189</Control>
</Benefit>
</Record>
<Record>
<Member>
<EID>14</EID>
<Text>MEMBER</Text>
<SPID>004482352</SPID>
<MPID>004482352</MPID>
<SIAD>14</SIAD>
<ACode>05</ACode>
</Member>
<Benefit>
<ID>14</ID>
<Text>BENEFIT</Text>
<BCode>DEN</BCode>
<ELR>002</ELR>
<Control>0100189</Control>
</Benefit>
<Benefit>
<ID>14</ID>
<Text>BENEFIT</Text>
<BCode>MEA</BCode>
<ELR>001</ELR>
<Control>0100189</Control>
</Benefit>
<Benefit>
<ID>14</ID>
<Text>BENEFIT</Text>
<BCode>MEA</BCode>
<ELR>001</ELR>
<Control>0100189</Control>
</Benefit>
<Benefit>
<ID>14</ID>
<Text>BENEFIT</Text>
<BCode>DEN</BCode>
<ELR>002</ELR>
<Control>0100189</Control>
</Benefit>
</Record>
</ns0:Root>
下面是上面的XSLT转换:
通过使用一些xsl:keys Muenchian分组,您可能会获得更好的性能—如果您打算在更大的文档结果集上使用它,请对此进行一些研究;但是,如果您的文档看起来像您通常发送到这里的文档,那么您应该很好。老实说,如果它们变得很大,我建议在源代码处重构,而不是尝试使用XSLT来解决所有问题-如果可能,限制生成平面文件的任何过程,或者在SQL中做更多的工作,如果这是来自SQL,则实际合并一些数据和/或页面,或者用C编写一个自定义组件,以比XSLT引擎更有效地处理合并问题。您似乎已经多次用稍微不同的措辞发布了这个问题。如果您想获得有关XSLT问题的帮助,请包括您的源XML,例如通过BizTalk运行的本机平面文件和预期的输出XML,以及您尝试使用的XSLT,这里和其他一些文章中似乎包括了这些内容。如果没有建设性的问题,请返回并删除与此类似的问题…@DanField我在这里发布之前删除了我以前的问题。我已使用输入XML编辑了我的问题。请帮我做这个谢谢丹。我对XSLT映射非常陌生。我应该从当前映射中删除输入和输出模式之间的所有链接,而只使用XSLT代码。正如您所说的,源代码是来自Oracle数据库的视图,成员记录将近2000条记录,好处是12000条记录。可以在映射中使用吗?对于那个卷,我会完全避免使用映射。XSLT在那里无法很好地扩展,映射将使用大量内存。您应该寻找更好的方法来用SQL准备数据,或者使用XmlReader之类的东西在流式管道组件中处理数据。
<Root xmlns="http://schemas.microsoft.com/BizTalk/2003/aggschema">
<InputMessagePart_0 xmlns="">
<Root xmlns="http://TestTwoInput.MemberSchema">
<Record xmlns="">
<EmployeeID>12</EmployeeID>
<MemberText>MEMBER</MemberText>
<SPID>007609952</SPID>
<MPID>007609952</MPID>
<SAID>12</SAID>
<ACode>05</ACode>
</Record>
<Record xmlns="">
<EmployeeID>14</EmployeeID>
<MemberText>MEMBER</MemberText>
<SPID>004482352</SPID>
<MPID>004482352</MPID>
<SAID>14</SAID>
<ACode>05</ACode>
</Record>
</Root>
</InputMessagePart_0>
<InputMessagePart_1 xmlns="">
<Root xmlns="http://TestTwoInput.BenefitSchema">
<Record xmlns="">
<EmployeeID>12</EmployeeID>
<BenefitText>BENEFIT</BenefitText>
<BCode>MEA</BCode>
<ELR>001</ELR>
<Control>0100189</Control>
</Record>
<Record xmlns="">
<EmployeeID>12</EmployeeID>
<BenefitText>BENEFIT</BenefitText>
<BCode>DEN</BCode>
<ELR>002</ELR>
<Control>0100189</Control>
</Record>
<Record xmlns="">
<EmployeeID>14</EmployeeID>
<BenefitText>BENEFIT</BenefitText>
<BCode>DEN</BCode>
<ELR>002</ELR>
<Control>0100189</Control>
</Record>
<Record xmlns="">
<EmployeeID>14</EmployeeID>
<BenefitText>BENEFIT</BenefitText>
<BCode>MEA</BCode>
<ELR>001</ELR>
<Control>0100189</Control>
</Record>
<Record xmlns="">
<EmployeeID>14</EmployeeID>
<BenefitText>BENEFIT</BenefitText>
<BCode>MEA</BCode>
<ELR>001</ELR>
<Control>0100189</Control>
</Record>
<Record xmlns="">
<EmployeeID>14</EmployeeID>
<BenefitText>BENEFIT</BenefitText>
<BCode>DEN</BCode>
<ELR>002</ELR>
<Control>0100189</Control>
</Record>
</Root>
</InputMessagePart_1>
</Root>
<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 s1 s0 s2 userCSharp" version="1.0" xmlns:s1="http://TestTwoInput.BenefitSchema" xmlns:ns0="http://TestTwoInput.OutputSchema" xmlns:s0="http://TestTwoInput.MemberSchema" xmlns:s2="http://schemas.microsoft.com/BizTalk/2003/aggschema" xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml" version="1.0" />
<xsl:template match="/">
<xsl:apply-templates select="/s2:Root" />
</xsl:template>
<xsl:template match="/s2:Root">
<ns0:Root>
<xsl:for-each select="InputMessagePart_0/s0:Root/Record">
<Record>
<Member>
<EID>
<xsl:value-of select="EmployeeID/text()" />
</EID>
<Text>
<xsl:value-of select="MemberText/text()" />
</Text>
<SPID>
<xsl:value-of select="SPID/text()" />
</SPID>
<MPID>
<xsl:value-of select="MPID/text()" />
</MPID>
<SIAD>
<xsl:value-of select="SAID/text()" />
</SIAD>
<ACode>
<xsl:value-of select="ACode/text()" />
</ACode>
</Member>
<xsl:variable name="empID" select="EmployeeID" />
<xsl:for-each select="../../../InputMessagePart_1/s1:Root/Record[EmployeeID = $empID]">
<Benefit>
<ID>
<xsl:value-of select="EmployeeID/text()" />
</ID>
<Text>
<xsl:value-of select="BenefitText/text()" />
</Text>
<BCode>
<xsl:value-of select="BCode/text()" />
</BCode>
<ELR>
<xsl:value-of select="ELR/text()" />
</ELR>
<Control>
<xsl:value-of select="Control/text()" />
</Control>
</Benefit>
</xsl:for-each>
</Record>
</xsl:for-each>
</ns0:Root>
</xsl:template>
</xsl:stylesheet>
<ns0:Root xmlns:ns0="http://TestTwoInput.OutputSchema">
<Record>
<Member>
<EID>12</EID>
<Text>MEMBER</Text>
<SPID>007609952</SPID>
<MPID>007609952</MPID>
<SIAD>12</SIAD>
<ACode>05</ACode>
</Member>
<Benefit>
<ID>12</ID>
<Text>BENEFIT</Text>
<BCode>MEA</BCode>
<ELR>001</ELR>
<Control>0100189</Control>
</Benefit>
<Benefit>
<ID>12</ID>
<Text>BENEFIT</Text>
<BCode>DEN</BCode>
<ELR>002</ELR>
<Control>0100189</Control>
</Benefit>
</Record>
<Record>
<Member>
<EID>14</EID>
<Text>MEMBER</Text>
<SPID>004482352</SPID>
<MPID>004482352</MPID>
<SIAD>14</SIAD>
<ACode>05</ACode>
</Member>
<Benefit>
<ID>14</ID>
<Text>BENEFIT</Text>
<BCode>DEN</BCode>
<ELR>002</ELR>
<Control>0100189</Control>
</Benefit>
<Benefit>
<ID>14</ID>
<Text>BENEFIT</Text>
<BCode>MEA</BCode>
<ELR>001</ELR>
<Control>0100189</Control>
</Benefit>
<Benefit>
<ID>14</ID>
<Text>BENEFIT</Text>
<BCode>MEA</BCode>
<ELR>001</ELR>
<Control>0100189</Control>
</Benefit>
<Benefit>
<ID>14</ID>
<Text>BENEFIT</Text>
<BCode>DEN</BCode>
<ELR>002</ELR>
<Control>0100189</Control>
</Benefit>
</Record>
</ns0:Root>