以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DTD/XML Schema 』  (http://bbs.xml.org.cn/list.asp?boardid=23)
----  key和keyref唯一性验证问题,请斑竹和大虾指教  (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=32010)


--  作者:XMLNEWER
--  发布时间:5/9/2006 8:58:00 PM

--  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中验证都通过呢?


--  作者:98900969r
--  发布时间:5/9/2006 10:43:00 PM

--  
<?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>

--  作者:XMLNEWER
--  发布时间:5/10/2006 8:56:00 PM

--  
谢谢98900969r
是不是key和keyref不能放在type定义(不管是匿名还是实命)里边的element之后?
--  作者:98900969r
--  发布时间:5/10/2006 9:30:00 PM

--  
当然不是。
--  作者:XMLNEWER
--  发布时间:5/10/2006 9:41:00 PM

--  
那为什么下面这部分
     <xs:keyref name="staffkey2" refer="staffKey">
      <xs:selector xpath="Role"/>
      <xs:field xpath="Staff"/>
     </xs:keyref>
放在原来的地方就不好用呢,请您解释一下。
顺便说一句,msdn上那个例子跟这个差不多,key和keyref也不起作用,按照98900969r的做法修改后,约束成功,msdn害死人了。
--  作者:98900969r
--  发布时间:5/10/2006 10:47:00 PM

--  
放在原来的地方至少有一个错误。首先,Role下面并没有Role这么个元素,所以keyref staffkey2中<xs:selector xpath="Role"/>肯定不对。另外,在见到的实现中(看来XMLSPY和MS .Net都是这样),keyref只能引用以当前节点为根的子树中的key,而staffKey的根是staffs,不是Role。关于Keyref是否应该可以引用子树外的Key这一点,我不清楚。
[此贴子已经被作者于2006-5-10 23:32:05编辑过]

--  作者:XMLNEWER
--  发布时间:5/12/2006 7:34:00 PM

--  
基本明白,应该是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中能加进这种约束吗?


--  作者:98900969r
--  发布时间:5/12/2006 9:25:00 PM

--  
以我的了解,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只能选取元素节点,不能选属性节点 ------ 一个很奇怪的规定!


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