XPath 2 / XSLT:查找具有匹配的子节点值的集合的兄弟节点

时间:2013-05-08 17:07:29

标签: xml xslt xpath-2.0

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

例如,我有一个列出电影的XML文档'imdb'。这里的节点遵循以下模式:

<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>

在这个例子中,我想找到所有以Johnny Depp为特色的电影,这部电影与同一部电影同年出现。在我的输出中,我正在按年分类 - 因此,对于每年与约翰尼德普有超过两部电影,我想在那一年和那些电影一起输出。

到目前为止,我的每个选择的XSLT看起来像这样: <xsl:for-each select="/imdb/movie[contains(actors/actor/text(), 'Johnny Depp')][year = following-sibling::movie/year]">

但这似乎只是输出了Johnny Depp所经历过的每部电影。我在这里做错了什么?

2 个答案:

答案 0 :(得分: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()"/>
    </
  </
</

答案 1 :(得分:1)

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

  1. movie元素包含actor元素,其字符串值包含“Johnny Depp”。
  2. movie元素具有同一年的以下兄弟元素。
  3. 也就是说,它匹配每个Johnny Depp电影,这部电影不是给定年份中制作的文档中的最后一部电影。 following-sibling轴将标识输入中给定movie元素的兄弟节点,而不是排序列表中的其他movie元素。

    您应该阅读xsl:for-each-group