2017-10-16 23 views
0

Je n'arrive pas à gérer les couples de regroupement en fonction de leur statut marital.
J'ai réussi à regrouper toutes les personnes qui sont dans une relation ('DeFacto', 'Marié') mais je n'arrive pas à trouver comment les regrouper dans différents ménages.XSLT 2, Mutiple regroupant par attributs et éléments

Fondamentalement, si deux personnes forment un couple, elles créeront un ménage. Le nom du ménage appartiendra au nom de famille de la première personne dans le ménage, le nombre de personnes adultes sera codé en dur à «2» et le nombre de membres supplémentaires sera additionné.

Le couple est lié basé sur le Party.Identifier et la Party.MaritalStatus.RelatedEntityRef

Ce que je (simplifié):

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

La sortie du désir:

<Household UniqueID="b8b0f908b08e-Household" 
       Name="Sanchez Household" 
       NumberOfAdults="2" 
       NumberOfDependants="1"/> 

<Household UniqueID="bd8c65a3ad80-Household" 
       Name="Bonkers Household" 
       NumberOfAdults="2" 
       NumberOfDependants="2"/> 

Ce que j'ai jusqu'ici (simplifié): Cela fonctionne pour un couple parce que ne prend pas en considération les informations 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

Je ne suis pas sûr qu'il est une tâche de regroupement, semble plutôt que vous voulez suivre la référence croisée avec une clé. Existe-t-il un moyen de distinguer les éléments 'Party'? Serait-il suffisant de traiter tous les éléments' Party [@Type = 'Garantor' et Person/MaritalStatus/@ Status = ('DeFacto', 'Married')] ' référencé autre 'Party' avec un' 'et' key ('ref', MaritalStatus/RelatedEntityRef) '? –

+0

Les éléments du Parti ne peuvent être que des demandeurs ou des garants. Certains sont en couple (DeFacto, Marié) et partagent des dépenses (et appartiennent à un même foyer) et certains sont célibataires, divorcés, etc. avec leurs dépenses et cela crée leur propre ménage. J'ai mis en place toutes les informations pour une personne qui crée un ménage pour une personne mais pas pour plusieurs couples (travaille pour un couple) – DanielCSD

Répondre

1

Si vous pouvez passer à XSLT 3.0 alors je pense un groupement composite sort((Identifier, key('ref', Person/MaritalStatus/RelatedEntityRef)/Identifier)) clé du tri des deux identifiants associés peut résoudre ceci:

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

Je reçois

<Household UniqueID="b8b0f908b08e-Household" 
      Name="Sanchez Household" 
      NumberOfAdults="2" 
      NumberOfDependants="1"/> 
<Household UniqueID="bd8c65a3ad80-Household" 
      Name="Bonkers Household" 
      NumberOfAdults="2" 
      NumberOfDependants="2"/> 

cette façon avec Saxon 9.8 EE à l'intérieur d'oXygen.

Pour Saxon 9.8 HE, il devrait être possible de réécrire que

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

Pour XSLT 2.0 où nous n'avons pas les clés composites nous devons nous assurer de construire une seule clé avec les deux composants:

<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

Merci. Ça fonctionne. Je pensais que la solution devait être une clé unique pour le groupement et maintenant je sais que cela a un nom (clé composite). – DanielCSD