:
は、フィルタリング後のXMLは次のようになります予想されます。 (Web検索では他にもたくさんの検索があります)
Muenchianのグループ分けは、原則としてそれがなくてもできることをより早く行います。状況によっては、追加されたスピードが「原理的に可能」と「実際に実行可能」の違いになります。しかし、状況によっては、この問題に対する単純なアプローチで十分です。
問題1: 'ID'ごとに1つの 'bar'要素が出力に必要です。 ID 1111または2222の棒のどれもが入力内に一意のIDを持たないので、あなたの説明出力が間違っていることを示しています。
この問題を解決する1つの方法: 'bar'の2つのテンプレートを作成します.1つは 'id'が最初に出現したときに発生します(実際は 'id'の別の値です最大の有効性/日付の価値を見出す作業)、そしてその「id」で後に出現するすべての「bar」を無視させるものが無視されます。
<xsl:template match="bar" priority="10.0">
<!--* find the highest validity/date with this ID here,
* do what needs to be done. *-->
...
</xsl:template>
<xsl:template match="bar[id = preceding-sibling::bar/id]"
priority="20.0"/>
私は将来-私を、私はここに巧妙なものにしようとしていることを警告する明示的な優先順位を与えてくれた(と変更するように試合のパターンを変更することで、それを台無しから未来 - 私を防ぐために相対的な優先順位)。
これを行うもう1つの方法は、 'bar'のテンプレート内に選択/いつ配置するかです。
<xsl:template match="bar">
<xsl:variable name="id" select="string(id)"/>
<xsl:choose>
<xsl:when test="preceding::bar[id=$id]"/>
<xsl:otherwise>
<!--* this is the first of this ID, deal with this ID now *-->
...
</
</
</
この2番目のパターンは、実際に出力にコピーしたい 'bar'要素を見つけるために必要なロジックを定式化しやすくすることがあります。あなたは最高の有効/日付値と各IDのない最初のインスタンスを処理したいのですが、インスタンス(複数可):
<xsl:template match="bar">
<xsl:variable name="id" select="string(id)"/>
<xsl:choose>
<!--* the behavior of comparisons here requires a little
* bit of standing on our heads. We want this 'bar' if
* its validity/date value is greater than or equal to
* all other such values for this ID. So first we filter
* out all cases where there is a higher validity/date value
* on another 'bar' with this ID. *-->
<xsl:when test="validity/date < //bar[id=$id]/validity/date"/>
<!--* The 'otherwise' case handles situations where this
* is the only 'bar' with this ID, or where there is no
* higher validity/date value. *-->
<xsl:otherwise>
<xsl:copy-of select="."/>
</
</
</
これは「管理可能」に関する一回限りまたは実行していない、ほとんどのスタイルシートに実行された場合あなたが既に鍵とその使い方をよく理解していない限り、このパターンはMuenchianのグループ分けよりも理解しやすいかもしれません。それが遅すぎる場合、Muenchianグループは通常、同じことを達成するより速い方法であることをあなたに示します。
[注:答えの最初のバージョンはmaxdate
変数
<xsl:variable name="maxdate"
select="max(//bar[id=$id]/validity/date)"/>
を持っていただけで、それに現在の値を比較した:
<xsl:when test="validity/date = $maxdate">
<xsl:copy-of select="."/>
</
しかし、XPath 1.0の唯一の集約関数は、カウントされています()とsum()です。私は「これがXSLT 2.0でどれくらい簡単にできるか見てみましょうか?もしあなたが2歳になったら。0全体の事はちょうど
<xsl:sequence select="for $v in distinct-values(//bar/id)
for $max in max(//bar[id=$v]/validity/date)
return //bar[id=$v and validity/date = $max]"/>
ようなものになるだろうとmax()関数は、本当にそんなに単純なものを作るのは比較的控えめな役割を果たしている。]
これは基本的にグループ化の問題です。http://www.jenitennison.com/xslt/grouping/muenchian.htmlを参照してください。各グループ内では、日付でソートして最初の(または最後の)レコードを出力します。 –
@ michael.hor257kありがとうございます。私はMuenchianのグループ分けについてもっと探求します。 – esb2010