我是XSLT的新手。 我正在为人员获取重复的WaitingPeriodStatus节点,如下面的当前输出示例所示。 我需要将每个人的WaitingPeriodStatus作为预期输出。
INPUT 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 :(得分: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>