Pour le code XML d'entrée ci-dessous, je peux grouper tous les éléments <invoice>
enfants sous l'élément <shippingBill>
approprié en utilisant la méthode muenchian grouping
. Cependant, il est nécessaire d'inclure le count
du nombre d'éléments <shippingBill>
et les éléments <invoice>
dans le résultat final XML. Je ne suis pas sûr de savoir comment s'y prendre.XSLT - Comptage des nœuds enfants après l'application du groupement muenchian
XML d'entrée
<bank>
<shippingBills>
<shippingBill>
<shippingBillNo>5786885</shippingBillNo>
<shippingBillDate>10/02/2016</shippingBillDate>
<LEODate>11/02/2016</LEODate>
<invoice>
<invoiceSerialNo>1</invoiceSerialNo>
<invoiceNo>183</invoiceNo>
<invoiceDate>07/02/2016</invoiceDate>
</invoice>
</shippingBill>
<shippingBill>
<shippingBillNo>5786885</shippingBillNo>
<shippingBillDate>10/02/2016</shippingBillDate>
<LEODate>11/02/2016</LEODate>
<invoice>
<invoiceSerialNo>2</invoiceSerialNo>
<invoiceNo>184</invoiceNo>
<invoiceDate>07/02/2016</invoiceDate>
</invoice>
</shippingBill>
<shippingBill>
<shippingBillNo>3318135</shippingBillNo>
<shippingBillDate>01/10/2015</shippingBillDate>
<LEODate>01/10/2015</LEODate>
<invoice>
<invoiceSerialNo>1</invoiceSerialNo>
<invoiceNo>172</invoiceNo>
<invoiceDate>29/09/2015</invoiceDate>
</invoice>
</shippingBill>
<shippingBill>
<shippingBillNo>3318135</shippingBillNo>
<shippingBillDate>01/10/2015</shippingBillDate>
<LEODate>01/10/2015</LEODate>
<invoice>
<invoiceSerialNo>2</invoiceSerialNo>
<invoiceNo>173</invoiceNo>
<invoiceDate>29/09/2015</invoiceDate>
</invoice>
</shippingBill>
</shippingBills>
</bank>
XSL
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="key-bill" match="shippingBill" use="shippingBillNo"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="shippingBills">
<xsl:copy>
<xsl:apply-templates
select="shippingBill[generate-id() = generate-id(key('key-bill', shippingBillNo)[1])]"
mode="group" />
</xsl:copy>
</xsl:template>
<xsl:template match="shippingBill" mode="group">
<shippingBill>
<xsl:apply-templates select="*[not(self::invoice)]" />
<invoices>
<xsl:apply-templates select="key('key-bill', shippingBillNo)/invoice" />
</invoices>
</shippingBill>
</xsl:template>
</xsl:stylesheet>
XML final de sortie requise
L'élément <checkSum>
a été ajoutée, qui a des éléments enfants qui maintiennent le c respective ounts.
<bank>
<checkSum>
<noOfInvoices>4</noOfInvoices>
<noOfShippingBills>2</noOfShippingBills>
</checkSum>
<shippingBills>
<shippingBill>
<shippingBillNo>5786885</shippingBillNo>
<shippingBillDate>10/02/2016</shippingBillDate>
<LEODate>11/02/2016</LEODate>
<invoices>
<invoice>
<invoiceSerialNo>1</invoiceSerialNo>
<invoiceNo>183</invoiceNo>
<invoiceDate>07/02/2016</invoiceDate>
</invoice>
<invoice>
<invoiceSerialNo>2</invoiceSerialNo>
<invoiceNo>184</invoiceNo>
<invoiceDate>07/02/2016</invoiceDate>
</invoice>
</invoices>
</shippingBill>
<shippingBill>
<shippingBillNo>3318135</shippingBillNo>
<shippingBillDate>01/10/2015</shippingBillDate>
<LEODate>01/10/2015</LEODate>
<invoices>
<invoice>
<invoiceSerialNo>1</invoiceSerialNo>
<invoiceNo>172</invoiceNo>
<invoiceDate>29/09/2015</invoiceDate>
</invoice>
<invoice>
<invoiceSerialNo>2</invoiceSerialNo>
<invoiceNo>173</invoiceNo>
<invoiceDate>29/09/2015</invoiceDate>
</invoice>
</invoices>
</shippingBill>
</shippingBills>
</bank>
Les modifications proposées créent l'élément '' comme un enfant de '' au lieu de enfant de '' élément qui est requis. Le '' devrait être un frère de ''. –
@AniketV Ceci est un changement trivial et vous devriez être capable de l'implémenter vous-même. –
Merci. J'ai mis en application le changement et ai également mis à jour le XSL final dans la réponse avec le changement. Marquer la réponse comme acceptée. –