新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> DTD, XML Schema(XMLS), RELAX NG
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DTD/XML Schema 』 → 请问Schema中elementFormDefault="qualified"是起什么作用呀? 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 140603 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 请问Schema中elementFormDefault="qualified"是起什么作用呀? 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     victorwish 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:89
      门派:XML.ORG.CN
      注册:2005/11/25

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给victorwish发送一个短消息 把victorwish加入好友 查看victorwish的个人资料 搜索victorwish在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看victorwish的博客11
    发贴心情 

    好晕哦。看不懂
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/5 11:23:00
     
     nocake 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:28
      积分:141
      门派:XML.ORG.CN
      注册:2005/12/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给nocake发送一个短消息 把nocake加入好友 查看nocake的个人资料 搜索nocake在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看nocake的博客12
    发贴心情 
    好文章,谢谢

    ----------------------------------------------
    <a href="http://www.java-dotnet.net/xml.htm">xml技术站点(各类电子书、视频教程)集粹</a> http://www.java-dotnet.net/xml.htm

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/5 19:33:00
     
     flyfoxs 帅哥哟,离线,有人找我吗?
      
      
      威望:5
      等级:研一(Artificial Intelligence期期不放过)
      文章:550
      积分:3935
      门派:XML.ORG.CN
      注册:2005/1/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给flyfoxs发送一个短消息 把flyfoxs加入好友 查看flyfoxs的个人资料 搜索flyfoxs在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看flyfoxs的博客13
    发贴心情 
    这一个帖子至少看了20次以上了.只能说是越来越明白.


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

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


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

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


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

    ----------------------------------------------
    存在即是被搜索!

    BLOG =>  http://www.OpenJ.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/6 11:18:00
     
     98900969r 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      等级:大四寒假(收到MIT的Offer啦)
      文章:235
      积分:1555
      门派:XML.ORG.CN
      注册:2005/11/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给98900969r发送一个短消息 把98900969r加入好友 查看98900969r的个人资料 搜索98900969r在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看98900969r的博客14
    发贴心情 
    动手试比光看要管用。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/6 19:10:00
     
     flyfoxs 帅哥哟,离线,有人找我吗?
      
      
      威望:5
      等级:研一(Artificial Intelligence期期不放过)
      文章:550
      积分:3935
      门派:XML.ORG.CN
      注册:2005/1/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给flyfoxs发送一个短消息 把flyfoxs加入好友 查看flyfoxs的个人资料 搜索flyfoxs在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看flyfoxs的博客15
    发贴心情 
    以下是引用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>

    ----------------------------------------------
    存在即是被搜索!

    BLOG =>  http://www.OpenJ.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/6 19:15:00
     
     98900969r 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      等级:大四寒假(收到MIT的Offer啦)
      文章:235
      积分:1555
      门派:XML.ORG.CN
      注册:2005/11/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给98900969r发送一个短消息 把98900969r加入好友 查看98900969r的个人资料 搜索98900969r在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看98900969r的博客16
    发贴心情 
    在schema里面是没有反应,有反应的是它所说明的xml实例文档。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/6 19:37:00
     
     flyfoxs 帅哥哟,离线,有人找我吗?
      
      
      威望:5
      等级:研一(Artificial Intelligence期期不放过)
      文章:550
      积分:3935
      门派:XML.ORG.CN
      注册:2005/1/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给flyfoxs发送一个短消息 把flyfoxs加入好友 查看flyfoxs的个人资料 搜索flyfoxs在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看flyfoxs的博客17
    发贴心情 
    2)把schema子元素的po:前缀删了,这个文档还是有效的.


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

    ----------------------------------------------
    存在即是被搜索!

    BLOG =>  http://www.OpenJ.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/7 21:09:00
     
     98900969r 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      等级:大四寒假(收到MIT的Offer啦)
      文章:235
      积分:1555
      门派:XML.ORG.CN
      注册:2005/11/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给98900969r发送一个短消息 把98900969r加入好友 查看98900969r的个人资料 搜索98900969r在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看98900969r的博客18
    发贴心情 
    如果你把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这个类型,所以出错。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/7 22:55:00
     
     flyfoxs 帅哥哟,离线,有人找我吗?
      
      
      威望:5
      等级:研一(Artificial Intelligence期期不放过)
      文章:550
      积分:3935
      门派:XML.ORG.CN
      注册:2005/1/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给flyfoxs发送一个短消息 把flyfoxs加入好友 查看flyfoxs的个人资料 搜索flyfoxs在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看flyfoxs的博客19
    发贴心情 
    明白了!这回这个帖子估记明白了80%了.

    谢谢!

    ----------------------------------------------
    存在即是被搜索!

    BLOG =>  http://www.OpenJ.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/8 10:23:00
     
     zoomaxed 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2006/1/22

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zoomaxed发送一个短消息 把zoomaxed加入好友 查看zoomaxed的个人资料 搜索zoomaxed在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zoomaxed的博客20
    发贴心情 
    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

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/22 4:47:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DTD/XML Schema 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/27 17:07:36

    本主题贴数49,分页: [1] [2] [3] [4] [5]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    140.625ms