Xml 为什么必须为导入的XSD中的属性添加前缀?

Xml 为什么必须为导入的XSD中的属性添加前缀?,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,我有以下两个xsd,test.xsd <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" xmlns:ns1="http://www.test.com/ns1" targetNamespace="http://www.test.

我有以下两个xsd,test.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"    
  xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" 
  xmlns:ns1="http://www.test.com/ns1"     
  targetNamespace="http://www.test.com" 
  elementFormDefault="qualified"
  attributeFormDefault="unqualified">
    <import namespace="http://www.test.com/ns1" schemaLocation="test1.xsd"/>
    <element name="Root">
        <complexType>
            <sequence>
                <element name="Child" type="string"/>
            </sequence>
            <attribute ref="ns1:myAttrib1" use="required"/>
            <attribute ref="ns1:myAttrib2" use="required"/>
        </complexType>
    </element>
</schema>


. 另一个有趣的来源是。因此,这确实支持了公认的答案。然而,我还没有看到W3C rec(以神秘著称)详细提到这一点的确切位置。毕竟,他们是这个问题的管理机构。

模式中的顶级元素和属性声明始终位于模式的targetNamespace中。
elementFormDefault
attributeFormDefault
仅适用于嵌套在复杂类型中的匿名元素/属性声明。如果您的
test.xsd
架构没有指定
elementFormDefault=“qualified”
,那么复杂类型中的
子元素将不在名称空间中,实例文档需要如下所示

<?xml version="1.0" encoding="UTF-8"?>
<ns:Root xmlns:ns="http://www.test.com" xmlns:ns1="http://www.test.com/ns1" 
  ns1:myAttrib1="1" ns1:myAttrib2="2">
    <Child>Child 1</Child>
</Root>
无效-myAttrib1和myAttrib2不在命名空间中。

1)正确。但是,
attributeFormDefault
elementFormDefault
仅适用于本地定义的属性和元素。换句话说,那些不是模式的直接子元素的元素将重新定义,嵌套在其他模式组件中

2) .2显示ref必须是QName。通常,在XSD中的任何地方都可以看到ref属性,它将是QName类型

谢谢伊恩,我重新编辑了我的问题(诚然措辞很糟糕)。关于targetNamespace的部分。重新。对于elementFormDefault=“unqualified”,我之前的印象是,控制这种行为的是默认名称空间的使用。谢谢你让我关注这个机制+1.
<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.test.com" xmlns:ns1="http://www.test.com/ns1" 
  ns1:myAttrib1="1" ns1:myAttrib2="2">
    <Child>Child 1</Child>
</Root>
<?xml version="1.0" encoding="UTF-8"?>
<ns:Root xmlns:ns="http://www.test.com" xmlns:ns1="http://www.test.com/ns1" 
  ns1:myAttrib1="1" ns1:myAttrib2="2">
    <Child>Child 1</Child>
</Root>
<?xml version="1.0" encoding="UTF-8"?>
<ns:Root xmlns="http://www.test.com/nl1" xmlns:ns="http://www.test.com" 
  myAttrib1="1" myAttrib2="2">
    <ns:Child>Child 1</ns:Child>
</ns:Root>