我想比较单个xml文件中的两个记录并获取匹配的记录。 (注意:我将无法更改InputSchema)
InputRequest1包含标识符(ID和IDScheme)以及我 想与包含多个产品的InputRequest2进行比较 和相应的标识符(ID和IDScheme)和登录detials(ID 和IDScheme - 登录)。我应该比较InputRequest1和 InputRequest2节点并提取匹配的Product详细信息以形成 输出。输出应包含登录名和ID详细信息 如下例所示。
示例XML:
<ns0:Root xmlns:ns0="http://schemas.microsoft.com/BizTalk/2003/aggschema">
<InputMessagePart_0>
<ns1:InputRequest1 xmlns:ns1="http://myClient/schema/5.0.0/">
<ns1:Identifier>
<ns1:ID>123456</ns1:ID>
<ns1:IDScheme>ABC</ns1:IDScheme>
</ns1:Identifier>
<ns1:Identifier>
<ns1:ID>654321</ns1:ID>
<ns1:IDScheme>CBA</ns1:IDScheme>
</ns1:Identifier>
<ns1:Identifier>
<ns1:ID>2356152</ns1:ID>
<ns1:IDScheme>ZZZ</ns1:IDScheme>
</ns1:Identifier>
</ns1:InputRequest1>
</InputMessagePart_0>
<InputMessagePart_1>
<ns1:InputRequest2 xmlns:ns1="http://myClient/schema/5.0.0/">
<ns1:Products>
<ns1:ProfileContext>
<ns1:LoginID>
<ns1:ID>login123</ns1:ID>
<ns1:IDScheme>USERID</ns1:IDScheme>
</ns1:LoginID>
</ns1:ProfileContext>
<ns1:ProductDetails>
<ns1:ProductIdentifier>
<ns1:ID>123456</ns1:ID>
<ns1:IDScheme>ABC</ns1:IDScheme>
</ns1:ProductIdentifier>
</ns1:ProductDetails>
</ns1:Products>
<ns1:Products>
<ns1:ProfileContext>
<ns1:MemberIdentifier>
<ns1:ID>login789</ns1:ID>
<ns1:IDScheme>USERTID</ns1:IDScheme>
</ns1:MemberIdentifier>
</ns1:ProfileContext>
<ns1:ProductDetails>
<ns1:ProductIdentifier>
<ns1:ID>9876543</ns1:ID>
<ns1:IDScheme>DEF</ns1:IDScheme>
</ns1:ProductIdentifier>
</ns1:ProductDetails>
</ns1:Products>
<ns1:Products>
<ns1:ProfileContext>
<ns1:MemberIdentifier>
<ns1:ID>login456</ns1:ID>
<ns1:IDScheme>USERTID</ns1:IDScheme>
</ns1:MemberIdentifier>
</ns1:ProfileContext>
<ns1:ProductDetails>
<ns1:ProductIdentifier>
<ns1:ID>456789</ns1:ID>
<ns1:IDScheme>CBA</ns1:IDScheme>
</ns1:ProductIdentifier>
</ns1:ProductDetails>
</ns1:Products>
</ns1:InputRequest2>
</InputMessagePart_1>
</ns0:Root>
我希望输出为:
<ns1:OutputRequest xmlns:ns1="http://myClientOutput/schema/5.0.0/">
<ns1:Identifier>
<ns1:ID>login123</ns1:ID>
<ns1:IDScheme>USERID</ns1:IDScheme>
</ns1:Identifier>
<ns1:Identifier>
<ns1:ID>123456</ns1:ID>
<ns1:IDScheme>ABC</ns1:IDScheme>
</ns1:Identifier>
<ns1:Identifier>
<ns1:ID>login456</ns1:ID>
<ns1:IDScheme>USERID</ns1:IDScheme>
</ns1:Identifier>
<ns1:Identifier>
<ns1:ID>654321</ns1:ID>
<ns1:IDScheme>CBA</ns1:IDScheme>
</ns1:Identifier>
</ns1:OutputRequest>
你可以帮助我在xslt中进行这种转换吗?感谢。
答案 0 :(得分:0)
感谢您的回复。
最初我试图在for-each中使用xpath,因为内部for-each的范围不同,我无法访问变量。但是,使用变量(将整个节点读入变量),我能够实现我想要的。在获得结果的代码下方。
<ns0:OutputRequest>
<xsl:variable name="Msg1" select="InputMessagePart_0/ns0:InputRequest1/ns0:Identifier"/>
<xsl:variable name="Msg2" select="InputMessagePart_1/ns0:InputRequest2/ns0:Products"/>
<xsl:for-each select="$Msg1">
<xsl:variable name="RequestID" select="ns0:Identifier/text()" />
<xsl:variable name="RequestIDScheme" select="ns0:IdentifierScheme/text()" />
<xsl:for-each select="$Msg2">
<xsl:variable name="LoginID" select="ns0:ProfileContext/ns0:LoginID/ns0:ID/text()"/>
<xsl:variable name="LoginIDScheme" select="ns0:ProfileContext/ns0:LoginID/ns0:IDScheme/text()"/>
<xsl:variable name="ResponseID" select="ns0:ProductDetails/ns0:ProductIdentifier/ns0:ID/text()" />
<xsl:variable name="ResponseIDScheme" select="ns0:ProductDetails/ns0:ProductIdentifier/ns0:IDScheme/text()" />
<xsl:if test="$RequestID = $ResponseID and $RequestIDScheme = $ResponseIDScheme">
<ns0:Identifier>
<ns0:ID>
<xsl:value-of select="$LoginID" />
</ns0:ID>
<ns0:IDScheme>
<xsl:value-of select="$LoginIDScheme" />
</ns0:IDScheme>
</ns0:Identifier>
<ns0:Identifier>
<ns0:ID>
<xsl:value-of select="$ResponseID" />
</ns0:ID>
<ns0:IDScheme>
<xsl:value-of select="$ResponseIDScheme" />
</ns0:IDScheme>
</ns0:Identifier>
</xsl:if>
</xsl:for-each>
</xsl:if>
</ns0:OutputRequest>
&#13;
再次感谢。