На некотором уровне вы ДОЛЖНЫ изменить существующую схему, потому что вы пытаетесь создать экземпляр документа, который нарушает одно из его ограничений.
Если исходная схема определяет структуру с использованием именованного сложного типа, то вы можете изменить существующую схему без текстового изменения текста документа схемы, используя один из двух механизмов: xs:redefines
или определив новый сложный тип, используя «вывод по расширению». Оба из них изменяют схему без изменения документа схемы: так что это немного зависит от того, что вы подразумеваете под вашим требованием не изменять схему. Обратите внимание, что если вы используете «деривацию по расширению», то ваш экземпляр должен будет указать, что он использует расширение, включив атрибут xsi:type
, который называет расширенный сложный тип.
Если ваша забота об изменении схемы связана с разветвлением определения источника XSD, тогда другой способ определить вашу измененную схему - это преобразование XSLT, примененное к оригиналу. На самом деле это очень похоже на xs: redefines, за исключением того, что вы можете вносить любые изменения, которые вам нравятся, тогда как xs: redefined ограничивает то, что вы можете изменить.
С другой стороны, если вы заботитесь о том, чтобы документы, соответствующие новой схеме, по-прежнему были совместимы с приложениями, использующими старую схему, то все эти механизмы не работают: во всех случаях вы создаете документы, которые не соответствуют к существующей схеме, что может привести к поломке приложений, которые полагаются на документы, действительные по этой схеме.