在谓词中使用分配给变量的当前分组键

Use current-grouping-key assigned to variable in a predicate

我在将现有的 xslt1.0 样式表转换为 2.0 时遇到问题。

我正在使用 Saxon 作为处理器。

问题出在这条指令上:

<xsl:for-each-group select="$currentArt/MAPs/typeMAP[ERs/er/code= $ERval]" group-by="refCde">

其中变量“ERval”是使用另一个 for-each-group 中的 current-grouping-key 函数设置的。

ERval 被设置为 xs:untypedAtomic,并且出现错误“'/' 的第一个操作数的必需项类型是节点 (),提供的值具有项类型 xs:untypeAtomic."

我尝试了不同的方法,但我遗漏了一些东西。

有人可以解释一下,如何实现它,并指出解释它的文档部分吗?

感谢您的帮助。

XML 输入

<?xml version="1.0" encoding="ISO-8859-1"?>
<art>
    <MAPs>
        <typeMAP>
            <libArt>ANJOU TOLERIE</libArt>
            <ERs>
                <er>
                    <code>18</code>
                </er>
                <er>
                    <code>21</code>
                </er>
            </ERs>
            <refCde>1234</refCde>
        </typeMAP>
        <typeMAP>
            <libArt>ARTICLE HOTELIER</libArt>
        </typeMAP>
        <typeMAP>
        <libArt>BOOK</libArt>
            <ERs>
                <er>
                    <code>18</code>
                </er>
            </ERs>
            <refCde>5678</refCde>
        </typeMAP>
        <typeMAP>
            <libArt>ARTICLE HOTELIER</libArt>
        </typeMAP>
    </MAPs>
</art>

样式表

<?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">
                <!--            call template passing ERval-->
                <xsl:call-template name="template">
                    <xsl:with-param name="currentArt" select="."/>
                    <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" select="''"/>
        <xsl:param name="ERval" select="()"/>
        <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>

我想你想要 <xsl:for-each-group select="current-group()" group-by="refCde"> 而不是 <xsl:for-each-group select="$currentArt/MAPs/typeMAP[ERs/er/code = $ERval]" group-by="refCde">