Выберите различные значения в соответствии с дочерним узлом в XQuery - PullRequest
5 голосов
/ 12 марта 2011

Допустим, у меня есть следующий 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...) не работает, так как он не возвращает узлы.

1 Ответ

5 голосов
/ 12 марта 2011

UPDATE

чтобы отфильтровать дубликаты узлов , используйте вариацию 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)
...