如何列出每个不同的元素并计算XSLT / XPATH中每个元素的所有出现?

时间:2016-06-06 12:56:37

标签: xml xslt xpath count

我想将列表缩减为不同的元素,但要计算该元素每次出现的次数:

<list>
  <entry>A</entry>
  <entry>B</entry>
  <entry>A</entry>
  <entry>A</entry>
  <entry>B</entry>
</list>

目标结果:

A - 3 [出现]

B - 2 [出现]

我尝试过使用

<xsl:value-of select="count()" />

但它要么计算“entry”元素(5)的所有出现次数,要么计算不同“entry”元素的数量(2,即A和B)。

我最近的尝试是将两个for-each循环组合在一起(之前从未做过),但这也不起作用:

<xsl:variable name="occurences">
<xsl:for-each select="//entry[not(.=preceding::entry)]">
<xsl:value-of select="count()" />
</xsl:for-each>
</xsl:variable>

<xsl:template match="/">
<xsl:for-each select="//entry">
<p>
     <xsl:value-of select="." /> - <xsl:value-of select="$occurences" />
</p>
</xsl:for-each>
</xsl:template>

[使用错误的参数调用XPath函数。]

我会感激任何暗示......

谢谢! 约翰

1 个答案:

答案 0 :(得分:0)

如果你确实可以使用XSLT 2.0,可以在这里使用xsl:for-each-group,但是你需要选择entry个元素,而不是单个list元素,因为它是你的入口元素希望分组。

试试这个XSLT

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

  <xsl:template match="list">
    <table> 
      <xsl:for-each-group select="entry" group-by="."> 
         <tr> 
            <td><xsl:value-of select="."/></td> 
            <td><xsl:value-of select="count(current-group())"/></td> 
         </tr> 
       </xsl:for-each-group> 
     </table>
  </xsl:template>
</xsl:stylesheet>

或者,您可以使用distinct-values

进行操作
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:key name="entry" match="entry" use="." />
  <xsl:variable name="root" select="/" />

  <xsl:template match="list">

    <table> 
      <xsl:for-each select="distinct-values(entry)"> 
         <tr> 
            <td><xsl:value-of select="."/></td> 
            <td><xsl:value-of select="count(key('entry', ., $root))"/></td> 
         </tr> 
       </xsl:for-each> 
     </table>
  </xsl:template>
</xsl:stylesheet>

请注意key函数中第三个参数的使用,因为在循环中,您不再位于主文档的上下文中。