Я бы сказал, что в этом качестве это невозможно из-за ограничений схемы "уникальная атрибуция частиц" и "объявления элементов согласованы". Практически это означает, что в одном контексте у вас не может быть двух элементов с одинаковыми именами и разными типами. Если это разрешить, схема станет недетерминированной, и поэтому старый <xs:choice>
не будет работать. Все обходные пути, которые приходят мне в голову, имеют побочные эффекты.
Возможные обходные пути
1) Переименуйте элементы. Например, определите текстовый элемент книги как <book-title>
. Затем вы можете определить различные типы для них и поместить их в <xs:choice>
. Проблема, конечно, в переименовании.
2) Сделайте дочерние элементы необязательными и разрешите <book>
иметь смешанный контент. Таким образом, вы можете иметь как только текст, так и только контент элемента. Проблема заключается в том, что текстовое содержимое будет разрешено также, когда присутствуют дочерние элементы, и этот текст может появляться до, между и после дочерних элементов.
3) Объявите используемый тип в экземпляре документа. Это можно сделать с помощью атрибута xsi:type="..."
. Проблемы заключаются в том, что вам нужно специально упомянуть используемый тип в экземпляре документа (с этим дополнительным атрибутом). Также в схеме это обычно делается путем создания абстрактного типа, а ссылочные типы выводятся путем ограничения этого типа. В вашем случае подходящим типом надмножества для <book>
может быть xs:anyType
, поскольку смешанные типы не могут быть получены из типов, которые не являются смешанными.
4) Использовать другой язык определения структуры, который не требует детерминизма. (RelaxNG может подойти, хотя я не знаком с ним.) Проблема, конечно, заключается в необходимости изучения нового языка и возможном отсутствии поддержки программного обеспечения.