以文本方式查看主题 - 中文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"?> 这是key.xml |
-- 作者: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"> |
-- 作者: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: 这是因为照规定,selector只能选取元素节点,不能选属性节点 ------ 一个很奇怪的规定! |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
46.875ms |