我正在使用XSD,并且不了解它定义的命名空间的含义。这是我试图解释的部分:
<?xml version="1.0" encoding = "utf-8"?>
<xs:schema
targetNamespace ="http://tempuri.org/XMLSchema.xsd"
elementFormDefault ="qualified"
xmlns ="http://tempuri.org/XMLSchema.xsd"
xmlns:mstns ="http://tempuri.org/XMLSchema.xsd"
xmlns:xs ="http://www.w3.org/2001/XMLSchema"
>
下面的定义是complexType的单个根元素,它是包含简单和复杂类型混合的元素集。
<xs:element name = "RootElement" type = "rootelement"></xs:element>
<xs:complexType name = "rootlement">
<xs:sequence>
.
.
</xs:sequence>
</xs:complexType>
我最不了解的原因是,当我使用CAM处理此XSD时,所有元素都以'mstns'为前缀。为什么'妈妈'?所有元素和子元素都在定义本身中以'xs'为前缀。
我没有得到的第二件事是,当我使用XML :: Compile处理XSD时,template()说它无法找到RootElement(无论我是否加上前缀)。
答案 0 :(得分:1)
架构中定义的类型和元素属于targetNamespace
。这意味着如果要在XML文件中验证<RootElement>
:
<RootElement> ... </RootElement>
需要声明该命名空间:
<RootElement xmlns="http://tempuri.org/XMLSchema.xsd"> ... </RootElement>
否则它属于 no-namespace ,您的处理器将无法找到它。
在Schema文档中,"http://www.w3.org/2001/XMLSchema"
命名空间与文档中的前缀(xs
相关联,这是一种约定),因此您可以使用XML Schema词汇表中的元素,属性和类型而不是将它们与您定义的元素,属性和类型混淆。在您的架构中,您的默认命名空间已分配给您的targetNamespace
,这也是一种约定。你可以合法地反转它(虽然你会破坏这些约定),将"http://www.w3.org/2001/XMLSchema"
命名空间声明为默认,并为targetNamespace
添加前缀:
<schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
xmlns:myprefix="http://tempuri.org/XMLShema.xsd"
xmlns="http://www.w3.org/2001/XMLSchema">
这将允许您声明<element>
没有前缀,但是现在您必须限定您的类型,因为您不能再将您的目标命名空间引用为默认值:
<element name="RootElement" type="myprefix:rootelement"/>
在您的架构中,您有两个映射目标命名空间。一个作为默认名称空间,另一个作为前缀mstns
。如果您的模式中有XPath表达式,通常这是必要的(例如:键,唯一约束)。 XPath要求选择器加前缀。因此,为了能够使用未加前缀的类型并且还能够使用XPath,将名称空间与前缀相关联也很方便。
前缀具有本地范围。您可以选择所需的任何前缀(除了&#39; xml&#39;),并且在您要验证的XML实例中可以有所不同。在您的XML实例中,您可以声明如上所示的默认命名空间,也可以使用任何前缀验证您的文档:
<myprefix:RootElement xmlns:myprefix="http://tempuri.org/XMLSchema.xsd">
... </myprefix:RootElement>
因此,只要与前缀或默认命名空间关联的命名空间是您的目标命名空间,您的元素是否具有前缀并不重要。