2015-09-21 3 views
-1

Я хочу сравнить две записи в одном XML-файле и получить соответствующие записи. (Примечание: я не буду в состоянии изменить InputSchema)Xslt цикл через различные узлы и объединить в BizTalk map

InputRequest1 содержит идентификаторы (ID и IDScheme) и которые я хочу сравнить с InputRequest2, который содержит несколько продуктов и соответствующие идентификаторы (ID и IDScheme) и регистрационные данные (ID и IDScheme - Login). Я должен сравнить InputRequest1 с InputRequest2 узлами и извлечь соответствующие данные о продукте, чтобы сформировать Выход. Выход должен содержать данные для входа и 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

Посмотрите на группировку Muenchian. Есть много сообщений об этом на этом сайте и в других местах в Интернете. Если у вас есть более конкретная проблема, не стесняйтесь редактировать этот пост с более конкретной (и воспроизводимой) задачей. –

+1

Добро пожаловать в переполнение стека! Пожалуйста, покажите, что вы пробовали. В рамках [тематических вопросов для StackOverflow] (http://stackoverflow.com/help/on-topic) вы должны задать вопрос о конкретной проблеме_, показывая, что вы сделали, и где вы застряли, в противоположность просто попросить других сделать работу за вас. См. Также [ask] и [mcve]. – Abel

ответ

0

Спасибо за ответы.

Первоначально я пытался использовать 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>

Еще раз спасибо.

Смежные вопросы