3

この述語([1])は、muenchianグループで常に1としてハードコーディングされているのだろうかと思っていました。多くの調査を行った後、その概念は私には明確ではありませんでした。現在のノードとして説明され、キーによって返される最初のグループと比較されます。キーが一致する最初のキーと常に比較されるのはなぜですか?また、なぜもう一度1を与えるのかcontact[count(. | key('contacts-by-surname', surname)[1]) = 1], the =1 part?はハードコーディングされています。以下のリンクを参照しました

http://www.jenitennison.com/xslt/grouping/muenchian.html

4

3 に答える 3

2

キー定義があるとすると<xsl:key name="contacts-by-surname" match="contact" use="surname"/>、式は、がであるkey('contacts-by-surname', 'Doe')すべてのcontact要素を含むノードセットを提供します。この式は、その「グループ」の最初のものを提供します。surnameDoekey('contacts-by-surname', 'Doe')[1]contact

ここで、またはを使用してすべてのcontact要素を処理する場合、通常、各グループの最初の要素を識別する方法が必要です。これは、またはで実現できます。for-eachapply-templatescontact<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()])]">

于 2011-11-21T13:00:32.287 に答える
1

この述語([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>
于 2011-11-21T14:19:34.597 に答える
0

基本的なアルゴリズムは、2つのネストされたループがあることです。外側のループは各グループから1つの代表的なノードを選択し、内側のループはそのグループ内のすべてのノード(代表として選択されたノードを含む)を選択します。グループから1つの代表的なノードを選択する最も簡単な方法は、最初のノード、つまり述語を選択すること[1]です。

于 2011-11-21T15:56:36.790 に答える