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

XSLT2.0迁移时current-grouping-key赋值变量在谓词中使用报错

问题根因

报错的核心原因有两点:

  1. 外层for-each-group循环的上下文已经切换为typeMAP节点,调用模板时传入的currentArt参数取值为".",实际传入的是typeMAP节点而非原本的art根节点,子模板中尝试对typeMAP节点取MAPs/typeMAP路径本就无法匹配到节点,再加上currentArt参数的默认值设为了空字符串''(原子类型),一旦触发默认值逻辑,对原子类型执行路径表达式/操作就会触发类型不匹配错误。
  2. 所有参数没有显式声明类型,XSLT 2.0的强类型校验机制会将未声明类型的分组键值识别为xs:untypedAtomic,部分比较场景下也会触发类型校验错误。

解决方法

步骤1:修正传参逻辑

外层match="art"模板中,调用子模板时传入的currentArt参数改为取当前art节点,而非for-each-group上下文中的typeMAP节点,可通过current()函数获取模板原上下文节点:

<xsl:with-param name="currentArt" select="current()"/>

步骤2:给参数显式声明类型

给子模板的两个参数添加as属性明确类型,既可以避免隐式类型转换问题,也能提前发现传参错误:

<xsl:param name="currentArt" as="element(art)"/>
<xsl:param name="ERval" as="xs:string"/>

步骤3(可选):明确分组键取值逻辑

如果一个typeMAP下存在多个er/code时仅需要按第一个值分组,可以修改外层group-by表达式避免节点被分到多个组:

<xsl:for-each-group select="./MAPs/typeMAP" group-by="(ERs/er/code)[1]">

修复后完整样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    
    <xsl:output method="text" encoding="ISO-8859-1"/>
        
    <xsl:template match="/">
        <xsl:apply-templates select="//art"/>
    </xsl:template>
    
    <xsl:template match="art">
        <xsl:if test="./MAPs/typeMAP/ERs/er/code">
            <xsl:for-each-group select="./MAPs/typeMAP" group-by="ERs/er/code">
                <!-- 传入当前art节点而非typeMAP节点 -->
                <xsl:call-template name="template">
                    <xsl:with-param name="currentArt" select="current()"/>
                    <xsl:with-param name="ERval" select="current-grouping-key()"/>
                </xsl:call-template>
            </xsl:for-each-group>
        </xsl:if>
    </xsl:template>
    
    <xsl:template name="template">
        <!-- 显式声明参数类型,移除无意义的默认值 -->
        <xsl:param name="currentArt" as="element(art)"/>
        <xsl:param name="ERval" as="xs:string"/>
        <xsl:for-each-group select="$currentArt/MAPs/typeMAP[ERs/er/code = $ERval]" group-by="refCde">
            <xsl:value-of select="current-grouping-key()"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:for-each-group>
    </xsl:template>
    
</xsl:stylesheet>

运行结果

使用提供的XML输入运行修复后的样式表,输出结果为:

1234
5678
1234

对应分组键18输出两行refCde、分组键21输出一行refCde,符合分组逻辑预期。

内容的提问来源于stack exchange,提问作者Snow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:15:07