XSLT 2,按属性和元素分组多个
我似乎无法根据他们的MaritalStatus来管理分组情侣。
我已经设法将所有处于关系中的人('DeFacto','已婚')分组,但无法弄清楚如何将他们分组到不同的家庭。XSLT 2,按属性和元素分组多个
基本上,如果两个人做一对夫妇,他们将创建一个家庭。家庭名称将属于家庭中的第一人称姓氏,NumberOfAdults将被硬编码为'2',NumberOfDependants将被计算在内。
这对夫妻是基于链接的Party.Identifier和Party.MaritalStatus.RelatedEntityRef
我有什么(简体):
<PartySegment>
<Party Type="Guarantor" PrimaryApplicant="No">
<Identifier>b8b0f908b08e</Identifier>
<Person Sex="Female" FirstHomeBuyer="No" CustomerOfLender="No">
<PersonName>
<NameTitle Value="Lady"/>
<FirstName>Clemansa</FirstName>
<Surname>Sanchez</Surname>
</PersonName>
<MaritalStatus Status="DeFacto">
<RelatedEntityRef>ea384b0bf3f5</RelatedEntityRef>
</MaritalStatus>
<NumberOfDependents>1</NumberOfDependents>
</Person>
</Party>
<Party Type="Applicant" PrimaryApplicant="Yes" ExistingCustomerID="1231">
<Identifier>bd8c65a3ad80</Identifier>
<Person Sex="Female" FirstHomeBuyer="Yes" CustomerOfLender="Yes">
<PersonName>
<NameTitle Value="Mrs"/>
<FirstName>Cheryl</FirstName>
<Surname>Bonkers</Surname>
</PersonName>
<MaritalStatus Status="Married">
<RelatedEntityRef>ee84dc9e38ec</RelatedEntityRef>
</MaritalStatus>
<NumberOfDependents>2</NumberOfDependents>
</Person>
</Party>
<Party Type="Guarantor" PrimaryApplicant="No">
<Identifier>ea384b0bf3f5</Identifier>
<Person Sex="Male" FirstHomeBuyer="No" CustomerOfLender="No">
<PersonName>
<NameTitle Value="Mr"/>
<FirstName>Greg</FirstName>
<OtherName>Morty</OtherName>
<Surname>Sanchez</Surname>
</PersonName>
<MaritalStatus Status="DeFacto">
<RelatedEntityRef>b8b0f908b08e</RelatedEntityRef>
</MaritalStatus>
<NumberOfDependents>0</NumberOfDependents>
</Person>
</Party>
<Party Type="Applicant" PrimaryApplicant="No">
<Identifier>ee84dc9e38ec</Identifier>
<Person Sex="Male" FirstHomeBuyer="No" CustomerOfLender="No">
<PersonName>
<NameTitle Value="Mr"/>
<FirstName>Mark</FirstName>
<Surname>Bonkers</Surname>
</PersonName>
<MaritalStatus Status="Married">
<RelatedEntityRef>bd8c65a3ad80</RelatedEntityRef>
</MaritalStatus>
<NumberOfDependents>0</NumberOfDependents>
</Person>
</Party>
</PartySegment>
的愿望输出:
<Household UniqueID="b8b0f908b08e-Household"
Name="Sanchez Household"
NumberOfAdults="2"
NumberOfDependants="1"/>
<Household UniqueID="bd8c65a3ad80-Household"
Name="Bonkers Household"
NumberOfAdults="2"
NumberOfDependants="2"/>
我到目前为止(简化):这是一对夫妇工作,因为没有考虑到MaritalStatus.RelatedEntityRef信息
<xsl:template match="PartySegment" mode="Household_Couple">
<xsl:for-each-group select="Party[Person/MaritalStatus/@Status = ('DeFacto', 'Married')]" group-by="Person/MaritalStatus/@Status = ('DeFacto', 'Married')">
<xsl:variable name="owner_id" select="Identifier"/>
<Household UniqueID="{concat(Identifier, '-Household')}"
Name="{normalize-space(concat(Person/PersonName/Surname, ' Household'))}"
NumberOfAdults="{'2'}"
NumberOfDependants="{if(Person/Dependent) then count(current-group()/Person/Dependent) else if(Person/NumberOfDependents) then sum(current-group()/Person/NumberOfDependents) else '0'}">
<xsl:apply-templates select="current-group()/Person/Dependent"/>
</Household>
</xsl:for-each-group>
</xsl:template>
如果你可以移动到XSLT 3.0那么我认为一个合成分组排序的两个相关标识的关键sort((Identifier, key('ref', Person/MaritalStatus/RelatedEntityRef)/Identifier))
可以解决这个问题:
<xsl:key name="ref" match="Party" use="Identifier"/>
<xsl:template match="PartySegment">
<xsl:for-each-group select="Party[Person/MaritalStatus/@Status = ('DeFacto', 'Married')]"
composite="yes"
group-by="sort((Identifier, key('ref', Person/MaritalStatus/RelatedEntityRef)/Identifier))">
<Household UniqueID="{concat(Identifier, '-Household')}"
Name="{normalize-space(concat(Person/PersonName/Surname, ' Household'))}"
NumberOfAdults="{'2'}"
NumberOfDependants="{if(Person/Dependent) then count(current-group()/Person/Dependent) else if(Person/NumberOfDependents) then sum(current-group()/Person/NumberOfDependents) else '0'}">
</Household>
</xsl:for-each-group>
</xsl:template>
我得到
<Household UniqueID="b8b0f908b08e-Household"
Name="Sanchez Household"
NumberOfAdults="2"
NumberOfDependants="1"/>
<Household UniqueID="bd8c65a3ad80-Household"
Name="Bonkers Household"
NumberOfAdults="2"
NumberOfDependants="2"/>
这SaXon 9.8 EE在oXygen内部。
对于撒克逊9.8 HE应该可以重写,作为
<xsl:key name="ref" match="Party" use="Identifier"/>
<xsl:template match="PartySegment">
<xsl:for-each-group select="Party[Person/MaritalStatus/@Status = ('DeFacto', 'Married')]"
composite="yes"
group-by="Identifier | key('ref', Person/MaritalStatus/RelatedEntityRef)/Identifier">
<Household UniqueID="{concat(Identifier, '-Household')}"
Name="{normalize-space(concat(Person/PersonName/Surname, ' Household'))}"
NumberOfAdults="{'2'}"
NumberOfDependants="{if(Person/Dependent) then count(current-group()/Person/Dependent) else if(Person/NumberOfDependents) then sum(current-group()/Person/NumberOfDependents) else '0'}">
</Household>
</xsl:for-each-group>
</xsl:template>
对于XSLT 2.0,我们没有,我们需要确保构建一个键与这两个组件组合键:
<xsl:template match="PartySegment">
<xsl:for-each-group select="Party[Person/MaritalStatus/@Status = ('DeFacto', 'Married')]"
group-by="string-join((Identifier | key('ref', Person/MaritalStatus/RelatedEntityRef)/Identifier), '|')">
<Household UniqueID="{concat(Identifier, '-Household')}"
Name="{normalize-space(concat(Person/PersonName/Surname, ' Household'))}"
NumberOfAdults="{'2'}"
NumberOfDependants="{if(Person/Dependent) then count(current-group()/Person/Dependent) else if(Person/NumberOfDependents) then sum(current-group()/Person/NumberOfDependents) else '0'}">
</Household>
</xsl:for-each-group>
</xsl:template>
谢谢。这是工作。我一直在想,解决方案需要成为分组的唯一键,现在我知道这有一个名称(组合键)。 – DanielCSD
我不知道它是一个任务组,似乎很要遵循交叉参照的关键。是否有某种方法可以区分'Party'元素,处理所有的Party [@Type ='担保人'和Person/MaritalStatus/@ Status =('DeFacto','Married')]'就足够了,然后简单地搜索引用其他具有'和'key'('ref',MaritalStatus/RelatedEntityRef)''的Party' –
党元素只能是申请人或担保人。有些合伙人处于一种关系中(DeFacto,已婚)和分担费用(并且属于一个家庭),有些是单身,离婚等费用,这创造了他们自己的家庭。 我已经实现了为一个人创建一个家庭的人员的所有信息,但不适用于多个夫妇(正在为一对夫妇工作) – DanielCSD