You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在XSLT中如何统计输入XML中指定属性各distinct-value的出现次数

错误原因

你原来的写法有两个核心问题:

  1. distinct-values()返回的是字符串序列,进入xsl:for-each循环后上下文是字符串而非XML节点,使用../查找父节点的操作完全不生效,这是oXygen抛出错误的直接原因。
  2. 你写的[@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:45:03