2017-07-05 2 views
0

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> 

Répondre

0

je le ferais de cette façon:

XSLT 1,0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*" /> 
    <xsl:key name="key-bill" match="shippingBill" use="shippingBillNo" /> 

    <!-- identity transform --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="shippingBills"> 
     <xsl:variable name="distinct-bills" select="shippingBill[generate-id() = generate-id(key('key-bill', shippingBillNo)[1])]" /> 
     <checkSum> 
      <noOfInvoices> 
       <xsl:value-of select="count(shippingBill/invoice)" /> 
      </noOfInvoices> 
      <noOfShippingBills> 
       <xsl:value-of select="count($distinct-bills)" /> 
      </noOfShippingBills> 
     </checkSum> 
     <xsl:copy> 
      <xsl:apply-templates select="$distinct-bills" 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> 
+0

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 ''. –

+0

@AniketV Ceci est un changement trivial et vous devriez être capable de l'implémenter vous-même. –

+0

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