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是最高的名字
我希望你能帮助我...(抱歉我的英语不好)
在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)