使用XSLT进行XML转换

时间:2017-01-09 22:34:24

标签: xml xslt

我是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>

1 个答案:

答案 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>