【问题标题】:Unique Particle Attribution violation with choice and group具有选择和组的独特粒子属性违规
【发布时间】:2018-03-26 21:53:50
【问题描述】:

我有以下 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>

我的目标是根据消息结构强制操作元素具有固定值,但我得到了一个独特的粒子属性。我完全理解操作标签中的歧义,但同时我无法找到一种方法来强制我的结构限制。由于操作标签具有不同的固定值,因此我希望验证不会失败,因此应该加以区分。

【问题讨论】:

    标签: xml validation xsd choice


    【解决方案1】:

    元素消歧仅考虑元素名称和命名空间。因此,就 XSD 验证而言,您选择的两个组重叠(参见https://www.w3.org/TR/xmlschema-1/#non-ambig)。

    因此,一种解决方案是为您的操作指定不同的元素名称(&lt;fooOperation/&gt;&lt;loginOperation/&gt;,而不是 &lt;operation&gt;foo&lt;/operation&gt;&lt;operation&gt;login&lt;/operation&gt;)。

    另一个解决方案,至少根据您目前的结构,将更改组中的元素顺序,将您的区别元素(foo,login)放在第一位,然后将操作元素移到后面(或使其成为一个属性)。

    第三,如果你想坚持完全相同的语法,你必须把操作元素放在组之外和选择之前。但是,您需要一些语义约束,这需要断言(XML Schema 1.1)或 Schematron,以便连接正确的组和操作值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多