具有 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
。
我已尝试简化有关如何访问列表中上一个条目的问题 (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
。