この述語([1])は、muenchianグループで常に1としてハードコーディングされているのだろうかと思っていました。多くの調査を行った後、その概念は私には明確ではありませんでした。現在のノードとして説明され、キーによって返される最初のグループと比較されます。キーが一致する最初のキーと常に比較されるのはなぜですか?また、なぜもう一度1を与えるのかcontact[count(. | key('contacts-by-surname', surname)[1]) = 1], the =1 part?
はハードコーディングされています。以下のリンクを参照しました
3 に答える
キー定義があるとすると<xsl:key name="contacts-by-surname" match="contact" use="surname"/>
、式は、がであるkey('contacts-by-surname', 'Doe')
すべてのcontact
要素を含むノードセットを提供します。この式は、その「グループ」の最初のものを提供します。surname
Doe
key('contacts-by-surname', 'Doe')[1]
contact
ここで、またはを使用してすべてのcontact
要素を処理する場合、通常、各グループの最初の要素を識別する方法が必要です。これは、またはで実現できます。for-each
apply-templates
contact
<xsl:for-each select="contact[count(. | key('contacts-by-surname', surname)[1]) = 1]">
<xsl:for-each select="contact[generate-id() = generate-id(key('contacts-by-surname', surname)[1])]">
要件が異なり、たとえば各グループの最後の項目を識別したい場合は、もちろん、<xsl:for-each select="contact[count(. | key('contacts-by-surname', surname)[last()]) = 1]">
またはのように異なる述語を使用できます<xsl:for-each select="contact[generate-id() = generate-id(key('contacts-by-surname', surname)[last()])]">
。
この述語([1])は、muenchianグループで常に1としてハードコーディングされているのだろうかと思っていました。
これは簡単です:
このkey()
関数は、特定のグループのすべてのノードを生成し、任意のグループから1つのノードのみを取得する必要があります。
すべてのグループに2つ以上のノードが含まれるとは限りません。ノードが1つしかないグループもあります。
これが、各グループから最初の(そしておそらく唯一の)ノードを取得することが安全で便利な理由です。
各グループから最後のノードを取得してグループ化を行うことも同様にうまくできます(ただし、これは効率が低下します)。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kNumByMod3" match="num"
use=". mod 3"/>
<xsl:template match=
"num[generate-id()
=
generate-id(key('kNumByMod3', . mod 3)[last()])
]
">
3k + <xsl:value-of select=". mod 3"/>:
<xsl:text/>
<xsl:copy-of select="key('kNumByMod3', . mod 3)"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
このXMLドキュメントに適用した場合:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
必要な、正しくグループ化された結果を生成します:
3k + 2:
<num>02</num>
<num>05</num>
<num>08</num>
3k + 0:
<num>03</num>
<num>06</num>
<num>09</num>
3k + 1:
<num>01</num>
<num>04</num>
<num>07</num>
<num>10</num>
基本的なアルゴリズムは、2つのネストされたループがあることです。外側のループは各グループから1つの代表的なノードを選択し、内側のループはそのグループ内のすべてのノード(代表として選択されたノードを含む)を選択します。グループから1つの代表的なノードを選択する最も簡単な方法は、最初のノード、つまり述語を選択すること[1]
です。