2017-08-03 6 views
0

Je le ci-dessous xml:Mettre à jour le compteur de +1 quand un autre enregistrement avec deux valeurs similaires existent dans xslt 2.0

<EmployeeLeaveDataUpsertRequest> 
<Row> 
    <Emp_id>11</Emp_id> 
    <Pay_slip_no>1</Pay_slip_no> 
    <Pay_comp>AU_0299</Pay_comp> 
    <Hours>136</Hours> 
    <Date_from_ec>20170401</Date_from_ec> 
    <Date_to_ec>20170429</Date_to_ec> 
    <Date_ped> </Date_ped> 
    <No_of_period>1</No_of_period> 
    <Ma_ind>M</Ma_ind> 
    <Fa_ind>N</Fa_ind> 
    <Counter>1</Counter> 
</Row> 
<Row> 
    <Emp_id>12</Emp_id> 
    <Pay_slip_no>1</Pay_slip_no> 
    <Pay_comp>AU_0900</Pay_comp> 
    <Hours>40</Hours> 
    <Date_from_ec>20170206</Date_from_ec> 
    <Date_to_ec>20170210</Date_to_ec> 
    <Date_ped> </Date_ped> 
    <No_of_period>1</No_of_period> 
    <Ma_ind>M</Ma_ind> 
    <Fa_ind>N</Fa_ind> 
    <Counter>1</Counter> 
</Row> 
<Row> 
    <Emp_id>11</Emp_id> 
    <Pay_slip_no>1</Pay_slip_no> 
    <Pay_comp>AU_0299</Pay_comp> 
    <Hours>8</Hours> 
    <Date_from_ec>20170111</Date_from_ec> 
    <Date_to_ec>20170115</Date_to_ec> 
    <Date_ped> </Date_ped> 
    <No_of_period>1</No_of_period> 
    <Ma_ind>M</Ma_ind> 
    <Fa_ind>N</Fa_ind> 
    <Counter>1</Counter> 
</Row> 

dans le fichier XML ci-dessus, vous pouvez voir que chaque enregistrement a un élément compteur avec la valeur par défaut définie sur 1.

Dans un événement pour le même Emp_id et Pay_comp, j'ai besoin de définir le compteur comme 1 pour le premier enregistrement, 2 pour le deuxième enregistrement et ainsi de suite.

Comme dans le xml ci-dessus, vous pouvez voir deux enregistrements où le emp_id est 11 et Pay_comp est AU_0299 - donc pour le premier remettre le compteur en 1 et pour la suivante un 2.

sortie xml:

<EmployeeLeaveDataUpsertRequest> 
<Row> 
    <Emp_id>11</Emp_id> 
    <Pay_slip_no>1</Pay_slip_no> 
    <Pay_comp>AU_0299</Pay_comp> 
    <Hours>136</Hours> 
    <Date_from_ec>20170401</Date_from_ec> 
    <Date_to_ec>20170429</Date_to_ec> 
    <Date_ped> </Date_ped> 
    <No_of_period>1</No_of_period> 
    <Ma_ind>M</Ma_ind> 
    <Fa_ind>N</Fa_ind> 
    <Counter>1</Counter> 
</Row> 
<Row> 
    <Emp_id>11</Emp_id> 
    <Pay_slip_no>1</Pay_slip_no> 
    <Pay_comp>AU_0299</Pay_comp> 
    <Hours>8</Hours> 
    <Date_from_ec>20170111</Date_from_ec> 
    <Date_to_ec>20170115</Date_to_ec> 
    <Date_ped> </Date_ped> 
    <No_of_period>1</No_of_period> 
    <Ma_ind>M</Ma_ind> 
    <Fa_ind>N</Fa_ind> 
    <Counter>2</Counter> 
</Row> 
<Row> 
    <Emp_id>12</Emp_id> 
    <Pay_slip_no>1</Pay_slip_no> 
    <Pay_comp>AU_0900</Pay_comp> 
    <Hours>40</Hours> 
    <Date_from_ec>20170206</Date_from_ec> 
    <Date_to_ec>20170210</Date_to_ec> 
    <Date_ped> </Date_ped> 
    <No_of_period>1</No_of_period> 
    <Ma_ind>M</Ma_ind> 
    <Fa_ind>N</Fa_ind> 
    <Counter>1</Counter> 
</Row> 

J'ai essayé pour la boucle mais ne pouvait pas réussir. Besoin de vos entrées sur le code XSLT qui pourrait y parvenir

Répondre

1

Vous pouvez utiliser une clé pour identifier les doublons, avec XSLT 3.0 (maintenant pris en charge par Saxon 9.8 ou les versions actuelles de Altova XMLSpy et Raptor) il est aussi facile que:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    expand-text="yes" 
    version="3.0"> 

    <xsl:key name="group" match="Row" use="Emp_id , Pay_comp" composite="yes"/> 

    <xsl:mode on-no-match="shallow-copy"/> 

    <xsl:template match="Row[not(. is key('group', (Emp_id , Pay_comp))[1])]/Counter"> 
     <xsl:copy>{index-of(key('group', (../Emp_id , ../Pay_comp)), ..)}</xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Avec XSLT 2.0 vous pouvez traduire le dessus

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="2.0"> 

    <xsl:key name="group" match="Row" use="concat(Emp_id, '|', Pay_comp)"/> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Row[not(. is key('group', concat(Emp_id, '|', Pay_comp))[1])]/Counter"> 
    <xsl:copy> 
     <xsl:value-of select="index-of(key('group', concat(../Emp_id, '|', ../Pay_comp)), ..)"/> 
    </xsl:copy> 
</xsl:template> 

+0

fonctionne pour moi grâce – Vicky

+0

Salut Martin, pour certains cas, la mise en est comme 4 5, et 3 4. Où il devrait être seulement une sortie à un seul chiffre. – Vicky

+0

@Vicky, je pense que j'ai fait une erreur là en utilisant 'index-of' dans ce contexte, il devrait être par exemple. 'http: // www.xqueryfunctions.com/xq/functx_index-of-node.html' qui est' functx: index-of-node (clé ('groupe', (../Emp_id, ../Pay_comp)) , ..) 'avec la fonction liée ou insérée dans la feuille de style. –