使用key()函数的列表中的上一项

使用key()函数的列表中的上一项,key,xslt-3.0,Key,Xslt 3.0,我试图简化如何访问列表中的前一个条目的问题()。假设我有一个这样的列表: <?xml version="1.0" encoding="UTF-8"?> <root> <row> <letter>A</letter> <number>1</number> </row> <row> <letter>B</

我试图简化如何访问列表中的前一个条目的问题()。假设我有一个这样的列表:

<?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>

A.
1.
B
2.
C
3.
D
4.
E
5.
F
6.
G
7.
H
8.
还有一个简单的XML文件,如下所示:

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

A.
B
H
我想把前面的条目写在每个对象旁边。因此,这将是期望的输出:

<?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>

A.
B
A.
H
G
这是我到目前为止的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逻辑,因此必须使用类似于前面的兄弟姐妹的东西)

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

如果你知道前面的兄弟姐妹,那么我不知道你为什么没有使用它:
键('letter-lookup',,,$alphabet)/前面的兄弟姐妹::行[1]/letter

有时一个人关心的是大局,一个人对细节失去了眼睛!这就是发生在中观世界上的事情。有时,一个人只关心大局,而忽略了细节!这就是发生在我身上的事