统计嵌套子节点的个数

Count the number of nested child nodes

我想为所有 NewConsumptionData 和 RegisterConsumptionData 元素查找以下结构中 RegisterValueData 元素的数量,所以只有一个数字。

<ConsumptionData>
<NewConsumptionData>
    <FromDate>2021-02-02T00:00:00</FromDate>
    <RegistersValues>
        <RegisterConsumptionData>
            <Timeframe>TOTAL_HOUR</Timeframe>
            <Values>
                <RegisterValueData>
                    <Quality>NONVALIDATED</Quality>
                </RegisterValueData>
                <RegisterValueData>
                    <Quality>VALIDATED</Quality>
                </RegisterValueData>
            </Values>
        </RegisterConsumptionData>
        <RegisterConsumptionData>
            <Timeframe>TOTAL_HOUR</Timeframe>
            <Values>
                <RegisterValueData>
                    <Quality>NONVALIDATED</Quality>
                </RegisterValueData>
                <RegisterValueData>
                    <Quality>VALIDATED</Quality>
                </RegisterValueData>
            </Values>
        </RegisterConsumptionData>
    </RegistersValues>
</NewConsumptionData>
<NewConsumptionData>
    <FromDate>2021-02-02T00:00:00</FromDate>
    <RegistersValues>
        <RegisterConsumptionData>
            <Timeframe>TOTAL_HOUR</Timeframe>
            <Values>
                <RegisterValueData>
                    <Quality>NONVALIDATED</Quality>
                </RegisterValueData>
                <RegisterValueData>
                    <Quality>VALIDATED</Quality>
                </RegisterValueData>
            </Values>
        </RegisterConsumptionData>
        <RegisterConsumptionData>
            <Timeframe>TOTAL_HOUR</Timeframe>
            <Values>
                <RegisterValueData>
                    <Quality>NONVALIDATED</Quality>
                </RegisterValueData>
                <RegisterValueData>
                    <Quality>VALIDATED</Quality>
                </RegisterValueData>
            </Values>
        </RegisterConsumptionData>
    </RegistersValues>
</NewConsumptionData>

看似简单的事情我无法理解。我正在尝试递归函数(如果这是正确的方法)但不确定如何设置参数并防止它无限循环。

您可以轻松地使用 count() 函数来计算子节点或后代节点:

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:template match="/">
    <result>
        <xsl:value-of select="count(//RegisterValueData)" />
    </result>   
</xsl:template>

</xsl:stylesheet>

或效率更高一点:

<xsl:template match="/ConsumptionData">
    <result>
        <xsl:value-of select="count(NewConsumptionData/RegistersValues/RegisterConsumptionData/Values/RegisterValueData)" />
    </result>   
</xsl:template>

结果

<?xml version="1.0" encoding="UTF-8"?>
<result>8</result>