我有以下XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/MessageSchema" xmlns="http://www.example.org/MessageSchema"
elementFormDefault="qualified">
<xs:element name="message">
<xs:complexType>
<xs:choice>
<xs:group ref="loginMessage"/>
<xs:group ref="fooMessage"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:group name="loginMessage">
<xs:sequence>
<xs:element name="operation" type="xs:string" minOccurs="1" maxOccurs="1" fixed="Login"/>
<xs:element name="login" type="loginType" />
</xs:sequence>
</xs:group>
<xs:group name="fooMessage">
<xs:sequence>
<xs:element name="operation" type="xs:string" minOccurs="1" maxOccurs="1" fixed="Foo"/>
<xs:element name="foo" type="fooType" />
</xs:sequence>
</xs:group>
<xs:complexType name="loginType">
<xs:sequence>
<xs:element name="token" type="xs:string" />
<xs:element name="nickName" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="fooType">
<xs:sequence>
<xs:element name="bar" type="xs:string" />
<xs:element name="num" type="xs:integer" />
</xs:sequence>
</xs:complexType>
</xs:schema>
我希望能够像以下示例一样使用XML:
<!--Example 1-->
<?xml version="1.0" encoding="UTF-8"?>
<mensaje xmlns="http://www.example.org/MessageSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/MessageSchema MessageSchema.xsd">
<operation>Login</operation>
<login>
<token>asda8987</token>
<nickName>Test</nickName>
</login>
</mensaje>
<!--Example 2-->
<?xml version="1.0" encoding="UTF-8"?>
<mensaje xmlns="http://www.example.org/MessageSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/MessageSchema MessageSchema.xsd">
<operation>Foo</operation>
<foo>
<bar>bar</bar>
<num>100</num>
</foo>
</mensaje>
我的目标是根据消息结构强制操作元素具有固定值,但我得到一个唯一粒子归因。我完全理解操作标签中的歧义但同时我无法找到强制结构限制的方法。我期望验证不会失败,因为操作标签具有不同的固定值,因此应该进行区分。
答案 0 :(得分:0)
元素的消歧只考虑元素名称和名称空间。因此,就XSD验证而言,您选择的两个组重叠(参见https://www.w3.org/TR/xmlschema-1/#non-ambig)。
因此,一种解决方案是为您的操作提供不同的元素名称(<fooOperation/>
和<loginOperation/>
,而不是<operation>foo</operation>
和<operation>login</operation>
。)
至少根据你的结构到目前为止,另一个解决方案是更改组中的元素序列,首先放置区别元素(foo,login)并将操作元素移到后面(或使其成为属性)。
第三,如果你想坚持完全相同的语法,你必须将操作元素放在组之外和选择之前。但是,您需要一些语义约束,这需要断言(XML Schema 1.1)或Schematron,以便连接正确的组和操作值。