2013-05-08 46 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

相關問題