2015-02-08 5 views
2

из следующего XML Я хочу, чтобы получить п-й продукт, отсортированный по их @name:XQUERY получает второй продукт, отсортированный по имени

<products> 
<product name='200'>...</product> 
<product name='100'>...</product> 
<product name='111'>...</product> 
<product name='100'>...</product> 
<product name='110'>...</product> 
</products> 

Я попытался (чтобы получить первый, но должен быть также работать, чтобы получить третий и т. д.):

for $d in //products/product/[1] 
order by $d/@name 
return $d 

Я не получаю правильный заказ. Только если я удалю [1], он работает, но затем я получаю список продуктов с отверстиями.

Как сделать предел здесь?

ответ

2

Вы ограничиваете себя в неправильном положении (кроме / до того, как предикат [1] является синтаксической ошибкой).

Прямо сейчас, вы ограничиваете в спецификации for передачи контура в вход, таким образом, вы сортировкой над один, а именно первым продукт - который, очевидно, не то, что вы пытаетесь достичь (не и ни кажется разумным делом).

Чтобы ограничить после выполнения цикла (и сортировки), использовать предикат, обернутый вокруг петлю:

(
    for $product in $xml//products/product 
    order by $product/@name 
    return $product 
)[1] 
2

Поместите числовой предикат на выражении в целом:

(
    for $d in //products/product 
    order by $d/@name 
    return $d 
)[1] 

for порождает всю последовательность элементов продукта упорядоченных по имени, то [1] тогда индекс в отсортированной последовательности.

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