在XSLT中如何统计输入XML中指定属性各distinct-value的出现次数
错误原因
你原来的写法有两个核心问题:
distinct-values()返回的是字符串序列,进入xsl:for-each循环后上下文是字符串而非XML节点,使用../查找父节点的操作完全不生效,这是oXygen抛出错误的直接原因。- 你写的
[@name='.']把.放在了单引号内,XPath会将其识别为匹配值为英文句号的字符串,而非取当前循环的上下文值,逻辑不成立。
修复方案
方案1:基于原有逻辑调整
你可以先在循环外定义根节点变量,循环内通过current()获取当前遍历的发言者名称,全局统计匹配的发言次数:
<xsl:template match="/"> <xsl:variable name="doc-root" select="/"/> <html> <head>Speaker analysis</head> <body> <h1>Table of speech frequency</h1> <table> <tr><th>Speaker</th><th>Frequency</th></tr> <xsl:for-each select="distinct-values(//speaker/@name)"> <tr> <td><xsl:value-of select="."/></td> <td><xsl:value-of select="count($doc-root//speech[speaker/@name = current()])"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template>
方案2:更推荐的分组统计实现(XSLT 2.0+支持)
统计分组频次更简洁的方式是直接用xsl:for-each-group做分组,不需要额外遍历去统计:
<xsl:template match="/"> <html> <head>Speaker analysis</head> <body> <h1>Table of speech frequency</h1> <table> <tr><th>Speaker</th><th>Frequency</th></tr> <xsl:for-each-group select="//speech" group-by="speaker/@name"> <tr> <td><xsl:value-of select="current-grouping-key()"/></td> <td><xsl:value-of select="count(current-group())"/></td> </tr> </xsl:for-each-group> </table> </body> </html> </xsl:template>
内容的提问来源于stack exchange,提问作者haggis78
相关产品推荐
相关产品推荐

