首页 > 解决方案 > 计算嵌套子节点的数量

问题描述

我想在下面的结构中找到所有 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>

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

标签: xslt-1.0nested-loops

解决方案


您可以轻松地使用该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>

推荐阅读