powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите написать схему для такого типа
3 сообщений из 3, страница 1 из 1
Помогите написать схему для такого типа
    #39025167
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Имеется такая XMLка (в двух вариантах, оба должны проходить):

Код: xml
1.
2.
3.
4.
5.
<root>
  <node1_1></node1_1>
  <node2></node2>
  <node3></node3>
</root>



Код: xml
1.
2.
3.
4.
5.
<root>
  <node1_2></node1_2>
  <node2></node2>
  <node3></node3>
</root>



Две XML отличаются лишь одним тэгом.

Как это описать в рамках XSD ? Мне видится, что тут нужен xs:choise + xs:all. Однако, xs:complexType может иметь лишь 1 вложенный тэг из набора All/choise/sequence.

При это очень не хотелось бы появления лишнего уровня вложенности:

Код: xml
1.
2.
3.
4.
5.
6.
7.
<root>
  <node1_2></node1_2>
  <subnodes>
    <node2></node2>
    <node3></node3>
  </subnodes>
</root>



Я вижу такое решение, но оно мне не нравится дублированием:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
	<xs:element name="root">
		<xs:complexType>
			<xs:choice>
				<xs:element name="root" type ="tns:node1_1Type" maxOccurs="1"/>
				<xs:element name="root" type ="tns:node1_2Type" maxOccurs="1"/>
			</xs:choice>
		</xs:complexType>		
	</xs:element>	
	
	<xs:complexType name="node1_1Type">
		<xs:sequence>			
		    <!-- Уникальный тэг -->
			<xs:element name="node1_1" type="tns:guid" minOccurs="1" maxOccurs="1" />			
			<!-- Дублирующаяся часть -->
			<xs:element name="node2" type="tns:guid" minOccurs="1" maxOccurs="1" />			
			<xs:element name="node3" type="tns:guid" minOccurs="1" maxOccurs="1" />						
		</xs:sequence>
	</xs:complexType>	
	
	
	<xs:complexType name="node1_2Type">
		<xs:sequence>			
		    <!-- Уникальный тэг -->
			<xs:element name="node1_2" type="tns:guid" minOccurs="1" maxOccurs="1" />
			<!-- Дублирующаяся часть -->
			<xs:element name="node2" type="tns:guid" minOccurs="1" maxOccurs="1" />
			<xs:element name="node3" type="tns:guid" minOccurs="1" maxOccurs="1" />
		</xs:sequence>
	</xs:complexType>		



В принципе эту проблему можно обойти, вынеся общие элементы в xs:group. В принципе в итоге я наверное получу то, что мне нужно.

Есть ли другой путь ? Может я что-то упустил и есть другое, более простое решение.
...
Рейтинг: 0 / 0
Помогите написать схему для такого типа
    #39025249
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<xs:element name="root">
  <xs:complexType>
    <xs:sequence>
      <xs:choice>
        <xs:element name="node1_1" />
        <xs:element name="node1_2" />
      </xs:choice>
      <xs:element name="node2" />
      <xs:element name="node3" />
    </xs:sequence>
  </xs:complexType>
</xs:element>


Не?
...
Рейтинг: 0 / 0
Помогите написать схему для такого типа
    #39025260
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvik,

Точно же, Кажется оно !
Я уцепился, что ComplexType может иметь лишь одну вложенную сущность.

Действительно из описания sequence следует, что она может быть рекурсивной. Я больше смотрел на пример использования, и читал спецификацию ComplexType. А надо было еще и xs:sequence проверить.

Хотя более интересный мне xs:all не обладает такой способностью. Жаль. xs:sequence же накладывает строгое требования порядка следования? Это мне не нравится, но пусть хотя бы так.

Спасибо.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите написать схему для такого типа
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]