2017-10-16 84 views
0

我似乎无法根据他们的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> 
+0

我不知道它是一个任务组,似乎很要遵循交叉参照的关键。是否有某种方法可以区分'Party'元素,处理所有的Party [@Type ='担保人'和Person/MaritalStatus/@ Status =('DeFacto','Married')]'就足够了,然后简单地搜索引用其他具有'和'key'('ref',MaritalStatus/RelatedEntityRef)''的Party' –

+0

党元素只能是申请人或担保人。有些合伙人处于一种关系中(DeFacto,已婚)和分担费用(并且属于一个家庭),有些是单身,离婚等费用,这创造了他们自己的家庭。 我已经实现了为一个人创建一个家庭的人员的所有信息,但不适用于多个夫妇(正在为一对夫妇工作) – DanielCSD

回答

1

如果你可以移动到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> 
+0

谢谢。这是工作。我一直在想,解决方案需要成为分组的唯一键,现在我知道这有一个名称(组合键)。 – DanielCSD