2013-05-08 85 views
0

我无法找到这个问题,特别是在任何地方都可以找到这个问题,我一直在努力。我希望能够用XPath选择集合中所有具有子节点值A的节点,其中存在具有相同子节点值A的集合中的另一个节点,并将它们组合在一起。XPath 2/XSLT:找到一组具有匹配子节点值的集合的兄弟节点

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

在这个例子中,我想找到同年相继问世为另一部电影相同的其特点约翰尼·德普的所有电影。在我的输出中,我将这个年份排序 - 因此,每年与约翰尼德普有超过两部电影的每一年,我都想输出那一年以及那些电影。

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

,但似乎只输出的每一部电影约翰尼·德普已经在我在做什么错在这里?

回答

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()"/> 
    </ 
    </ 
</ 
+0

谢谢!这是我正在寻找的。在发布这个问题和你的答案之间,我发现了“为每个组提供功能”,但很难让它正常工作。您的示例运行良好,除非由于“copy-of select =”current-group()“'而导致输出所有电影。我使用for-each修改了输出,只选择特定的信息位,并按年份对输出进行排序,并且一切正常。 – Yair 2013-05-08 20:34:54

1

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

  1. movie元素包含actor元素,其字符串值包括“约翰尼·德普”。
  2. movie元素具有同一年的以下兄弟元素。

也就是说,它匹配每个约翰尼德普电影,它不是在给定年份制作的文档中的最后一部电影。 following-sibling轴将标识输入中给定的movie元素的同胞,而不是排序列表中的其他movie元素。

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

相关问题