XSD: сложный тип, который может иметь простой контент или контекст элемента - PullRequest
4 голосов
/ 05 марта 2012

Я пишу XSD для довольно сложного формата файлов XML. Во многих случаях XML может содержать либо фактическое литеральное значение, либо сценарий, выдающий это значение. (Подумайте, Excel: 42 против =21+21)

Например, чтобы указать размер, допустимо написать одно из следующих:

<size>42</size>
<size><script>2*21</script></size>

Моей первой мыслью было использование <choice>, чтобы разрешить либо int, либо скрипт в элементе size. Однако тогда мне нужно будет дать строковому элементу имя, что приведет к неуклюжему синтаксису, например <size><value>42</value></size>. Так как литералы будут использоваться гораздо чаще, чем сценарии, я не хочу раздувать их синтаксис.

Есть идеи, как выразить начальный синтаксис в XSD?

Ответы [ 2 ]

4 голосов
/ 05 марта 2012

Я думаю, что есть два достойных варианта.

  1. Не кладите никаких субэлементов внутрь <size> в любом случае. Вместо этого вы можете установить атрибут type для элемента size, указывая потребителю, является ли он литералом или скриптом.
  2. Использовать один из двух методов, описанных здесь (оба основаны на использовании атрибута mixed = true в complexContent: Схема XML: элемент, который может содержать элементы или текст?

Чтобы выбрать один из этих вариантов, вы поставите себя на место потребительского приложения и решите, как оно, скорее всего, захочет получить эти данные. В общем, я думаю, что первый вариант лучше, если основным потребителем является разработчик, который анализирует XML как одноразовую задачу интеграции (потому что и вывод, и XSD более кратки и, на мой взгляд, более читабельны); Второй вариант, вероятно, будет лучше, если вы видите инструмент XML, потребляющий вашу схему, и, следовательно, может быть проще сделать что-то особенное, если есть конкретные элементы для анализа. В конечном счете, хотя я просто догадываюсь, какой у вас сценарий использования ...

2 голосов
/ 05 марта 2012

В XSD 1.0, если вы не хотите изменять дизайн экземпляра XML, ваш единственный реальный вариант - объявить модель содержимого как смешанное содержимое.

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

...