1

目标:

元素octave可以有子节点查询命名空间http://www.website.com/main中任何子节点。

我不知道这在哪里/如何违反了独特的粒子属性……没有其他元素称为八度音阶或称为查询的子节点。查询不是全局元素,它仅用于八度。

错误:

"cos-nonambig: " http://www.website.com/main ":query 和 WC[" http://www.website.com/main "] (或它们的替换组中的元素)违反了“唯一粒子属性” “。在针对此模式进行验证期间,将为这两个粒子创建歧义。”

架构:

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema
    xmlns="http://www.website.com/main"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.website.com/main" 
    attributeFormDefault="unqualified" elementFormDefault="qualified"
    >

<xs:complexType name="octave" >
    <xs:choice>
        <xs:element name="query" type="xs:string" />
        <xs:any minOccurs="0" maxOccurs="unbounded" namespace="http://www.website.com/main" processContents="strict" />
    </xs:choice>
    <xs:attribute name="id" type="xs:string" use="optional" />
</xs:complexType>

<xs:element name="octave" type="octave" />

4

2 回答 2

2

您描述的行为可以通过以这种方式声明“八度”来获得:

<xs:complexType name="octave" >
  <xs:choice>
    <xs:any minOccurs="0" 
            maxOccurs="unbounded" 
            namespace="http://www.website.com/main" 
            processContents="strict" />
  </xs:choice>
  <xs:attribute name="id" 
                type="xs:string" 
                use="optional" />
</xs:complexType>

并将查询声明为全局元素:

<xs:element name="query" type="xs:string" />

由于您定义的查询元素在 namespace 中http://www.website.com/main,它被通配符接受,并且从 'octave' 类型的角度来看,没有迫切需要在选择中包含对它的元素引用。

这种设计确实有一个缺点,就是让所有现有通配符都可以访问“查询”,这些通配符与 namespace 中的任意元素匹配http://www.website.com/main。如果 'query' 应该仅作为元素 'octave' 和其他相同类型元素的子元素出现非常重要,那么您可以考虑使本地 'query' 元素不合格:

<xs:complexType name="octave" >
  <xs:choice>
    <xs:element name="query" 
                type="xs:string" 
                form="unqualified"/>
    <xs:any minOccurs="0" 
            maxOccurs="unbounded" 
            namespace="http://www.website.com/main" 
            processContents="strict" />
  </xs:choice>
  <xs:attribute name="id" 
                type="xs:string" 
                use="optional" />
</xs:complexType>

由于“查询”的声明不再生成扩展名称在“主”命名空间中的元素声明,因此它不再与通配符竞争。

您也可以迁移到 XSD 1.1,它通过说元素声明和引用优先于通配符匹配,从而放宽了“唯一粒子属性”规则,从而使您现有的声明合法。

于 2013-07-23T01:08:47.900 回答
1

我认为问题在于:您定义targetNamespace="http://www.website.com/main". 然后用于<xs:any... 声明此命名空间中可以有任何内容。但是在这个命名空间中也是query元素,因此它可能存在于那里,因为直接声明 using<xs:element也因为“间接”声明 using <xs:any

可能对于解析器来说,就像你声明这样的东西一样:

<xs:complexType name="a">
    <xs:choice>
        <xs:element name="b" type="xs:string" />
        <xs:element name="b" type="xs:string" />
    </xs:choice>
</xs:complexType>

这显然是一个错误。

于 2013-07-11T14:55:30.553 回答