首页 > 解决方案 > XSLT:子节点的不同名称

问题描述

<mensagens>
        <mensagem maquina="M02" timestamp="2020-05-22T15:28:50+0000">
            <inicioAtividade>
                <contexto>
                    <tipo>OP</tipo>
                    <descricao>12345</descricao>
                </contexto>
            </inicioAtividade>
        </mensagem>

        <mensagem maquina="M03" timestamp="2020-05-22T15:29:46-0400">
            <fimAtividade>
                <contexto>
                    <tipo>OP</tipo>
                    <descricao>12345</descricao>
                </contexto>
            </fimAtividade>
        </mensagem>

        <mensagem maquina="M03" timestamp="2020-05-22T15:29:46-0400">
            <paragemForcada>
                <causa id="fdbs"/>
            </paragemForcada>
        </mensagem>

        <mensagem maquina="M02" timestamp="2020-05-22T18:28:46-0400">
            <consumo>
                <materiaPrima id="PC3025"/>
                <quantidade>200</quantidade>
                <origem>
                    <maquina id="M01"/>
                </origem>
            </consumo>
        </mensagem>

        <mensagem maquina="M01" timestamp="2020-05-23T15:28:46-0400">
            <producao>
                <produto id="PC3025"/>
                <quantidade>10</quantidade>
            </producao>
        </mensagem>

        <mensagem maquina="M03" timestamp="2020-06-22T15:28:46-0400">
            <entregaProducao>
                <quantidade>10</quantidade>
                <produto id="RC1.3"/>
                <deposito id="DEP1"/>
            </entregaProducao>
        </mensagem>

        <mensagem maquina="M01" timestamp="2020-05-31T15:28:46-0400">
            <estorno>
                <quantidade>10</quantidade>
                <materiaPrima id="RC1.2"/>
                <deposito id="DEP1"/>
            </estorno>
        </mensagem>
    </mensagens>

我正在尝试获取“mensagem”的所有子节点的名称。

输出将是: inicioAtividade、fimAtividade、paragemForcada 等。

我已经知道如何获得 mensagem 名字的孩子,但我无法获得每个不同的名字

我的模板从 menagens 开始

我怎么能得到这样的东西?

标签: xmlxsltxslt-2.0xslt-3.0

解决方案


只需使用这个 XSLT 表达式:

<xsl:value-of select="distinct-values(mensagem/*/name())" separator=", " />

它的输出是

inicioAtividade, fimAtividade, paragemForcada, consumo, producao, entregaProducao, estorno

要计算不同名称的每次出现,您可以使用此模板:

<xsl:template match="/mensagens">
  <xsl:for-each-group select="mensagem/*" group-by="name()">
    <xsl:value-of select="concat(count(current-group()),' - ',current-grouping-key())" />
    <xsl:text>&#xa;</xsl:text>
  </xsl:for-each-group>
</xsl:template>

它的输出是

1 - inicioAtividade
1 - fimAtividade
1 - paragemForcada
1 - consumo
1 - producao
1 - entregaProducao
1 - estorno

推荐阅读