2015-05-11 3 views
2

Я пытаюсь придумать XSD для этого вида XML:XSD: выбор, основанный на состоянии элемента

<root> 
    <valid> 
    <a>1</a> 
    <b>foo</b> 
    <c>bar</c> 
    </valid> 
    <valid> 
    <a>2</a> 
    <c>bar</c> 
    <d1>baz</d1> 
    </valid> 
    <valid> 
    <a>3</a> 
    <c>bar</c> 
    <d2>baz-restricted</d2> 
    <e>qux</e> 
    </valid> 
</root> 

Во всех элементах названных valid, каждый ребенок-элемент является обязательным.

Я знаю, что мне нужно сделать xs:choice условным значением a, так как ниже XSD является двусмысленным при втором появлении c.

Как это можно сделать в XSD, поддерживаемом .NET 4.x?

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="valid"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="a" minOccurs="1" maxOccurs="1"/> 
       <xs:choice> 
       <xs:sequence> 
        <xs:element name="b" minOccurs="1" maxOccurs="1"/> 
        <xs:element name="c" minOccurs="1" maxOccurs="1"/> 
       </xs:sequence> 
       <xs:sequence> 
        <xs:element name="c" minOccurs="1" maxOccurs="1"/> 
        <xs:element name="d1" minOccurs="1" maxOccurs="1"/> 
       </xs:sequence> 
       <xs:sequence> 
        <xs:element name="c" minOccurs="1" maxOccurs="1"/> 
        <xs:element name="d2" minOccurs="1" maxOccurs="1"/> 
        <xs:element name="e" minOccurs="1" maxOccurs="1"/> 
       </xs:sequence> 
       </xs:choice> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

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

ответ

2

Во всех элементах с именем valid каждый дочерний элемент является обязательным.

В XSD 1.0 вы не можете иметь одноименные элементы родства, имеющие разные типы.

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

Как это может быть сделано в XSD поддерживается .NET 4.x

.. .Microsoft не поддерживает XSD 1.1. Вместо этого вы можете использовать Saxon для .NET.

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

+0

Спасибо. Что делать, если мы можем переключиться на Saxon для .NET? Будет ли решение XSD 1.1 стать беспорядком? –

+1

Нет, Saxon позволит использовать XSD 1.1, который более выразителен, чем XSD 1.0; см. 'xs: assertion' и присвоение условного типа (' xs: alternative'). Однако, если все еще возможно, подумайте о переименовании разных «действительных» элементов и избегайте необходимости в усовершенствованных средствах XSD 1.1; это не для того, чтобы избежать «беспорядка», а скорее для того, чтобы следовать общей практике наименования имен XML, в которой разные элементы называются по-разному. – kjhughes

+1

«Лучшая практика» - это то слово, которое я искал. Благодарю. Я полностью переработал XSD сейчас, поскольку сторона, которая его доставила, была в порядке с редизайном, тогда как я думал, что существующая база дизайна была исправлена. –

Смежные вопросы