簡體   English   中英

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

[英]XPath 2 / XSLT : Find sibling nodes of a set with matching values of child node

我無法在任何地方找到這個問題,我一直在努力解決這個問題。 我希望能夠使用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]">

但這似乎只是輸出約翰尼·德普所經歷過的每一部電影。我在這里做錯了什么?

對於每年與約翰尼德普有超過兩部電影的年份,我想和那些電影一起輸出那一年。

那是

<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. movie元素包含一個actor元素,其字符串值包含'Johnny Depp'。
  2. movie元素具有同一年的以下兄弟元素。

也就是說,它匹配每個Johnny Depp電影,這部電影不是給定年份中制作的文檔中的最后一部電影。 following-sibling軸將識別輸入中給定movie元素的兄弟節點,而不是排序列表中的其他movie元素。

您應該閱讀xsl:for-each-group

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM