【问题标题】:XSLT: Distinct names of child nodesXSLT:子节点的不同名称
【发布时间】:2020-06-08 21:29:04
【问题描述】:
<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 名称的孩子,但我无法获取每个不同的名称

我的模板从 mensagens 开始

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

【问题讨论】:

    标签: xml xslt xslt-2.0 xslt-3.0


    【解决方案1】:

    只需使用这个 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
    

    【讨论】:

    • 我试过了,我得到一个错误说转换失败:\
    • 到底是什么失败了?
    • 我在 php 上使用 genko,它只是说表达式无效
    • 您标记了这个问题 XSLT-2.0。 genko 是否支持 XSLT-2.0 或更高版本?
    • 我注意到问题标题提到了 distinct 值。如果确实需要,可以在 xPath 表达式中使用 distinct-values 函数:distinct-values(//mensagem/*/name())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多