具有 key()-函数的列表中的上一个条目

Previous entry in list with key()-function

我已尝试简化有关如何访问列表中上一个条目的问题 (link)。假设我有一个这样的列表:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <row>
        <letter>A</letter>
        <number>1</number>
    </row>
    <row>
        <letter>B</letter>
        <number>2</number>
    </row>
    <row>
        <letter>C</letter>
        <number>3</number>
    </row>
    <row>
        <letter>D</letter>
        <number>4</number>
    </row>
    <row>
        <letter>E</letter>
        <number>5</number>
    </row>
    <row>
        <letter>F</letter>
        <number>6</number>
    </row>
    <row>
        <letter>G</letter>
        <number>7</number>
    </row> 
    <row>
        <letter>H</letter>
        <number>8</number>
    </row>
</root>

还有一个像这样的简单 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<base>
    <object>A</object>
   <object>B</object>
    <object>H</object>
</base>

我想在每个对象旁边写上前面的条目。所以这将是所需的输出:

<?xml version="1.0" encoding="utf-8"?>
    <group>
   <object>A</object>
   <preceding></preceding>
</group>
   <group>
   <object>B</object>
   <preceding>A</preceding>
</group>
    <group>
   <object>H</object>
   <preceding>G</preceding>
</group>

这是我目前拥有的 XSL 代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">

    <xsl:mode on-no-match="shallow-copy" />
    <xsl:output indent="yes"
        method="xml"
        encoding="utf-8"
        omit-xml-declaration="false"/>

    <xsl:param name="alphabet" select="document('alphabet.xml')"/>
    <xsl:key name="letter-lookup" match="row" use="letter"/>

    <xsl:template match="base">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="object">
        <xsl:element name="group">
            <xsl:element name="object">
            <xsl:value-of select="text()"/>
            </xsl:element>
            <xsl:element name="preceding">
                <xsl:value-of select="key('letter-lookup', text(), $alphabet)/parent::*/position()"/>
            </xsl:element>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

position()当然不行。但是我怎样才能得到以前的结果呢? (列表中的字母是为了简单起见。在真正的列表中,没有隐含的 ABC 逻辑,因此必须使用类似 preceding-sibling 的东西)

如果您知道前面的兄弟姐妹,那么我不确定您为什么没有使用它:key('letter-lookup', ., $alphabet)/preceding-sibling::row[1]/letter