花公子丶 2016-06-29 08:25 采纳率: 50%
浏览 1459
已结题

xsd的key与keyref到底有什么用

xsd的key与keyref在msdn,菜鸟教程以及w3cschool中都说的模棱两可。所以先上段代码,看我理解的对不对:

<xs:key name="pNumKey">
            <xs:selector xpath="B/part"/>
            <xs:field xpath="@key-number"/>
</xs:key>

<xs:keyref name="dummy" refer="pNumKey">
                <xs:selector xpath="A"/>
                <xs:field xpath="@ref-number"/>
</xs:keyref>

上面这段代码,我的理解是key返回了元素B的part元素的key-number属性的值的
一个集合,然后keyref的限定A元素的ref-number属性的值必须是在这个集合内的。不知道这样理解对不对,如果不对,万望指出!
另外,微软msdn的这个例子验证不过去不知道是怎么回事,麻烦告知。如果有错误,希望帮忙改正,例子来自msdn:https://msdn.microsoft.com/zh-cn/library/ms256101(v=vs.80).aspx
顺便把代码粘贴过来:
首先是xsd文件

 <xs:schema 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
   targetNamespace="namespace1"
        xmlns:r="namespace1"
        elementFormDefault="qualified">

 <xs:element name="root">
  <xs:complexType>
   <xs:sequence>

    <xs:element name="A" type="r:A" maxOccurs="unbounded">
     <xs:keyref name="dummy" refer="r:pNumKey">
      <xs:selector xpath="r:part"/>
      <xs:field xpath="@ref-number"/>
     </xs:keyref>
    </xs:element>

    <xs:element name="B" type="r:B"/>

   </xs:sequence>
  </xs:complexType>

  <xs:key name="pNumKey">
   <xs:selector xpath="r:B/r:part"/>
   <xs:field xpath="@key-number"/>
  </xs:key>

  </xs:element>

 <xs:complexType name="A">
  <xs:sequence>
   <xs:element name="part" maxOccurs="unbounded">
    <xs:complexType>
     <xs:simpleContent>
      <xs:extension base="xs:string">
       <xs:attribute name="ref-number" type="xs:integer"/>
      </xs:extension>
     </xs:simpleContent>
    </xs:complexType>
   </xs:element>
  </xs:sequence>
 </xs:complexType>

 <xs:complexType name="B">
  <xs:sequence>
   <xs:element name="part" maxOccurs="unbounded">
    <xs:complexType>
     <xs:simpleContent>
      <xs:extension base="xs:string">
       <xs:attribute name="key-number" type="xs:integer"/>
      </xs:extension>
     </xs:simpleContent>
    </xs:complexType>
   </xs:element>
  </xs:sequence>
 </xs:complexType>

</xs:schema>

然后是xml文件:

 <root xmlns="namespace1">
  <A>
    <!-- if the ref-number is not equal to one of the key-number, the validation will give error -->
    <part ref-number="1"/>
  </A>
  <A>
    <!-- if the ref-number is not equal to one of the key-number, the validation will give error -->
    <part ref-number="2"/>
  </A>
  <B>
    <part key-number="1"/>
    <part key-number="2"/>
    <part key-number="3"/>
  </B>
</root>

这段代码中,把定义A元素的那段中的所有的r名称空间去掉倒是可以走通,但是A的part的ref-number即使是100居然都可以。按照我前面的理解,应该只能为1或者2或者3才对。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 素材场景中光线烘焙后灯光失效
    • ¥15 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 ubuntu子系统密码忘记
    • ¥15 保护模式-系统加载-段寄存器