基于属性值的条件(XML Schema) [英] Condition based on attribute value (XML Schema)
本文介绍了基于属性值的条件(XML Schema)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
是否可以在 XML Schema 中定义基于属性值的条件?例如,当 test@attrib="one"
时,我希望 one-element
被允许和强制,或者当 test@attrib="two"
,我希望 two-element
被允许和强制.
Is it possible to define in XML Schema an condition based on attribute value? For example, when test@attrib="one"
, I want one-element
to be allowed and mandatory or when test@attrib="two"
, I want two-element
to be allowed and mandatory.
例如,有效的文件是:
<root>
<test attrib="one"/>
<some-element-1/>
<some-element-2/>
...
<some-element-n/>
<one-element>
</one-element>
</root>
或
<root>
<test attrib="two"/>
<some-element-1/>
<some-element-2/>
...
<some-element-n/>
<two-element>
</two-element>
</root>
错误的文件:
<root>
<test attrib="one"/>
<some-element-1/>
<some-element-2/>
...
<some-element-n/>
</root>
或
<root>
<test attrib="two"/>
<some-element-1/>
<some-element-2/>
...
<some-element-n/>
<one-element>
</one-element>
</root>
在 XSD 中可以吗?
Is it possible in XSD?
推荐答案
不在同一类型内.您需要为每个不同的选项定义不同的类型.
Not within the same type. You would need to define a different type for each of the different options.
更新
要在您的架构中重用类型定义:
To re-use type definitions in your schema:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://My.Schema.Namespace"
targetNamespace="http://My.Schema.Namespace">
<xs:element name="root">
<xs:complexType>
<xs:choice>
<xs:element name="test1" type="test1Type" />
<xs:element name="test2" type="test2Type" />
</xs:choice>
</xs:complexType>
</xs:element>
<!-- define the two root types -->
<xs:complexType name="test1Type">
<xs:all>
<xs:element name="some-element-1" type="some-element-1Type" />
<xs:element name="some-element-2" type="some-element-2Type" />
<xs:element name="some-element-3" type="some-element-3Type" />
<xs:element name="one-element" type="one-elementType" />
</xs:all>
<xs:attribute name="attrib" type="xs:string" fixed="one" />
</xs:complexType>
<xs:complexType name="test2Type">
<xs:all>
<xs:element name="some-element-1" type="some-element-1Type" />
<xs:element name="some-element-2" type="some-element-2Type" />
<xs:element name="some-element-3" type="some-element-3Type" />
<xs:element name="two-element" type="two-elementType" />
</xs:all>
<xs:attribute name="attrib" type="xs:string" fixed="two" />
</xs:complexType>
<!-- Define re-usable types-->
<xs:complexType mixed="true" name="some-element-1Type"/>
<xs:complexType mixed="true" name="some-element-2Type"/>
<xs:complexType mixed="true" name="some-element-3Type"/>
<xs:complexType mixed="true" name="one-elementType"/>
<xs:complexType mixed="true" name="two-elementType"/>
</xs:schema>
这将验证:
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns="http://My.Schema.Namespace">
<test1 attrib="one">
<some-element-1>sadas</some-element-1>
<some-element-2>sadas</some-element-2>
<some-element-3>sadas</some-element-3>
<one-element>sadas</one-element>
</test1>
</root>
和
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns="http://My.Schema.Namespace">
<test2 attrib="two">
<some-element-1>sadas</some-element-1>
<some-element-2>sadas</some-element-2>
<some-element-3>sadas</some-element-3>
<two-element>sadas</two-element>
</test2>
</root>
这篇关于基于属性值的条件(XML Schema)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文