我目前正在学习XML,并且已经到达了与多个名称空间一起使用的XML Schema的美妙世界。
我的问题是我何时应该而且不必声明名称空间前缀。
考虑以下XML Schema片段:
<A:schema xmlns:A="http://www.w3.org/2001/XMLSchema"
targetNamespace="B"
xmlns:B="B"
elementFormDefault="qualified">
<A:element name="foo">
<complexType> <!-- or A:complexType?-->
<element name="bar" type="B:myType"/> <!-- or A:element?-->
</complexType>
</A:element>
<B:complexType name="myType">
<choice> <!--or B:choice?-->
<element name="baz" type="string"/> <!--or B:element?-->
<element name="bas" type="string"/> <!--or B:element?-->
</choice>
</B:complexType>
</A:schema>
我是否必须在具有名称空间前缀的节点的所有子节点上指定名称空间前缀,或者这是继承的吗?或者A:complexType
与complexType
不同,当它的父节点附加了A名称空间前缀时?{/ p>
答案 0 :(得分:4)
命名空间URI前缀的绑定由子元素继承,但元素本身不会自动放在与其父元素相同的命名空间中。如果它们没有办法在命名空间中使用名称空间中不的子节点表达元素。在您的示例中,作为模式定义一部分的所有元素都需要位于http://www.w3.org/2001/XMLSchema
命名空间(通常映射到xsd
或xs
前缀):
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:B"
xmlns:B="urn:B"
elementFormDefault="qualified">
<xs:element name="foo">
<xs:complexType>
<xs:element name="bar" type="B:myType"/>
</xs:complexType>
</xs:element>
<xs:complexType name="myType">
<xs:choice>
<xs:element name="baz" type="string"/>
<xs:element name="bas" type="string"/>
</xs:choice>
</xs:complexType>
</xs:schema>
例外情况是当您使用xmlns="..."
为没有前缀的元素定义默认命名空间时,例如。
<schema xmlns="http://www.w3.org/2001/XMLSchema" ...>
<element ...>
<complexType ...>
相当于
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" ...>
<xs:element ...>
<xs:complexType ...>
type="B:myType"
是正确的,因为它指的是架构的myType
中名为targetNamespace
的类型,您可以将其映射到前缀B