0

我正在关注这篇关于Muenchian 分组方法的文章作为参考。

在我的问题中,在每个组中,节点的某些值<forename>可以重复,而我想过滤唯一值。我尝试应用forename[not(.=preceding-sibling::forename)] 选择标准,但这不起作用,因为我在输出中看到重复项。

下面是我正在测试的 XSLT(这与上面的文章中应用额外过滤器的“隔离”行基本完全相同)。

我显然弄错了。这里有什么问题?

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes" method="text"/>
    <xsl:key name="contacts-by-surname" match="contact" use="surname" />
    <xsl:template match="records">
        <xsl:for-each select="contact[count(. | key('contacts-by-surname', surname)[1]) = 1]">
            <xsl:sort select="surname" />
            <xsl:value-of select="surname" />
            <xsl:for-each select="key('contacts-by-surname', surname)">
                <xsl:sort select="forename" />


                <xsl:value-of select="forename[not(.=preceding-sibling::forename)]" />


            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
4

1 回答 1

1

您可以使用另一个键进行两级分组

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes" method="text"/>
    <xsl:key name="contacts-by-surname" match="contact" use="surname" />
    <xsl:key name="contacts-by-full-name" match="contact" use="concat(surname, '|', forename)" />
    <xsl:template match="records">
        <xsl:for-each select="contact[count(. | key('contacts-by-surname', surname)[1]) = 1]">
            <xsl:sort select="surname" />
            <xsl:value-of select="surname" />
            <xsl:for-each select="key('contacts-by-surname', surname)
                [count(. | key('contacts-by-full-name',
                               concat(surname, '|', forename'))[1]) = 1]">
                <xsl:sort select="forename" />
                <xsl:value-of select="forename" />
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

在这里,在每个surname组中,我正在对全名 (surname|forename) 进行另一个 Muenchian 分组,并仅提取具有该姓氏的联系人集中每个名字的第一个实例。

于 2013-04-08T13:50:07.300 回答