当我们遇到这个问题时,我正在帮助另一个用户。
我有这段 XSLT,我尝试在其中创建两个键,一个是第一次出现(在同一个父级中)的元素在后代中包含给定值,第二个是在后代中所有其他出现的相同值的元素. (抱歉英语不好)
这是第一个键,其目标是为给定的 Record/ID 创建一个具有“第一个兄弟姐妹”的集合,由其 generate-id() 值索引:
<xsl:key name ="key1" match="DataPage[not(
preceding-sibling::DataPage/Record/ID = Record/ID
)]"
use="generate-id()"/>
在第二个键中,我尝试获取“不是第一个兄弟姐妹”的所有 DapaPage 元素,对于给定的 Record/ID,由具有相同 Record/ID 的“第一个兄弟姐妹”的 generate-id() 索引:
<xsl:key name="key2" match="DataPage[
preceding-sibling::DataPage/Record/ID = Record/ID
]"
use="generate-id(preceding-sibling::DataPage[
Record/ID = current()/Record/ID
][last()])" />
和模板
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="DataPage"/>
</xsl:copy>
</xsl:template>
<xsl:template match="DataPage">
<xsl:copy>
<xsl:for-each select="key('key1',generate-id())">
<Key1>
<xsl:copy-of select="."/>
</Key1>
</xsl:for-each>
<xsl:for-each select="key('key2',generate-id())">
<Key2>
<xsl:copy-of select="."/>
</Key2>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我用这个 XML 测试了 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<Page>
<DataPage>
<Record>
<ID>0</ID>
<DESC>AAA</DESC>
<AMOUNT>11</AMOUNT>
</Record>
</DataPage>
<DataPage>
<Record>
<ID>0</ID>
<DESC>BBB</DESC>
<AMOUNT>22</AMOUNT>
</Record>
</DataPage>
<DataPage>
<Record>
<ID>0</ID>
<DESC>CCC</DESC>
<AMOUNT>333</AMOUNT>
</Record>
</DataPage>
</Page>
正如预期的那样,使用 Xalan 对其进行转换,我得到以下结果:
<Page>
<DataPage>
<Key1>
<DataPage>
<Record>
<ID>0</ID>
<DESC>AAA</DESC>
<AMOUNT>11</AMOUNT>
</Record>
</DataPage>
</Key1>
<Key2>
<DataPage>
<Record>
<ID>0</ID>
<DESC>BBB</DESC>
<AMOUNT>22</AMOUNT>
</Record>
</DataPage>
</Key2>
<Key2>
<DataPage>
<Record>
<ID>0</ID>
<DESC>CCC</DESC>
<AMOUNT>333</AMOUNT>
</Record>
</DataPage>
</Key2>
</DataPage>
<DataPage/>
<DataPage/>
</Page>
但是,当我使用 libXML xsltproc 时,我只得到这个:
<Page>
<DataPage>
<Key1>
<DataPage>
<Record>
<ID>0</ID>
<DESC>AAA</DESC>
<AMOUNT>11</AMOUNT>
</Record>
</DataPage>
</Key1>
</DataPage>
<DataPage/>
<DataPage/>
</Page>
Key2的构造有什么问题,或者这是一个xslproc bug?