この問題に遭遇したとき、私は別のユーザーを助けていました。
私は、2 つのキーを作成しようとする XSLT のこの部分を持っています。1 つは、子孫の特定の値を含む要素の最初の出現 (同じ親) であり、2 番目のキーは、子孫の同じ値の他のすべての出現です。 . (下手な英語でごめんなさい)
これは最初のキーであり、その目的は、generate-id() 値によってインデックス付けされた特定のレコード/ID に対して、「兄弟の最初」でセットを作成することです。
<xsl:key name ="key1" match="DataPage[not(
preceding-sibling::DataPage/Record/ID = Record/ID
)]"
use="generate-id()"/>
2 番目のキーでは、同じレコード/ID を持つ「最初の兄弟」の generate-id() によってインデックス付けされた、指定されたレコード/ID について、「最初の兄弟ではない」すべての DapaPage 要素を取得しようとします。 :
<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 のバグですか?