Сложные проверки типов в XQuery - PullRequest
2 голосов
/ 21 марта 2019

У меня есть схема, которая имеет много complexType, некоторые из которых имеют подтипы (через xsi:type). Мне нужно создать выражение XQuery, которое проверяет, что элемент (MyPath) является членом родительского типа, но не других, я безуспешно пробовал выражение в приведенной ниже форме.

/MyPath[element(*,ParentClass) and not element(*,ChildClass)]

Похоже, element применяется ко всем дочерним элементам в контексте, который он называется, но не к самому себе (MyPath), что не дает результатов.

Я также попробовал оператор instance of, но, похоже, он работает только для simpleType.

1 Ответ

1 голос
/ 21 марта 2019

Вы должны использовать

. instance of element(*, ParentClass) 
and not(. instance of element(*, ChildClass))

Если это не работает, пожалуйста, предоставьте MCVE

Альтернативой, использующей функции расширения Saxon, является проверка типапрямая аннотация: saxon:type-annotation(.) eq xs:QName('ParentClass')

Конечно, есть вопрос о том, является ли это хорошей практикой.Весь смысл определения производного типа заключается в том, что он должен заменять базовый тип;везде, где вы можете использовать экземпляр родительского типа, вы должны иметь возможность заменить экземпляр дочернего типа.Вы, кажется, намеренно пытаетесь придумать запрос, в котором это не так.

...