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

В этом примере я хотел бы найти все фильмы, которые показывают Джонни Депп, которые вышли в том же году, еще один фильм того же самого. В своем выступлении я сортирую это по годам - ​​так что на каждый год, который имеет более двух фильмов с Джонни Деппом, я хочу вывести этот год вместе с этими фильмами.

Мой 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() ». Я изменил выход с помощью каждого для выбора только определенных бит информации и отсортировал результаты по годам, и все это работает. – Yair

1

Ваш текущий запрос возвращает каждый фильм, который удовлетворяет два предиката

  1. movie элемент содержит actor элемент, значение которого строка включает в себя «Джонни Депп».
  2. Элемент movie имеет следующий элемент родства с тем же годом.

То есть, это соответствует каждому фильму Джонни Деппа, который не является последним фильмом в документе, сделанным в данном году. Ось following-sibling будет идентифицировать братьев и сестер данного элемента movie на входе, а не других movie элементов в отсортированном списке.

Вы должны прочитать на xsl:for-each-group.

 Смежные вопросы

  • Нет связанных вопросов^_^