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

    >> DTD, XML Schema(XMLS), RELAX NG
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DTD/XML Schema 』 → key和keyref唯一性验证问题,请斑竹和大虾指教 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 6833 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: key和keyref唯一性验证问题,请斑竹和大虾指教 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     XMLNEWER 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:4
      积分:77
      门派:XML.ORG.CN
      注册:2006/3/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给XMLNEWER发送一个短消息 把XMLNEWER加入好友 查看XMLNEWER的个人资料 搜索XMLNEWER在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看XMLNEWER的博客楼主
    发贴心情 key和keyref唯一性验证问题,请斑竹和大虾指教

    这是key.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="staffs">
      <xs:complexType>
       <xs:sequence>
        <xs:element name="Staff">
         <xs:complexType>
          <xs:attribute name="Id" type="xs:string"/>
         </xs:complexType>
        </xs:element>
        <xs:element name="Role" type="staffType">
         <xs:keyref name="staffkey2" refer="staffKey">
          <xs:selector xpath="Role"/>
          <xs:field xpath="Staff"/>
         </xs:keyref>
        </xs:element>
       </xs:sequence>
      </xs:complexType>
      <xs:key name="staffKey">
       <xs:selector xpath="Staff"/>
       <xs:field xpath="@Id"/>
      </xs:key>
    </xs:element>
    <xs:complexType name="staffType">
      <xs:sequence>
       <xs:element name="Staff"/>
      </xs:sequence>
    </xs:complexType>
    </xs:schema>

    这是key.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <staffs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="key.xsd">
    <Staff Id="2"/>
    <Role>
      <Staff>1</Staff>  <!-- 这儿应该通不过呀?-->
    </Role>
    </staffs>
    为什么在 我的xmlspy2006中和vs.net2003中验证都通过呢?


       收藏   分享  
    顶(0)
      




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

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给98900969r发送一个短消息 把98900969r加入好友 查看98900969r的个人资料 搜索98900969r在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看98900969r的博客2
    发贴心情 
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
     <xs:element name="staffs">
      <xs:complexType>
       <xs:sequence>
        <xs:element name="Staff">
         <xs:complexType>
          <xs:attribute name="Id" type="xs:string"/>
         </xs:complexType>
        </xs:element>
        <xs:element name="Role" type="staffType">
        </xs:element>
       </xs:sequence>
      </xs:complexType>
      <xs:key name="staffKey">
       <xs:selector xpath="Staff"/>
       <xs:field xpath="@Id"/>
      </xs:key>
      <!-- mind the changed scope -->
      <xs:keyref name="staffkey2" refer="staffKey">
       <xs:selector xpath="Role"/>
       <xs:field xpath="Staff"/>
      </xs:keyref>
     </xs:element>
     <xs:complexType name="staffType">
      <xs:sequence>
       <xs:element name="Staff" type="xs:string"/>
      </xs:sequence>
     </xs:complexType>
    </xs:schema>
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/9 22:43:00
     
     XMLNEWER 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:4
      积分:77
      门派:XML.ORG.CN
      注册:2006/3/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给XMLNEWER发送一个短消息 把XMLNEWER加入好友 查看XMLNEWER的个人资料 搜索XMLNEWER在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看XMLNEWER的博客3
    发贴心情 
    谢谢98900969r
    是不是key和keyref不能放在type定义(不管是匿名还是实命)里边的element之后?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/10 20:56:00
     
     98900969r 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      等级:大四寒假(收到MIT的Offer啦)
      文章:235
      积分:1555
      门派:XML.ORG.CN
      注册:2005/11/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给98900969r发送一个短消息 把98900969r加入好友 查看98900969r的个人资料 搜索98900969r在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看98900969r的博客4
    发贴心情 
    当然不是。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/10 21:30:00
     
     XMLNEWER 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:4
      积分:77
      门派:XML.ORG.CN
      注册:2006/3/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给XMLNEWER发送一个短消息 把XMLNEWER加入好友 查看XMLNEWER的个人资料 搜索XMLNEWER在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看XMLNEWER的博客5
    发贴心情 
    那为什么下面这部分
         <xs:keyref name="staffkey2" refer="staffKey">
          <xs:selector xpath="Role"/>
          <xs:field xpath="Staff"/>
         </xs:keyref>
    放在原来的地方就不好用呢,请您解释一下。
    顺便说一句,msdn上那个例子跟这个差不多,key和keyref也不起作用,按照98900969r的做法修改后,约束成功,msdn害死人了。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/10 21:41:00
     
     98900969r 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      等级:大四寒假(收到MIT的Offer啦)
      文章:235
      积分:1555
      门派:XML.ORG.CN
      注册:2005/11/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给98900969r发送一个短消息 把98900969r加入好友 查看98900969r的个人资料 搜索98900969r在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看98900969r的博客6
    发贴心情 
    放在原来的地方至少有一个错误。首先,Role下面并没有Role这么个元素,所以keyref staffkey2中<xs:selector xpath="Role"/>肯定不对。另外,在见到的实现中(看来XMLSPY和MS .Net都是这样),keyref只能引用以当前节点为根的子树中的key,而staffKey的根是staffs,不是Role。关于Keyref是否应该可以引用子树外的Key这一点,我不清楚。
    [此贴子已经被作者于2006-5-10 23:32:05编辑过]
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/10 22:47:00
     
     XMLNEWER 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:4
      积分:77
      门派:XML.ORG.CN
      注册:2006/3/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给XMLNEWER发送一个短消息 把XMLNEWER加入好友 查看XMLNEWER的个人资料 搜索XMLNEWER在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看XMLNEWER的博客7
    发贴心情 
    基本明白,应该是xpath的表达式的问题,非常感谢98900969r 。

    还有个问题问一下,在下面的例子中,把A的属性name作为一个key,把A内部的B元素通过keyref索引到这个key,但要求B不能索引到它的父节点A的属性值上。

    < A name="a1">
        <B>a1</B><!--这个不行,父节点名称为a1-->
        <B>a2</B>><!--这个可以,索引到其它节点名称为a2-->
    </A>
    < A name="a2">
        <B>a1</B>
    </A>
    在xsd中能加进这种约束吗?

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

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给98900969r发送一个短消息 把98900969r加入好友 查看98900969r的个人资料 搜索98900969r在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看98900969r的博客8
    发贴心情 
    以我的了解,xsd做不到。你的这个例子如果是下面这样就可以实现那个约束:
    < A name="a1">
        <B name="a1"/><!--这个不行,父节点名称为a1-->
        <B name="a2"/><!--这个可以,索引到其它节点名称为a2-->
    </A>
    < A name="a2">
        <B name="a1"/>
    </A>

    如果是上面这个样子,只要在A元素中定义一个如下的key:
         <xs:key name="AB">
          <xs:selector xpath=". | B"></xs:selector>
          <xs:field xpath="@name"></xs:field>
         </xs:key>

    这是因为照规定,selector只能选取元素节点,不能选属性节点 ------ 一个很奇怪的规定!

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

    本主题贴数8,分页: [1]

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