如何解释此Namespaced Schema Def?

时间:2014-05-19 14:07:39

标签: xml xsd

我正在使用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(无论我是否加上前缀)。

1 个答案:

答案 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>

因此,只要与前缀或默认命名空间关联的命名空间是您的目标命名空间,您的元素是否具有前缀并不重要。