2017-01-09 126 views
2

我是XSLT新手。 我正在爲人員獲取重複的WaitingPeriodStatus節點,如下面的當前輸出示例所示。 我需要得到每個人的WaitingPeriodStatus,如預期的輸出。使用XSLT進行XML轉換

輸入XML:

<ns0:Root xmlns:ns0="http://schemas.microsoft.com/BizTalk/2003/aggschema"> 
    <InputMessagePart_0> 
     <ns0:GetWebActiveWaitingPeriodsResponse xmlns:ns0="http://schemas.company.com.au/es/product/getwebactivewaitingperiods/2015/05"> 
      <WaitingPeriodIDs> 
       <WaitingPeriodID>0M</WaitingPeriodID> 
       <WaitingPeriodID>Hear</WaitingPeriodID> 
       <WaitingPeriodID>Laser</WaitingPeriodID> 
      </WaitingPeriodIDs> 
     </ns0:GetWebActiveWaitingPeriodsResponse> 
    </InputMessagePart_0> 
    <InputMessagePart_1> 
     <ns1:GetMembershipWaitingPeriodStatusesResponse 
         xmlns:ns1="http://schemas.company.com/cp/membership/getmembershipwaitingperiodstatuses/2014/06" 
         xmlns:ns0="http://schemas.company.com/cp/membership/waitingperiodstatuses/2014/06> 
      <ns0:MembershipPersons> 
       <ns0:MembershipPerson> 
          <ns0:PersonId>133279</ns0:PersonId> 
          <ns0:TitleCode>Ms  </ns0:TitleCode> 
          <ns0:GivenName>Elizabeth</ns0:GivenName> 
          <ns0:MiddleName>Clare Kurth</ns0:MiddleName> 
          <ns0:SurName>Smith</ns0:SurName> 
          <ns0:WaitingPeriodStatuses> 
         <wp:WaitingPeriodStatuses xmlns:wp="http://schemas.company.com/cp/membership/waitingperiodstatuses/2014/06"> 
          <wp:WaitingPeriodStatus> 
           <wp:MemberId>262016</wp:MemberId> 
           <wp:PersonId>133279</wp:PersonId> 
           <wp:EffDate>2015-05-18T00:00:00</wp:EffDate> 
           <wp:WaitingPeriodCode>Hear</wp:WaitingPeriodCode> 
           <wp:Status>Waiting</wp:Status> 
           <wp:StartDate>2017-01-05</wp:StartDate> 
           <wp:EndDate>2019-01-05</wp:EndDate> 
           <wp:WaitingPeriodDescription>Hearing Aids</wp:WaitingPeriodDescription> 
           <wp:WaitingPeriodWaiveDescription/> 
           <wp:WaitingPeriod>24</wp:WaitingPeriod> 
           <wp:WaitingPeriodUnit>Months</wp:WaitingPeriodUnit> 
          </wp:WaitingPeriodStatus> 
         </wp:WaitingPeriodStatuses> 
        </ns0:WaitingPeriodStatuses> 
       </ns0:MembershipPerson> 
       <ns0:MembershipPerson> 
        <ns0:PersonId>134259</ns0:PersonId> 
        <ns0:GivenName>Majed</ns0:GivenName> 
        <ns0:MiddleName>John</ns0:MiddleName> 
        <ns0:SurName>Song</ns0:SurName> 
        <ns0:WaitingPeriodStatuses> 
         <wp:WaitingPeriodStatuses xmlns:wp="http://schemas.company.com/cp/membership/waitingperiodstatuses/2014/06"> 
          <wp:WaitingPeriodStatus> 
           <wp:MemberId>262016</wp:MemberId> 
           <wp:PersonId>134259</wp:PersonId> 
           <wp:EffDate>2017-01-05T00:00:00</wp:EffDate> 
           <wp:WaitingPeriodCode>Laser</wp:WaitingPeriodCode> 
           <wp:Status>WaitingTerminated</wp:Status> 
           <wp:StartDate>2017-01-05</wp:StartDate> 
           <wp:EndDate>2019-01-05</wp:EndDate> 
           <wp:WaitingPeriodDescription>Laser Eye Surgery</wp:WaitingPeriodDescription> 
           <wp:WaitingPeriodWaiveDescription/> 
           <wp:WaitingPeriod>24</wp:WaitingPeriod> 
           <wp:WaitingPeriodUnit>Months</wp:WaitingPeriodUnit> 
          </wp:WaitingPeriodStatus> 
         </wp:WaitingPeriodStatuses> 
        </ns0:WaitingPeriodStatuses> 
       </ns0:MembershipPerson> 
      </ns0:MembershipPersons> 
     </ns1:GetMembershipWaitingPeriodStatusesResponse> 
    </InputMessagePart_1> 
</ns0:Root> 

電流輸出:

<ns1:GetMembershipWaitingPeriodStatusesResponse xmlns:ns1="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/2015/05" xmlns:ns0="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/membershipperson/2015/05"> 
    <MembershipPersons> 
     <MembershipPerson> 
      <ns0:PersonId>133279</ns0:PersonId> 
      <ns0:TitleCode>Ms  </ns0:TitleCode> 
      <ns0:GivenName>Elizabeth</ns0:GivenName> 
      <ns0:MiddleName>Clare Kurth</ns0:MiddleName> 
      <ns0:Surname>Smith</ns0:Surname> 
      <mp:WaitingPeriodStatuses xmlns:mp="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/membershipperson/2015/05"> 
       <mp:WaitingPeriodStatus> 
        <mp:WaitingPeriodCode>Hear</mp:WaitingPeriodCode> 
        <mp:WaitingPeriod>24</mp:WaitingPeriod> 
        <mp:WaitingPeriodUnit>Months</mp:WaitingPeriodUnit> 
        <mp:WaitingPeriodDescription>Hearing Aids</mp:WaitingPeriodDescription> 
        <mp:WaitingPeriodStatus>Waiting</mp:WaitingPeriodStatus> 
        <mp:StartDate>2017-01-05</mp:StartDate> 
        <mp:EndDate>2019-01-05</mp:EndDate> 
       </mp:WaitingPeriodStatus> 
       <mp:WaitingPeriodStatus> 
        <mp:WaitingPeriodCode>Laser</mp:WaitingPeriodCode> 
        <mp:WaitingPeriod>24</mp:WaitingPeriod> 
        <mp:WaitingPeriodUnit>Months</mp:WaitingPeriodUnit> 
        <mp:WaitingPeriodDescription>Laser Eye Surgery</mp:WaitingPeriodDescription> 
        <mp:WaitingPeriodStatus>WaitingTerminated</mp:WaitingPeriodStatus> 
        <mp:StartDate>2017-01-05</mp:StartDate> 
        <mp:EndDate>2019-01-05</mp:EndDate> 
       </mp:WaitingPeriodStatus> 
      </mp:WaitingPeriodStatuses> 
     </MembershipPerson> 
     <MembershipPerson> 
      <ns0:PersonId>134259</ns0:PersonId> 
      <ns0:GivenName>Majed</ns0:GivenName> 
      <ns0:MiddleName>John</ns0:MiddleName> 
      <ns0:Surname>Song</ns0:Surname> 
      <mp:WaitingPeriodStatuses xmlns:mp="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/membershipperson/2015/05"> 
       <mp:WaitingPeriodStatus> 
        <mp:WaitingPeriodCode>Hear</mp:WaitingPeriodCode> 
        <mp:WaitingPeriod>24</mp:WaitingPeriod> 
        <mp:WaitingPeriodUnit>Months</mp:WaitingPeriodUnit> 
        <mp:WaitingPeriodDescription>Hearing Aids</mp:WaitingPeriodDescription> 
        <mp:WaitingPeriodStatus>Waiting</mp:WaitingPeriodStatus> 
        <mp:StartDate>2017-01-05</mp:StartDate> 
        <mp:EndDate>2019-01-05</mp:EndDate> 
       </mp:WaitingPeriodStatus> 
       <mp:WaitingPeriodStatus> 
        <mp:WaitingPeriodCode>Laser</mp:WaitingPeriodCode> 
        <mp:WaitingPeriod>24</mp:WaitingPeriod> 
        <mp:WaitingPeriodUnit>Months</mp:WaitingPeriodUnit> 
        <mp:WaitingPeriodDescription>Laser Eye Surgery</mp:WaitingPeriodDescription> 
        <mp:WaitingPeriodStatus>WaitingTerminated</mp:WaitingPeriodStatus> 
        <mp:StartDate>2017-01-05</mp:StartDate> 
        <mp:EndDate>2019-01-05</mp:EndDate> 
       </mp:WaitingPeriodStatus> 
      </mp:WaitingPeriodStatuses> 
     </MembershipPerson> 
    </MembershipPersons> 
</ns1:GetMembershipWaitingPeriodStatusesResponse> 

預期輸出:

<ns1:GetMembershipWaitingPeriodStatusesResponse xmlns:ns1="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/2015/05" xmlns:ns0="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/membershipperson/2015/05"> 
    <MembershipPersons> 
     <MembershipPerson> 
      <ns0:PersonId>133279</ns0:PersonId> 
      <ns0:TitleCode>Ms  </ns0:TitleCode> 
      <ns0:GivenName>Elizabeth</ns0:GivenName> 
      <ns0:MiddleName>Clare Kurth</ns0:MiddleName> 
      <ns0:Surname>Smith</ns0:Surname> 
      <mp:WaitingPeriodStatuses xmlns:mp="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/membershipperson/2015/05"> 
       <mp:WaitingPeriodStatus> 
        <mp:WaitingPeriodCode>Hear</mp:WaitingPeriodCode> 
        <mp:WaitingPeriod>24</mp:WaitingPeriod> 
        <mp:WaitingPeriodUnit>Months</mp:WaitingPeriodUnit> 
        <mp:WaitingPeriodDescription>Hearing Aids</mp:WaitingPeriodDescription> 
        <mp:WaitingPeriodStatus>Waiting</mp:WaitingPeriodStatus> 
        <mp:StartDate>2017-01-05</mp:StartDate> 
        <mp:EndDate>2019-01-05</mp:EndDate> 
       </mp:WaitingPeriodStatus> 
      </mp:WaitingPeriodStatuses> 
     </MembershipPerson> 
     <MembershipPerson> 
      <ns0:PersonId>134259</ns0:PersonId> 
      <ns0:GivenName>Majed</ns0:GivenName> 
      <ns0:MiddleName>John</ns0:MiddleName> 
      <ns0:Surname>Song</ns0:Surname> 
      <mp:WaitingPeriodStatuses xmlns:mp="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/membershipperson/2015/05"> 
       <mp:WaitingPeriodStatus> 
        <mp:WaitingPeriodCode>Laser</mp:WaitingPeriodCode> 
        <mp:WaitingPeriod>24</mp:WaitingPeriod> 
        <mp:WaitingPeriodUnit>Months</mp:WaitingPeriodUnit> 
        <mp:WaitingPeriodDescription>Laser Eye Surgery</mp:WaitingPeriodDescription> 
        <mp:WaitingPeriodStatus>WaitingTerminated</mp:WaitingPeriodStatus> 
        <mp:StartDate>2017-01-05</mp:StartDate> 
        <mp:EndDate>2019-01-05</mp:EndDate> 
       </mp:WaitingPeriodStatus> 
      </mp:WaitingPeriodStatuses> 
     </MembershipPerson> 
    </MembershipPersons> 
</ns1:GetMembershipWaitingPeriodStatusesResponse> 

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 s0 s3 s4 s1 s2 s5" version="1.0" xmlns:s0="http://schemas.company.com/es/product/getwebactivewaitingperiods/2015/05" xmlns:ns0="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/membershipperson/2015/05" xmlns:s4="http://schemas.company.com/cp/membership/waitingperiodunit/2014/06" xmlns:s1="http://schemas.company.com/cp/membership/getmembershipwaitingperiodstatuses/2014/06" xmlns:s2="http://schemas.microsoft.com/BizTalk/2003/aggschema" xmlns:s3="http://schemas.company.com/cp/membership/waitingperiodstatuses/2014/06" xmlns:s5="http://schemas.company.com/cp/membership/waitingperiodstatuscode/2014/06" xmlns:ns1="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/2015/05"> 
    <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"> 
     <ns1:GetMembershipWaitingPeriodStatusesResponse> 
      <MembershipPersons> 
       <xsl:for-each select="InputMessagePart_1/s1:GetMembershipWaitingPeriodStatusesResponse/s3:MembershipPersons/s3:MembershipPerson"> 
        <MembershipPerson> 
         <ns0:PersonId> 
          <xsl:value-of select="s3:PersonId/text()" /> 
         </ns0:PersonId> 
         <xsl:if test="s3:TitleCode"> 
          <ns0:TitleCode> 
           <xsl:value-of select="s3:TitleCode/text()" /> 
          </ns0:TitleCode> 
         </xsl:if> 
         <ns0:GivenName> 
          <xsl:value-of select="s3:GivenName/text()" /> 
         </ns0:GivenName> 
         <xsl:if test="s3:MiddleName"> 
          <ns0:MiddleName> 
           <xsl:value-of select="s3:MiddleName/text()" /> 
          </ns0:MiddleName> 
         </xsl:if> 
         <ns0:Surname> 
          <xsl:value-of select="s3:SurName/text()" /> 
         </ns0:Surname> 
         <xsl:call-template name="CopyWaitingPeriodStatuses" /> 
        </MembershipPerson> 
       </xsl:for-each> 
      </MembershipPersons> 
     </ns1:GetMembershipWaitingPeriodStatusesResponse> 
    </xsl:template> 
    <xsl:template name="CopyWaitingPeriodStatuses" xmlns:mp="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/membershipperson/2015/05"> 
     <xsl:element name="mp:WaitingPeriodStatuses"> 
      <xsl:for-each select="../../../../InputMessagePart_0/*/*/*"> 
       <xsl:variable name="waitingPeriodCode" select="node()"/> 
       <xsl:for-each select="../../../../InputMessagePart_1/*/*/*/*/*/*"> 
        <xsl:if test="node()[local-name()='WaitingPeriodCode'] = $waitingPeriodCode and node()[local-name() = 'PersonId'] = node()[local-name()='PersonId']"> 
         <xsl:element name="mp:WaitingPeriodStatus"> 
          <xsl:if test="node()[local-name() = 'WaitingPeriodCode']"> 
           <xsl:element name="mp:WaitingPeriodCode"> 
            <xsl:value-of select="node()[local-name()='WaitingPeriodCode']" /> 
           </xsl:element> 
          </xsl:if> 
          <xsl:if test="node()[local-name() = 'WaitingPeriod']"> 
           <xsl:element name="mp:WaitingPeriod"> 
            <xsl:value-of select="node()[local-name()='WaitingPeriod']" /> 
           </xsl:element> 
          </xsl:if> 
          <xsl:if test="node()[local-name() = 'WaitingPeriodUnit']"> 
           <xsl:element name="mp:WaitingPeriodUnit"> 
            <xsl:value-of select="node()[local-name()='WaitingPeriodUnit']" /> 
           </xsl:element> 
          </xsl:if> 
          <xsl:if test="node()[local-name() = 'WaitingPeriodDescription']"> 
           <xsl:element name="mp:WaitingPeriodDescription"> 
            <xsl:value-of select="node()[local-name()='WaitingPeriodDescription']" /> 
           </xsl:element> 
          </xsl:if> 
          <xsl:if test="node()[local-name() = 'Status']"> 
           <xsl:element name="mp:WaitingPeriodStatus"> 
            <xsl:value-of select="node()[local-name()='Status']" /> 
           </xsl:element> 
          </xsl:if> 
          <xsl:if test="node()[local-name() = 'StartDate']"> 
           <xsl:element name="mp:StartDate"> 
            <xsl:value-of select="node()[local-name()='StartDate']" /> 
           </xsl:element> 
          </xsl:if> 
          <xsl:if test="node()[local-name() = 'EndDate']"> 
           <xsl:element name="mp:EndDate"> 
            <xsl:value-of select="node()[local-name()='EndDate']" /> 
           </xsl:element> 
          </xsl:if> 
          <xsl:if test="node()[local-name() = 'WaitingPeriodWaiveDescription']"> 
           <xsl:if test="(normalize-space(node()[local-name() = 'WaitingPeriodWaiveDescription']) != '' and normalize-space(node()[local-name() = 'Status']) != 'ServedNewborn')"> 
            <xsl:element name="mp:WaitingPeriodWaiveDescription"> 
             <xsl:value-of select="node()[local-name() = 'WaitingPeriodWaiveDescription']/text()" /> 
            </xsl:element> 
           </xsl:if> 
          </xsl:if> 
         </xsl:element> 
        </xsl:if> 
       </xsl:for-each> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
+0

加一。如果只有每個人都包括輸入,代碼,預期輸出和實際輸出,就像你所做的一樣。 – LarsH

+0

@PavanMuppidi:由於'ns1:GetMembershipWaitingPeriodStatusesResponse'中的命名空間聲明導致輸入xml格式錯誤,其中關閉的「 - 字符丟失。我無法編輯,也許您可​​以更正此問題。 –

回答

1

錯誤在於命名模板CopyWaitingPeriodStatuses,這需要一個MembershipPerson作爲上下文節點,然後遍歷每個input_0 periodCode並試圖找回了各自的人。在您的版本中,您比較了repsective periodCode,但檢查node()[local-name() = 'PersonId'] = node()[local-name()='PersonId']總是產生true,這樣您可以提取所有人的PeriodStatuses。見命名模板CopyWaitingPeriodStatuses以下改編片段,其還引入了可變$personId,後來在檢查使用此值,則:

<xsl:template name="CopyWaitingPeriodStatuses" xmlns:mp="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/membershipperson/2015/05"> 
    <xsl:variable name="personId" select="s3:PersonId/text()"/> 
    <xsl:element name="mp:WaitingPeriodStatuses"> 
     <xsl:for-each select="../../../../InputMessagePart_0/*/*/*"> 
      <xsl:variable name="waitingPeriodCode" select="node()"/> 
      <xsl:for-each select="../../../../InputMessagePart_1/*/*/*/*/*/*"> 
       <xsl:if test="node()[local-name()='WaitingPeriodCode'] = $waitingPeriodCode and node()[local-name() = 'PersonId'] = $personId"> 
        <xsl:element name="mp:WaitingPeriodStatus"> 

然後返回以下結果:

<ns1:GetMembershipWaitingPeriodStatusesResponse xmlns:ns1="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/2015/05" xmlns:ns0="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/membershipperson/2015/05"> 
    <MembershipPersons> 
     <MembershipPerson> 
      <ns0:PersonId>133279</ns0:PersonId> 
      <ns0:TitleCode>Ms  </ns0:TitleCode> 
      <ns0:GivenName>Elizabeth</ns0:GivenName> 
      <ns0:MiddleName>Clare Kurth</ns0:MiddleName> 
      <ns0:Surname>Smith</ns0:Surname> 
      <mp:WaitingPeriodStatuses xmlns:mp="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/membershipperson/2015/05"> 
       <mp:WaitingPeriodStatus> 
        <mp:WaitingPeriodCode>Hear</mp:WaitingPeriodCode> 
        <mp:WaitingPeriod>24</mp:WaitingPeriod> 
        <mp:WaitingPeriodUnit>Months</mp:WaitingPeriodUnit> 
        <mp:WaitingPeriodDescription>Hearing Aids</mp:WaitingPeriodDescription> 
        <mp:WaitingPeriodStatus>Waiting</mp:WaitingPeriodStatus> 
        <mp:StartDate>2017-01-05</mp:StartDate> 
        <mp:EndDate>2019-01-05</mp:EndDate> 
       </mp:WaitingPeriodStatus> 
      </mp:WaitingPeriodStatuses> 
     </MembershipPerson> 
     <MembershipPerson> 
      <ns0:PersonId>134259</ns0:PersonId> 
      <ns0:GivenName>Majed</ns0:GivenName> 
      <ns0:MiddleName>John</ns0:MiddleName> 
      <ns0:Surname>Song</ns0:Surname> 
      <mp:WaitingPeriodStatuses xmlns:mp="http://schemas.company.com/bp/membership/getmembershipwaitingperiodstatuses/membershipperson/2015/05"> 
       <mp:WaitingPeriodStatus> 
        <mp:WaitingPeriodCode>Laser</mp:WaitingPeriodCode> 
        <mp:WaitingPeriod>24</mp:WaitingPeriod> 
        <mp:WaitingPeriodUnit>Months</mp:WaitingPeriodUnit> 
        <mp:WaitingPeriodDescription>Laser Eye Surgery</mp:WaitingPeriodDescription> 
        <mp:WaitingPeriodStatus>WaitingTerminated</mp:WaitingPeriodStatus> 
        <mp:StartDate>2017-01-05</mp:StartDate> 
        <mp:EndDate>2019-01-05</mp:EndDate> 
       </mp:WaitingPeriodStatus> 
      </mp:WaitingPeriodStatuses> 
     </MembershipPerson> 
    </MembershipPersons> 
</ns1:GetMembershipWaitingPeriodStatusesResponse>