Я пытаюсь написать условие, которое применяется, если элемент содержит все атрибуты в предопределенном списке, но я не могу понять правильный XPath.
Пример данных:
let $element := <country type = "" class = "" ref = "" ana = ""/>
return
if ($element/@*[local-name() = ('type', 'class', 'ref', 'ana')]) then
'All attributes are present'
else 'You can add attributes'
Первое условие возвращает true, если присутствует какой-либо из атрибутов, я не уверен, что такое правильный XPath, чтобы убедиться, что они все присутствуют.
Спасибо, Вайнона
Мне нужно сопоставить имена атрибутов со списком.
Я не знаю, какой язык вы используете, но вы можете проверить связанный ответ, где предикат xpath динамически создается по списку. В общем, ваш код показывает жестко закодированный встроенный список, просто перепишите, как показано в предыдущем комментарии,
Что бы я сделал, используя регулярное выражение fn:matches():
let $element := <country type = "" class = "" ref = "" ana = ""/>
return
if ($element/@*[matches(local-name(), 'type=.*\sclass=.*\sref=.*\sana=')]) then
'All attributes are present'
else 'You can add attributes'
Возможно, попробуйте использовать количественное выражение ...
let $element := <country type = "" value = "" ref = "" ana = ""/>
return
if (every $attr in ('ana','ref','type','value') satisfies $element[@*[local-name()=$attr]]) then
'All attributes are present'
else
'You can add attributes'
Если бы это был буквальный список, я бы просто использовал and
:
if ($element[@type and @class and @ref and @ana]) ...
Если список не известен статически, вы можете использовать every
if (every $name in $list satisfies exists($element/@*[local-name()=$name])) ...
или более кратко (но менее читаемо)
if ($list[not(. = $element/@*/local-name())]) ...
Другой вариант:
if (count($element/@*[local-name()=$list]) = count($list)) ...
Спасибо, Майкл! Я использовал второй вариант, и он работает именно так, как нужно.
Просто используйте count(//element[@type and @class and @ref и @ana]) > 1