0

我在任何地方都找不到这个问题的特别答案,我一直在努力解决这个问题。我希望能够使用 XPath 选择集合中具有子节点值 A 的所有节点,其中存在具有相同子节点值 A 的集合中的另一个节点,并将它们配对在一起。

例如,我有一个列出电影“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>

在这个例子中,我想找出所有以约翰尼·德普为主角的电影,这些电影与另一部电影在同一年上映。在我的输出中,我按年份排序 - 因此,对于与约翰尼·德普合作的电影超过两部的每一年,我想将那一年与这些电影一起输出。

到目前为止,我的 XSLT for-each 选择如下所示: <xsl:for-each select="/imdb/movie[contains(actors/actor/text(), 'Johnny Depp')][year = following-sibling::movie/year]">

但这似乎只是输出约翰尼德普出演的每一部电影。我在这里做错了什么?

4

2 回答 2

1

对于与约翰尼·德普合作的电影超过两部的每一年,我想将那一年与这些电影一起输出。

那是

<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 回答
1

您当前的查询返回满足两个谓词的每部电影

  1. movie元素包含一个actor字符串值包含“Johnny Depp”的元素。
  2. movie元素具有以下同级元素。

也就是说,它匹配每一部约翰尼·德普 (Johnny Depp) 的电影,该电影不是给定年份制作的文档中的最后一部电影。该following-sibling轴将识别movie输入中给定元素的兄弟姐妹,而不是排序列表中的其他movie元素。

你应该继续阅读xsl:for-each-group

于 2013-05-08T19:09:41.027 回答