以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DTD/XML Schema 』  (http://bbs.xml.org.cn/list.asp?boardid=23)
----  请问Schema中elementFormDefault="qualified"是起什么作用呀?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=25672)


--  作者:sasami808
--  发布时间:12/20/2005 9:40:00 AM

--  请问Schema中elementFormDefault="qualified"是起什么作用呀?
我看到有的xsd文件的开头是这样写的:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.abc.com"
           xmlns:ps="http://www.abc.com"
           elementFormDefault="qualified">

可是去掉elementFormDefault="qualified"好象也没什么影响呀?


--  作者:vampire_shirley
--  发布时间:12/20/2005 4:19:00 PM

--  
同问

--  作者:flashjean
--  发布时间:12/20/2005 5:09:00 PM

--  
应该是对一些 格式的限制和规范。 qualified 表示需要限制

--  作者:98900969r
--  发布时间:12/20/2005 6:26:00 PM

--  
一个 XML schema 中 elementFormDefault="?" 这一属性用来指示 XML Schema 处理程序把这个 XML schema 中定义的元素或者类型放到哪个命名空间。

一个schema中声明的元素或者类型只能归到两个命名空间中的某一个去,这两个是,无名命名空间和由targetSchema属性指明的目标命名空间。而targetSchema属性只能在xs:schema的定义中声明,因而,一个schema中的定义的元素或类型只可能归属于一个有名命名空间(但是还有可能归属于无名命名空间)。

当elementFormDefault="qualified" 时,所有全局元素的子元素将被以缺省方式放到目标命名空间,但是全局元素或者类型将被放到目标命名空间;而当elementFormDefault="unqualified" 时,所有全局元素的子元素将被以缺省方式放到无名命名空间。而属性的命名空间类似地由attributeFormDefault="?"来指明。

需要明白的是,elementFormDefault="?" 是有作用域的,并且是被继承的,除非在子定义中覆盖父定义。

下面三个例子说明了elementFormDefault的使用效果。红色表示属于已命名空间的元素,蓝色表示属于未命名空间的元素。

1.定义了目标命名空间, 全局elementFormDefault=“unqualified”。这时除了全局元素或者类型将归于目标命名空间外,局部元素将归于无名命名空间。

unqualified.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="aaaa" elementFormDefault="unqualified" attributeFormDefault="unqualified">
 <xs:element name="c">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="c1" type="xs:double"/>
    <xs:element name="c2" type="xs:string"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

unqualified.xml

<?xml version="1.0" encoding="UTF-8"?>
<n:c xmlns:n="aaaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="aaaa unqualified.xsd">
 <c1>3.141593E0</c1>
 <c2>String</c2>
</n:c>

2. 定义了目标命名空间, 全局elementFormDefault=“qualified”。这时全局元素或者类型将归于目标命名空间,局部元素将以缺省方式归于目标命名空间。

qualified.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="aaaa" elementFormDefault="qualified" attributeFormDefault="unqualified">
 <xs:element name="c">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="c1" type="xs:double"/>
    <xs:element name="c2" type="xs:string"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

qualified.xml

<?xml version="1.0" encoding="UTF-8"?>
<c xmlns="aaaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="aaaa qualified.xsd">
 <c1>3.141593E0</c1>
 <c2>String</c2>
</c>

3. 定义了目标命名空间, 全局elementFormDefault=“unqualified”。这时全局元素(c)或者类型将归于目标命名空间。局部元素(c1,c2)以缺省方式归于无名命名空间。局部元素(c3)在局部定义中使用form=“qualified”覆盖全局设定的unqualified,这使得c3归于目标命名空间(如果它有子元素,子元素将以缺省方式归于目标命名空间)。

qualified2.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="aaaa" elementFormDefault="unqualified" attributeFormDefault="unqualified">
 <xs:element name="c">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="c1" type="xs:double"/>
    <xs:element name="c2" type="xs:string"/>
    <xs:element name="c3" type="xs:integer" form="qualified"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>


qualified2.xml

<?xml version="1.0" encoding="UTF-8"?>
<n:c xmlns:n="aaaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="aaaa qualified2.xsd">
 <c1>3.141593E0</c1>
 <c2>String</c2>
 <n:c3>0</n:c3>
</n:c>

[此贴子已经被作者于2005-12-21 0:57:51编辑过]

--  作者:flashjean
--  发布时间:12/21/2005 10:05:00 AM

--  
麻烦解释一下 elementFormDefault="unqualified" 时候,全局元素(c)或者类型将归于目标命名空间。 问题是: 为什么就一定 <n:c  ,有n 作为前缀, 为什么是 n 不是别的字母?
--  作者:98900969r
--  发布时间:12/21/2005 1:06:00 PM

--  
并不是非要是n,随便什么都行,一长串也行。
--  作者:flyfoxs
--  发布时间:12/25/2005 7:57:00 PM

--  
当elementFormDefault="qualified" 时,所有全局元素的子元素将被以缺省方式放到目标命名空间,但是全局元素或者类型将被放到目标命名空间


这句话不通啊,但是没有转折关系,我怀疑"98900969r"是不是产生了笔误.


第二个"目标命名空间"可能是"无名命名空间"

[此贴子已经被作者于2005-12-25 20:30:34编辑过]

--  作者:98900969r
--  发布时间:12/26/2005 12:49:00 AM

--  
那句话是有问题,谢谢你指出来!我后来发现了想改,可是已经过了可编辑的时间了。那句话应该是:

当elementFormDefault="qualified" 时,所有全局元素的子元素将被以缺省方式放到目标命名空间,连同全局元素或者类型一起;


--  作者:flyfoxs
--  发布时间:12/31/2005 6:33:00 PM

--  

在你的例子中,第一个例子与第二个例子中被验证的文件好像是一样的!

那么XSD在这里面有什么作用,只是验证的话,对应 的两个 XSD好像 不一样啊?


看了下面这句话,好像有所体会:是不是如果当使用"elementFormDefault="qualified""时,schema会对XML文件的表意就有所变化了.

当elementFormDefault="qualified" 时,所有全局元素的子元素将被以缺省方式放到目标命名空间,连同全局元素或者类型一起;


[此贴子已经被作者于2005-12-31 19:09:48编辑过]

--  作者:98900969r
--  发布时间:1/2/2006 5:29:00 AM

--  
三个例子都不一样。就第一个和第二个而言,如果不顾及命名空间,它们真的一样,但是必须要考虑命名空间。第一个中,只有c归于命名空间“aaaa”,c1和c2属于无名命名空间。而第二个中,c,c1和c2全部属于命名空间“aaaa”。

--  作者:victorwish
--  发布时间:1/5/2006 11:23:00 AM

--  
好晕哦。看不懂
--  作者:nocake
--  发布时间:1/5/2006 7:33:00 PM

--  
好文章,谢谢
--  作者:flyfoxs
--  发布时间:1/6/2006 11:18:00 AM

--  
这一个帖子至少看了20次以上了.只能说是越来越明白.


目前又有所体会不知道对不对.

targetnamespace是来限定schema中出现的元素和属性的名称空间.
而elementFormDefault="qualified"是用来限定它将验证的XML文件是否使用targetnamespace指定的名称空间.]


不知道上面的体会对不对!

中文英文相关的都看了不少,总是对这个帖子体会不到位!!!!!


[此贴子已经被作者于2006-1-6 19:10:53编辑过]

--  作者:98900969r
--  发布时间:1/6/2006 7:10:00 PM

--  
动手试比光看要管用。
--  作者:flyfoxs
--  发布时间:1/6/2006 7:15:00 PM

--  
以下是引用98900969r在2006-1-6 19:10:00的发言:
动手试比光看要管用。


我就是试了之后才体会到上面两点的!
我是这样试的

1)把下面qualified全修改为unqualified,没有什么反应.
2)把schema子元素的po:前缀删了,这个文档还是有效的.

<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:po="http://www.example.com/PO1"
        targetNamespace="http://www.example.com/PO1"
        elementFormDefault="qualified"
        attributeFormDefault="qualified">

  <element name="purchaseOrder" type="po:PurchaseOrderType"/>
  <element name="comment"       type="string"/>

  <complexType name="PurchaseOrderType">
    <sequence>
      <element name="shipTo"    type="po:USAddress"/>
      <element name="billTo"    type="po:USAddress"/>
      <element ref="po:comment" minOccurs="0"/>
      <!-- etc. -->
    </sequence>
    <!-- etc. -->
  </complexType>

  <complexType name="USAddress">
    <sequence>
      <element name="name"   type="string"/>
      <element name="street" type="string"/>
      <!-- etc. -->
    </sequence>
  </complexType>

  <!-- etc. -->

</schema>


--  作者:98900969r
--  发布时间:1/6/2006 7:37:00 PM

--  
在schema里面是没有反应,有反应的是它所说明的xml实例文档。
--  作者:flyfoxs
--  发布时间:1/7/2006 9:09:00 PM

--  
2)把schema子元素的po:前缀删了,这个文档还是有效的.


上面写错了,应该是"把schema子元素的po:前缀删了,文档 就变成无效的了."


--  作者:98900969r
--  发布时间:1/7/2006 10:55:00 PM

--  
如果你把schema中元素声明中type属性值中的po:删掉,那这个schema本身就错了。例如,如果把:
<element name="purchaseOrder" type="po:PurchaseOrderType"/>
改成:
<element name="purchaseOrder" type="PurchaseOrderType"/>
那这个schema本身就不对了,因为找不到PurchaseOrderType这个类型。这是因为,这时type="PurchaseOrderType"中PurchaseOrderType类型前缀为空,验证它的程序就认为它属于缺省命名空间,而此时缺省命名空间是"http://www.w3.org/2001/XMLSchema"(由xmlns="http://www.w3.org/2001/XMLSchema"声明),但是这个命名空间里面没有PurchaseOrderType这个类型,所以出错。
--  作者:flyfoxs
--  发布时间:1/8/2006 10:23:00 AM

--  
明白了!这回这个帖子估记明白了80%了.

谢谢!


--  作者:zoomaxed
--  发布时间:1/22/2006 4:47:00 AM

--  
98900969r作了很扎实的描述,尤其是这三个基本例子和颜色说明。解决了我好多困扰。非常谢谢分享!!!

我还有个疑问,就是为什么要制定这个ElementDefaultForm?背后有什么故事吗?到底它的目的是什么哪?换句话说:如果我们把它去掉,难道会有一些schema功能不能实现吗?

先总结一下我的学习感受,主要是澄清了三个错误观念:

第一: 我以前有个错误的概念,就是认为qualified就是说这个schema必须要去validate所有全局元素和子元素,相反,unqualified就是只是去validate全局元素,而局部元素可以不去理它。通过实验98900969r的unqualified.xml例子,我的观点是错误的。

比如说,我改变了unqualified.xml的一些元素的值to: <c1>try a string here</c1>

<?xml version="1.0" encoding="UTF-8"?>
<n:c xmlns:n="aaaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="aaaa unqualified.xsd">
<c1>try a string here</c1>
<c2>String</c2>
</n:c>

我在XMLSpy中validate这个xml实例,结果failed,因为c1的type被改变了。

正确的观点是,ElementDefaultForm跟怎样定义、验证具体的元素,属性等没有直接关系。它只是限定在哪个namespace空间去执行这些操作。

第二: 这个错误观念,我是从另一篇文章里得到的。那篇文章说,elementFormDefault用来定义实例化后的XML文档中,属性名称的前面是否需要加名称空间前缀,如果elementFormDefault="qualified",那么XML的属性名称前面就需要加前缀。(我觉得他是讲元素名称,而不是属性名称)。这种想法好像很危险。还是举98900969r的qualified.xml例子说明:

原稿qualified.xml:
<?xml version="1.0" encoding="UTF-8"?>
<c xmlns="aaaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="aaaa qualified.xsd">
<c1>3.141593E0</c1>
<c2>String</c2>
</c>

很显然,这里根本就没有什么prefix。这是我的第二个错误观念。

当然,我们也可以加上prefix,修改成,
<?xml version="1.0" encoding="UTF-8"?>
<n1:c
xmlns:n1="aaaa"
xmlns:n2="aaaa"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="aaaa qualified.xsd">
<n2:c1>3.141593E0</n2:c1>
<n2:c2>String</n2:c2>
</n1:c>

或者,
<?xml version="1.0" encoding="UTF-8"?>
<n:c
xmlns:n="aaaa"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="aaaa qualified.xsd">
<n:c1>3.141593E0</n:c1>
<n:c2>String</n:c2>
</n:c>

他们都是有效的实例。

第三:关于子元素继承父元素的命名空间的问题。我以前认为,如果子元素没有prefix,那么它就应该存在于在父元素的命名空间。<---错!

原稿unqualified.xml:
<?xml version="1.0" encoding="UTF-8"?>
<n:c xmlns:n="aaaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="aaaa unqualified.xsd">
<c1>3.141593E0</c1>
<c2>String</c2>
</n:c>

这里c1 c2 实际上是在null namespace,而不是在n命名空间<---正确!

更进一步,我们想象如果这个实例中有default namespace会怎样哪?
我们可以修改为,

<?xml version="1.0" encoding="UTF-8"?>
<c xmlns="aaaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="aaaa unqualified.xsd">
<c1 xmlns="">3.141593E0</c1>
<c2 xmlns="">String</c2>
</c>

这里,我把c元素放在default namespace(aaaa)。注意,子元素c1 c2必须放在未命名空间""中。这个修改的实例可以通过validation。但是,如果我们拿掉c1 c2中的xmlns="",验证就立即失败:“c1 c2 没有定义“。

所以,关于继承父元素命名空间的正确观点应该是:只有在父元素中的default namespace才可以以继承。

也可以通俗地认为,命名空间根本就不能继承。但是,如果假设我们有个叫作ANYELEMNT节点定义了缺省命名空间,那么属于这个节点的所有子元素中,那些没有前缀的元素就属于这个ANYELEMNT定义的缺省命名空间(所谓的继承);如果追溯到整个文件的根,还没有找到缺省的命名空间的话,那这个没有带前缀的元素就属于无名命名空间了。带prefix的父元素,其命名空间不能传递给子元素。

举例说明一下:
<<test.xsd>>:

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

xmlns:myNamespace="aaaa"
xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="aaaa" elementFormDefault="qualified" >

<xs:element name="root">
  <xs:complexType>
   <xs:sequence>
   <xs:element name="ANYELEMNT" type="myNamespace:myType" />
   </xs:sequence>
  </xs:complexType>
</xs:element>
  
<xs:complexType name="myType">
   <xs:sequence>
    <xs:element name="ACHILD" type="xs:string"/>
   </xs:sequence>
</xs:complexType>

</xs:schema>


<<test.xlm>>:
<?xml version="1.0" encoding="UTF-8"?>
<n:root xmlns:n="aaaa"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="aaaa test.xsd">

    <ANYELEMNT xmlns="aaaa">
        <ACHILD>aaaaaaaa</ACHILD>
    </ANYELEMNT>
 
</n:root>

这里,ACHILD元素继承了父元素ANYELEMNT的缺省命名空间(xmlns="aaaa")。schema验证是成功的。

最后,我还是想重复一下我的问题:在schema中,为什么要有这个elementFormDefault?看了98900969r的介绍,我似乎明白它的规则了。但究竟为什么要制定这个规则呢?

请各位指教。

谢谢!!如果能给我发email最好。

zoomaxed@yahoo.com


--  作者:daizemiao2006
--  发布时间:2/20/2006 11:18:00 AM

--  
请问所提出问题中的xmlns:xs="http://www.w3.org/2001/XMLSchema"代表未命名空间,那么xmlns:ps="http://www.abc.com"代表什么空间呢?为什么前一个就可以代表未命名空间而后一个不可以呢?

--  作者:wFirebird
--  发布时间:3/9/2006 3:30:00 PM

--  
受益匪浅~!

顶一下


--  作者:wFirebird
--  发布时间:3/14/2006 10:36:00 AM

--  
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="aaaa" targetNamespace="aaaa" elementFormDefault="unqualified" attributeFormDefault="unqualified">
 <xs:element name="c">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="c1" type="xs:double"/>
    <xs:element name="c2" type="xs:string"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<n:c xmlns:n="aaaa" xmlns="12345" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="aaaa
C:\PROGRA~1\Altova\XMLSpy2006\spl\1111.xsd">
 <c1>3.141593E0</c1>
 <c2>String</c2>
</n:c>
这样就表示为,全局元素或者类型将归于目标命名空间外,局部元素将归于无名命名空间。而我在书写XML文件时,自己定义了一个默认的名称空间,这样解析器就一直保错。
错误结果是自相矛盾,大家可以试验一下,交流下经验!


--  作者:wFirebird
--  发布时间:3/14/2006 10:41:00 AM

--  
似乎是,如果在Schema定义中使用了 elementFormDefault=“false”那么在XML文件里面就不允许出现默认的名称空间,只有elementFormDefault=“true”时在XML文件中才能使用空的名称空间(默认名称空间)。
--  作者:wFirebird
--  发布时间:3/14/2006 10:44:00 AM

--  
嘿嘿
写错了
elementFormDefault="unqualified"就是指XML文件没有资格使用默认名称空间。
elementFormDefault="qualified"就是指XML文件有资格使用默认名称空间。
嘎嘎~
--  作者:メ冰枫ぱ雪
--  发布时间:3/23/2006 6:40:00 AM

--  
我记得是完全符合w3c标准哦。 前面加个un是不完全符合。
--  作者:krazy
--  发布时间:3/31/2006 5:35:00 PM

--  
解释的很确切
解决了我的盲区,谢谢
--  作者:skyo
--  发布时间:4/6/2006 11:20:00 PM

--  

看了明白很多了~
--  作者:kelindun
--  发布时间:5/5/2006 9:15:00 AM

--  
好帖子,我是认认真真看了2遍的,获益匪浅!
--  作者:kelindun
--  发布时间:5/5/2006 9:48:00 AM

--  
说下我的理解吧。其实简单的想来,98900969r说的很清楚了。只要看他做的红色和蓝色标记,应该就可以明白了。第一个例子中,elementFormDefault=unqualified ,所以全局元素c归于目标名域空间。 以此类推....elementFromDefault 与attributeFormDefault针对的是元素与属性归属于目标名域空间和默认空间的问题。unqualified时,除全局元素和类型,其余的都归于默认名域空间。qualified时,归属与目标名域空间。
   元素覆盖(例3中的 form属性)比较简单,大家很好理解
--  作者:flyfoxs
--  发布时间:6/9/2006 11:06:00 AM

--  
跨越了几个月,终于明白了这个帖子所说的语法。

可是不明白,这样制定的语法,有什么作用?


--  作者:98900969r
--  发布时间:6/9/2006 4:37:00 PM

--  
Henry S. Thompson(XML Schema 的编委之一,供职于爱丁堡大学教授)在这里 http://lists.xml.org/archives/xml-dev/200007/msg00064.html 回答了对于 elementFormDefault 的作用质疑。依我的理解,可以简单认为 elementFormDefault 的存在是为了方便,并不是必需。

此外,XML Schema的复杂性引起了很多争议。其中一部分的复杂性就来自这些可有可无的东西,它们带来方便,也带来麻烦。


--  作者:wyguanshui
--  发布时间:6/15/2006 12:33:00 PM

--  

--  作者:chnking
--  发布时间:7/12/2006 2:25:00 PM

--  
看了几遍帖子,感觉说得都有些问题,下面是我的理解

先看MSDN中elementFormDefault 属性的解释:
在该架构的目标命名空间中声明的元素的形式。该值必须是下列字符串之一:qualified 或 unqualified。默认值为 unqualified。
如果该值是 unqualified,则无须通过命名空间前缀限定目标命名空间的元素。
如果该值是 qualified,则必须通过命名空间前缀限定目标命名空间的元素。

MSDN的描述不完整,完整的应该是:
如果该值是 unqualified,根元素必须有命名空间的的限定,这个命名空间必须是schema中定义的targetNameSpace,但是其下子元素无须也不允许用命名空间前缀限定目标命名空间。 子元素的命名空间为空命名空间。
如果该值是 qualified,根元素及其下所有子元素都必须通过命名空间前缀限定目标命名空间。这个命名空间必须是schema中定义的targetNameSpace。

再看xml实例中根元素和子元素的命名空间的设置:
1. 通过prefix定义命名空间
在根元素的属性中使用 xmlns:xxx = url 的语法来定义一个名称空间的前缀xxx,然后在需要用这个名称空间限定的元素前面加上前缀和冒号,例如:
<?xml version="1.0" encoding="UTF-8"?>
<n:c xmlns:n="aaaa">
<n:c1>3.141593E0 </n:c1>
<n:c2>String</n:c2>
<c3>0</c3>
</n:c>
这个xml实例中定义了一个叫“aaaa”的前缀,在元素名称前面加了”n:”的元素都会拥有”aaaa”的命名空间,没有加前缀的元素(c3)将没有命名空间的限定,它的命名空间属性为””。
2. 通过默认命名空间定义全部元素的命名空间
根元素的单独的xmlns 属性定义一个xml实例的默认命名空间,其下的元素除了另外设置了前缀,都将被默认命名空间限定。例如:
<?xml version="1.0" encoding="UTF-8"?>
<c xmlns ="aaaa">
<c1>3.141593E0 </c1>
<c2>String</ c2>
<c3>0</c3>
</n:c>
这个xml实例中所有元素(c,c1,c2,c3)的命名空间都是“aaaa”

总结:
elementFormDefault 属性只是用来设置xml的实例中子元素是否一定需要有命名空间限定,不控制xml实例中各元素归属哪个命名空间。xml实例中元素的命名空间由xml实例本身的设置决定。


--  作者:gyz5656
--  发布时间:9/6/2006 7:14:00 PM

--  
麻烦问一下,schema 在开发中的作用是什么?我从数据库中倒出的数据如何进行验证呢?
--  作者:iamlinzi
--  发布时间:9/11/2006 4:53:00 PM

--  
看了98900969r的解释,感觉和我理解的有所不同。
为此我特意看了http://www.w3.org/TR/xmlschema-0/上的文章,这是schema的官方规范。
首先,targetNamespace属性规定了本schema词汇表的名字空间。
第二,无论是全局element/attribute,还是本地的,都属于这个名字空间。
第三,elementFormDefault/attributeFormDefault都只影响schema instance document中本地
--  作者:iamlinzi
--  发布时间:9/11/2006 5:01:00 PM

--  
看了98900969r的解释,感觉和我理解的有所不同。
为此我特意看了http://www.w3.org/TR/xmlschema-0/上的文章,这是schema的官方规范。
首先,targetNamespace属性规定了本schema词汇表的名字空间。
第二,无论是全局element/attribute,还是本地的,都属于这个名字空间。
第三,elementFormDefault/attributeFormDefault都只影响schema instance document中本地
         element/attribute是否使用前缀,没有其他作用。
第四,98900969r的未命名空间,我的理解应该是没有名字空间。按照官方说明,在schema没有指定targetNamespace、并且instance document没有引入名字空间时,此时element/attribute都没有名字空间。

在此,我有点想法,有些东西单纯靠尝试是不行的,应该从本质上理解这些概念。最好的办法就是看官方的文档。


--  作者:yjclose2006
--  发布时间:9/28/2006 4:30:00 PM

--  
98900969r的解释我完全看懂了,而且分析也颇有道理,但在具体应用中我不能理解按照98900969r的解释有什么作用。但是看了iamlinzi的解释,据说来自官方网站的解释,我相信iamlinzi的英文阅读能力,似乎这种解释对于elementFormDefault在schema的应用更加明确,让我想起了一些开发语言中对变量是否强行定制的设置。但如果是iamlinzi的解释是正确的话,那么98900969r的示例中当elementFormDefault=qulified的时候,如果舍掉了前缀势必没法通过spy2006的验证。如此又则怎么解答呢?

--  作者:gogy
--  发布时间:10/26/2006 5:49:00 PM

--  
我的看法是:98900969r是按照书上的说法来的,但并未说到点子上,究竟这样限制来限制去的,是为了干什么,有什么用?我认同chnking 的说法,名称空间只是用来区分相同名称元素的,”无论是全局element/attribute,还是本地的,都属于这个名字空间“。
例如:qualified时,
<?xml version="1.0" encoding="UTF-8"?>
<n:c xmlns ="aaaa">
<c1>3.141593E0 </c1>
<c2>String</ c2>
<c3>0</c3>
</n:c>
说C1,C2,C3属于未命名名称空间有什么意义啊,我们的目的是验证这三个元素有没有效,不是还得按照unqualified.xsd来验证啊。
所以我觉得,elementFormDefault不过是用来决定,要不要加前缀的。
--  作者:chyzw
--  发布时间:11/5/2006 12:03:00 AM

--  
太好 了。。我正在想这个呢。。Thank you!
--  作者:snowbeer
--  发布时间:12/10/2006 3:41:00 PM

--  
作个记号,回去好好想想
--  作者:zhy_justin
--  发布时间:3/16/2007 5:01:00 PM

--  
ding
--  作者:ljx004201
--  发布时间:4/13/2007 3:47:00 PM

--  
schemaLocation那这个的作用呢怎么还要加xsi,以及前边还要定义一个命名空间呢
--  作者:lao_cai
--  发布时间:5/11/2007 11:23:00 AM

--  
以下XML文档中c c1 c2 c3是属于哪个命名空间?到底是aaaa还是dddd?
<?xml version="1.0" encoding="UTF-8"?>
<c  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="aaaa 4-qualified.xsd"
xmlns="dddd">
<c1>3.141593E0</c1>
<c2>String</c2>
<c3>0</c3>
</c>
对应的schema
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="aaaa"
elementFormDefault="qualified"
>
<xs:element name="c">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="c1" type="xs:double"/>
    <xs:element name="c2" type="xs:string"/>
    <xs:element name="c3" type="xs:integer" />
   </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>


--  作者:gogy
--  发布时间:5/12/2007 10:36:00 PM

--  
当然属于dddd,但是,这样能验证吗?
--  作者:edisonviva2006
--  发布时间:5/24/2007 11:42:00 AM

--  
up up up
--  作者:insky
--  发布时间:7/11/2007 5:06:00 PM

--  
学习了
谢啦`~~~
--  作者:iaiyanghua1
--  发布时间:4/11/2008 10:56:00 AM

--  
我刚开始 学习 XML  晕了 ,,,,,,,,,,,,,,,,,,,

--  作者:1500053
--  发布时间:5/10/2008 9:13:00 PM

--  
3Q
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
296.875ms