XSLT - 应用muenchian分组后计算子节点

时间:2017-07-05 12:24:42

标签: xslt-1.0 muenchian-grouping

对于以下输入XML,我可以使用<invoice>方法将所有子<shippingBill>元素分组到相应的muenchian grouping元素下。但是,要求在最终输出XML中包含count个元素<shippingBill><invoice>个元素。我不知道该怎么做。

输入XML

<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

添加了<checkSum>元素,其中包含保存各自计数的子元素。

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

1 个答案:

答案 0 :(得分:0)

我会这样做:

XSLT 1.0

if ( ! is_null($weekday ))