如何计算具有相同名称的元素?XML - > Xquery

lan*_*ner 2 xml xslt xpath xquery count

我有一个像xml文档:

<root>
<test>
    <humans>
        <names>Tim</names>
    </humans>
</test>
<test>
    <humans>
        <names>Jack</names>
        <names>Jones</names>
    </humans>
</test>
<test>
    <humans>
        <names>Tim</names>
    </humans>
</test>
</root>
Run Code Online (Sandbox Code Playgroud)

我想要计算所有相同的名字:Tim 2,Jack 1,Jones 1,它应该给出一个输出:

<x> Tim </x> 
Run Code Online (Sandbox Code Playgroud)

因为TIM是最高的名字

我希望你能帮助我...(抱歉我的英语不好)

Dim*_*hev 5

在XPath 2.0中,XSLT 2.0和XQuery使用(完全相同的解决方案):

(/*/*/*/names[for $v in .,
                    $cnt in count(/*/*/*/names[. eq $v])
                 return
                    $cnt
                   eq
                     max(for $n in distinct-values(/*/*/*/names)
                           return
                              count(/*/*/*/names[. eq $n])
                        )
                ]
    )[1]
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下XSLT 1.0转换轻松获取此元素:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:key name="kNamesByVal" match="names" use="."/>

 <xsl:template match="/">
  <xsl:for-each select=
   "*/*/*/names[generate-id()
               =
                generate-id(key('kNamesByVal',.)[1])
               ]">
   <xsl:sort select="count(key('kNamesByVal',.))"
    data-type="number" order="descending"/>

    <xsl:if test="position()=1">
      <xsl:copy-of select="."/>
    </xsl:if>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

在提供的XML文档上评估(应用)上述XPath 2.0/XQuery表达式或XSLT转换时:

<root>
    <test>
        <humans>
            <names>Tim</names>
        </humans>
    </test>
    <test>
        <humans>
            <names>Jack</names>
            <names>Jones</names>
        </humans>
    </test>
    <test>
        <humans>
            <names>Tim</names>
        </humans>
    </test>
</root>
Run Code Online (Sandbox Code Playgroud)

选择(生产)正确的元素:

<names>Tim</names>
Run Code Online (Sandbox Code Playgroud)