У меня есть следующая структура XML:
<Books>
<Book>
<ItemReference>
<ClassificationCode listID="Name">Book1</ClassificationCode>
<ClassificationCode listID="Property2"/>
<ClassificationCode listID="Property3"/>
</ItemReference>
</Book>
<Book>
<ItemReference>
<ClassificationCode listID="Name">Book2</ClassificationCode>
<ClassificationCode listID="Property2"/>
<ClassificationCode listID="Property3"/>
</ItemReference>
</Book>
<Book>
<ItemReference>
<ClassificationCode listID="Name">Book1</ClassificationCode>
<ClassificationCode listID="Property2"/>
<ClassificationCode listID="Property3"/>
</ItemReference>
</Book>
<Book>
<ItemReference>
<ClassificationCode listID="Name">Book4</ClassificationCode>
<ClassificationCode listID="Property2"/>
<ClassificationCode listID="Property3"/>
</ItemReference>
</Book>
</Books>
Как правильно сформировать цикл for с использованием XQuery, чтобы создать правило проверки, возвращающее в виде журнала ошибку проверки при обнаружении дубликатов в ClassificationCode[@listID = 'Name']/text()
, где /text() = ('Book1', 'Book4')
? Это означает, что я не хочу использовать ту же проверку для Book2. Моя проблема в том, что я забочусь о конкретных предметах, если они будут двойными или нет. Чтобы дать более подробную информацию, мой Validation XQuery выглядит следующим образом:
declare function local:BooksValidation (
$books as element()*,
{
for $book in $books
let $ItemRef := $book/ItemReference
return (
if (fn:exists($ItemRef)) then ()
else
local:Issue($error, "No Items found", $currentPath)
)
}
declare function local:Issue (
$errorCode as xs:string,
$message as xs:string,
$xpath as xs:string) as xs:string*
{
concat($errorCode, ': ', $message, ' (XPath : ', $xpath, ')')
};
и я хочу включить в этот цикл for точно такой же оператор if, который проверит, есть ли двойные элементы