Xquery не возвращает желаемые значения
Я пытаюсь вернуть определенный набор значений, однако запрос не совсем возвращает то, что я хотел бы. Я хотел бы вернуть записи автора "Hennie J. Steenhagen", сгруппированные по годам. Однако, что он возвращает, так это записи, сгруппированные по годам, если они того же года, что и одна из записей Hennies. Не только Хенни.
Например, если у нас есть запись <www><author>Hennie*</author><year>1990</year></www>
а также <www><author>Derpie</author><year>1990></year></www>
запрос вернет обе записи, сгруппированные в 1990 году, мне бы хотелось, чтобы Хенни вернулась.
for $y in /*/*/year where $y/../author ="Hennie J. Steenhagen" return <year-Pub>{$y}{/*/*[year = $y]}</year-Pub>
2 ответа
Ваш вопрос довольно сложен для понимания, потому что ваш XPath обращается к большему дереву узлов XML, чем приведенный вами пример XML. Однако для примера я предполагаю, что ваши записи названы record
, Кроме того, ваш вывод вашей XPath не имеет большого смысла для меня, но я предполагаю, что вы знаете, что вы хотите!
Учитывая XML:
<record>
<www>
<author>Hennie J. Steenhagen</author>
<year>1990</year>
</www>
and
<www>
<author>Derpie</author>
<year>1990></year>
</www>
</record>
Если у вас есть процессор XQuery 3.0, вы можете использовать следующее:
/record/www[author = "Hennie J. Steenhagen"] ! <year-Pub>{year}{.}</year-Pub>
Если у вас есть доступ только к процессору XQuery 1.0, вы можете вернуться к следующему:
for $w in /record/www[author = "Hennie J. Steenhagen"]
return
<year-Pub>{$w/year}{$w}</year-Pub>
В обоих моих примерах используется только один предикат, который фильтрует данные только один раз. В то время как ваше самостоятельное решение использует как предикат, так и where
выражение, и поэтому должен фильтровать данные дважды.
Починил это,
for $y in /*/*/year where $y/../author ="Hennie J. Steenhagen" and /*/*[year=$y] return <year-Pub>{$y/../*}</year-Pub>
Спасибо всем, кто проводит время в поисках.