当我们遇到这个问题时,我正在帮助其他用户。
我有这个XSLT,我尝试创建两个键,一个是第一次出现(在同一个父中),一个元素在一个后代上包含一个给定的值,另一个是所有其他出现在同一个值上的在后代。 (抱歉英语不好)
这是第一个键,其目标是为给定的Record / ID创建一个带有“第一个兄弟姐妹”的集合,由其generate-id()值索引:
<xsl:key name ="key1" match="DataPage[not(
preceding-sibling::DataPage/Record/ID = Record/ID
)]"
use="generate-id()"/>
在第二个键中,我尝试获取所有DapaPage元素,这些元素是“不是第一个兄弟姐妹”,对于给定的记录/ ID,由“兄弟姐妹的第一个”的generate-id()索引记录/ 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错误?
答案 0 :(得分:1)
很难说肯定,但是,这看起来像xsltproc中的错误。至少,我没有在你的键构造函数中看到任何错误,并且Saxon 9.4.0.3同意Xalan而不是输出中的xsltproc。