XML-схема - ограничить внешний вид элементов - PullRequest
2 голосов
/ 12 ноября 2011

У меня есть несколько файлов XML-дескрипторов в моем реальном проекте, и у меня возникают проблемы с созданием соответствующих XSD.

У меня есть свои пользовательские типы в XML, например:

<A>
  <B>
    ...
  </B>
</A>

Мне нужно создать шаблонные блоки в моем XML-файле. Эти блоки могут содержать любые элементы моих пользовательских типов. Однако существует небольшая разница между элементом в шаблонах и элементами в другом месте: они могут иметь элемент Parameter

<Template>
  <Parameter />
  <A>
    <Parameter />
    <B>
      <Parameter />
      ...
    </B>
  </A>
</Template>

Насколько я знаю, невозможно объявить, что элемент <Parameter> может появляться где угодно внутри <Template> (включая дочерние узлы). Но я могу сделать это, определив <Parameter> как элемент всех моих определений типов.

Однако я хочу ограничить <Parameter>, чтобы он мог появляться только тогда, когда его родитель находится внутри элемента <Template>. Можно ли поместить <Parameter> в определение типа, но ограничить его внешний вид, если его родитель находится в области действия тега <Template>?

Как мне написать это в XSD?

1 Ответ

0 голосов
/ 14 ноября 2011

После расследования я не верю, что это возможно. Есть ряд важных вопросов по SO, которые относятся к этому, и общий совет заключается в том, что элементы XSD не могут зависеть от других элементов XSD.

Вместо этого вам может потребоваться рассмотреть некоторые альтернативные подходы или обходные пути.

Не зная ваших требований, сложно подумать, что еще может сработать для вас, но, возможно, вы могли бы связать Template и Parameter более тесно вместе и менее тесно с другими элементами. Например, Template может иметь Parameter, другой Template и элемент (A, B и т. Д.):

Определите Template следующим образом:

<Template>
    <xsd:Sequence>
        <Parameter />
        <xsd:ComplexType />
        <Template />
    </xsd:Sequence>
</Template>

И тогда каждый элемент не нуждается в модификации, но вместо этого тип Template хранит структуру.

<Template>
    <Parameter />
    <A>
    <Template>
        <Parameter />
        <B>
        <Template>
            <Parameter />
            < .. anything else .. />
        </Template>
    </Template>
</Template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...