0

特にこの質問の答えはどこにも見つからず、苦労してきました。同じ子ノード値 A を持つセット内の別のノードが存在する子ノード値 A を持つセット内のすべてのノードを XPath で選択し、それらをペアにできるようにしたいと考えています。

たとえば、映画「imdb」をリストする XML ドキュメントがあります。ここのノードは次のパターンに従います。

<movie>
  <title>Pirates of the Carribbean: At World's End</title>
  <year>2007</year>
  <directors>
    <director>Gore Verbinski</director>
  </directors>
  <actors>
    <actor>Johnny Depp</actor>
     ......
    </actors>
</movie>

この例では、ジョニー・デップが出演するすべての映画で、同じ年に公開された同じ映画の別の映画を検索したいと考えています。私の出力では、これを年ごとに並べ替えています。そのため、ジョニー・デップの映画が 2 つ以上ある年ごとに、それらの映画とともにその年を出力したいと考えています。

これまでの XSLT for-each select は次のようになります。 <xsl:for-each select="/imdb/movie[contains(actors/actor/text(), 'Johnny Depp')][year = following-sibling::movie/year]">

しかし、それはジョニー・デップが出演したすべての映画を出力しているようです。ここで何が間違っているのでしょうか?

4

2 に答える 2

1

現在のクエリは、2 つの述語を満たすすべての映画を返します

  1. このmovie要素には、actor文字列値に「Johnny Depp」が含まれる要素が含まれています。
  2. このmovie要素には、同じ年を持つ次の兄弟要素があります。

つまり、特定の年に作成されたドキュメント内の最後の映画ではないすべてのジョニー デップ映画に一致します。following-sibling軸は、ソートされたリスト内movieの他の要素ではなく、入力内の特定の要素の兄弟を識別します。movie

を読んでくださいxsl:for-each-group

于 2013-05-08T19:09:41.027 に答える
1

ジョニー・デップの映画が 2 本以上ある年については、その年をそれらの映画と一緒に出力したいと考えています。

それは

<xsl:for-each-group select="movie" group-by="year">
  <xsl:variable name="depp-movies" 
                select="current-group()[actors/actor='johnny depp']"/>
  <xsl:if test="count($depp-movies) gt 2">
    <year year="{current-grouping-key()}">
      <xsl:copy-of select="current-group()"/>
    </
  </
</
于 2013-05-08T19:08:20.513 に答える