use the Muenchian Method:<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:key name="Person-PersonName" match="Person" use="@PersonName" />
<xsl:template match="//DeptFolder[@DeptId='54']" >
<xsl:for-each select=".//Person[count(. | key('Person-PersonName', @PersonName)[1]) = 1]">
<xsl:sort select="@PersonID" />
<xsl:value-of select="@PersonName" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>seehttp://www.jenitennison.com/xslt/grouping/muenchian.html

解决方案 »

  1.   

    但是结果好像不太对,对于指定节点 DeptId='54' ,输出结果是正确的,但是对于节点:
    DeptId='61'
    输出只有 momm ,为什么?能着重解释一下: count(. | key('Person-PersonName', @PersonName)[1])的含义吗?
    尤其是key(...)[1],那个 [1] 表示什么?
      

  2.   

    明白错误原因了,因为key 的集合是建立在根节点下的,而不不是要查询的节点下的。<xsl:key name="Person-PersonName" match="//DeptFolder[@DeptId='61']//Person" use="@PersonName" />改成这样就对了。还有问一个简单的问题: count(. | key('Person-PersonName', @PersonName)[1]) 中的 | 是个交集的概念?
      

  3.   

    对,
    count(. | key('Person-PersonName', @PersonName)[1]) 
    就是说,如果里第一个节点跟当前节点本身的集合只有一个节点的话(意即,第
    一个节点==当前节点),才做输出
    you can also try
    <xsl:for-each select=".//Person[generate-id() = generate-id(key('Person-PersonName', @PersonName)[1])]">