Выберите отдельные значения в соответствии с дочерним узлом в XQuery

Допустим, у меня есть следующий XML:

<info>
    <channel>
        <A>
          <X>
            <title>title1</title>
          </X>
          <Y value="20"/>
        </A>
    </channel>
    <channel>
        <A>
          <X>
            <title>title1</title>
          </X>
          <Y value="20"/>
        </A>
        <A>
          <X>
            <title>title2</title>
          </X>
          <Y value="20"/>
        </A>
    </channel>
</info>

и следующий XQuery

{
for $A in doc('test.xml')//A
let $TITLE := $A/X/title
where string($A/Y/value) > 20
return
  string($TITLE)
}

это, конечно, выводит:

title1
title1
title2

Как я могу использовать distinct-values для удаления дубликатов? Интересно, потому что for, по сути, дает мне только один элемент за итерацию, и я не могу вызвать distinct-values на $A. Или есть другой способ удалить повторяющийся вывод?

Проблема в том, что мне нужно обратиться к другому узлу, поэтому в основном вызов distinct-values(doc...) не работает, так как он не возвращает узлы.


person slhck    schedule 12.03.2011    source источник


Ответы (1)


ОБНОВЛЕНИЕ

чтобы отфильтровать повторяющиеся узлы, используйте вариант xpath из этот ответ:

//A[index-of(//A/X/title, X/title)[1]]

это дает вам все A с разными title.

вы можете расширить это выражение xpath, чтобы также фильтровать по Y — нет необходимости в XQuery FLWOR .

ОБНОВИТЬ КОНЕЦ

примените distinct-values к выражению xpath, по которому вы хотите выполнить итерацию:

for $title in distinct-values(doc('test.xml')//A/X/@title)
return string($title)

или просто

distinct-values(doc('test.xml')//A/X/@title)
person ax.    schedule 12.03.2011
comment
Это действительно не сработало. Он выбирает некоторые узлы, но я не могу понять, какие именно. Дубликатов нет, но некоторые отсутствуют полностью. Я снова обновил свой вопрос. - person slhck; 14.03.2011
comment
Хорошо, кажется, что это не работает, когда элемент A не является корнем! - person slhck; 14.03.2011
comment
Разобрался. Возможно, вы захотите обновить свой ответ, чтобы отразить эти изменения, но, в конце концов, сначала нужно перебрать элементы channel, а затем изменить вашу строку: for $A in $CHANNEL/A[index-of(//$CHANNEL/A/X/title, X/title)[1]] - person slhck; 14.03.2011