Xslt循环遍历不同的节点并在BizTalk映射中组合

时间:2015-09-21 12:00:19

标签: xslt xslt-1.0 biztalk

我想比较单个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中进行这种转换吗?感谢。

1 个答案:

答案 0 :(得分:0)

感谢您的回复。

最初我试图在for-each中使用xpath,因为内部for-each的范围不同,我无法访问变量。但是,使用变量(将整个节点读入变量),我能够实现我想要的。在获得结果的代码下方。

&#13;
&#13;
<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;
&#13;
&#13;

再次感谢。