XSLT使用for-each-group进行分组并使用填充元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSLT使用for-each-group进行分组并使用填充元素相关的知识,希望对你有一定的参考价值。

我有一个人员列表,我想用每个人的名字对它们进行分组,然后检查哪个<vitalDates>node有值,并将其放在分组的<person>节点中。

<persons>
    <person>
        <name>Goethe, Johann Wolfgang von </name>
        <vitalDates>
            <earliest/>
            <latest/>
        </vitalDates>
    </person>
    <person>
        <name>Müthel, Lothar</name>
        <vitalDates>
            <earliest/>
            <latest/>
        </vitalDates>
    </person>
    <person>
        <name>Goethe, Johann Wolfgang von</name>
        <vitalDates>
            <earliest>1749</earliest>
            <latest>1832</latest>
        </vitalDates>
    </person>
    <person>
        <name>Müthel, Lothar</name>
        <vitalDates>
            <earliest>1896</earliest>
            <latest>1964</latest>
        </vitalDates>
    </person>
    <person>
        <name>Goethe, Johann Wolfgang von</name>
        <vitalDates>
            <earliest>1749</earliest>
            <latest>1832</latest>
        </vitalDates>
    </person>
</persons>

在片刻我有这个转变:

<persons>
    <xsl:for-each-group select="person" group-by="name">
        <person>
            <name>
                <xsl:value-of select="current-grouping-key()"/>
            </name>
            <vitalDates>
                <earliest>
                    <xsl:for-each select="/persons/person[name=current-grouping-key()]/vitalDates/earliest">
                        <xsl:if test=". != ''">
                            <xsl:value-of select="."/>
                        </xsl:if>
                    </xsl:for-each>
                </earliest>
                <latest>
                    <!-- do the same? -->
                </latest>
            </vitalDates>
        </person>
    </xsl:for-each-group>
</persons>

我得到了这个结果:

<persons>
    <person>
        <name>Goethe, Johann Wolfgang von</name>
        <vitalDates>
            <earliest>17491749</earliest>
            <latest></latest>
        </vitalDates>
    </person>
    <person>
        <name>Müthel, Lothar</name>
        <vitalDates>
            <earliest></earliest>
            <latest></latest>
        </vitalDates>
    </person>
</persons>

就像你可以看到<earliest>元素的值发现两次,但我只需要使用一个值,我不知道如何。

答案

首先,当你使用for-each-group而不是/persons/person[name=current-grouping-key()]时,你可以而且应该只使用current-group()

至于选择第一项,请使用(current-group()/vitalDates/earliest[normalize-space()])[1]

以上是关于XSLT使用for-each-group进行分组并使用填充元素的主要内容,如果未能解决你的问题,请参考以下文章

XSLT:复杂分组的问题

将 Muenchian 分组应用于 XSLT

来自变量的 XSLT for-each-group 不起作用

XSLT Grouping's:将父级添加到子元素中的元素集

for-each 并使用 xslt 对 xml 进行排序和分组

如何在下面的 XSLT 1.0 代码中进行分组。需要按 TaxRateCode 分组