以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DTD/XML Schema 』  (http://bbs.xml.org.cn/list.asp?boardid=23)
----  [求助]如何对元素顺序进行限定?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=39367)


--  作者:macrohard
--  发布时间:10/26/2006 11:38:00 AM

--  [求助]如何对元素顺序进行限定?
看了论坛不少教程,不过对元素顺序的限定还是不太理解

举例来说,比如有A,B,C三个元素
A,B顺序任意,但必须是C结尾
<root>
 <item>
  <A/>
  <B/>
  <C/>
 </item>
 <item>
  <B/>
  <B/>
  <C/>
 </item>
 <item>
  <A/>
  <A/>
  <C/>
 </item>
 <item>
  <B/>
  <A/>
  <C/>
 </item>
</root>
用XMLspy生成了一个架构,结果保存就报错,看来它自己就验证通不过
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--W3C Schema generated by XMLSpy v2006 rel. 3 sp1 (http://www.altova.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
 <xs:element name="A" type="xs:string"/>
 <xs:element name="B" type="xs:string"/>
 <xs:element name="C" type="xs:string"/>
 <xs:element name="item">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="A" minOccurs="0" maxOccurs="unbounded"/>
    <xs:element ref="B" minOccurs="0" maxOccurs="unbounded"/>
    <xs:element ref="A" minOccurs="0" maxOccurs="unbounded"/>
    <xs:element ref="C"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name="root">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="item" maxOccurs="unbounded"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>


--  作者:gemingke
--  发布时间:10/26/2006 11:55:00 AM

--  
首先,sequence的作用是确定被包括在里面的元素的出现顺序,即在sequence里面是什么顺序,出现在文档中也必须是这个顺序。

按照你的原文来看,sequence不能这样用

下面是修改过的schema
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--W3C Schema generated by XMLSpy v2006 rel. 3 sp1 (http://www.altova.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >
 <xs:element name="A" type="xs:string"/>
 <xs:element name="B" type="xs:string"/>
 <xs:element name="C" type="xs:string"/>
 <xs:element name="item">
  <xs:complexType>
   <xs:sequence>
    <xs:choice maxOccurs="unbounded">
     <xs:element ref="A"/>
     <xs:element ref="B"/>
    </xs:choice>
    <xs:element ref="C"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name="root">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="item" maxOccurs="unbounded"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

因为的A、B元素出现顺序不定,所以想到了用choice



--  作者:macrohard
--  发布时间:10/26/2006 1:30:00 PM

--  
哦,sequence 和choice还可以互相包含
感谢二楼热心帮助

那如果换一种思路呢,比如让<A>始终在开头,其后<A>,<B>任意,<C>结尾
<xs:element name="item">
  <xs:complexType>
   <xs:sequence>
     <xs:element ref="A"/>
    <xs:choice maxOccurs="unbounded">
     <xs:element ref="A"/>
     <xs:element ref="B"/>
    </xs:choice>
    <xs:element ref="C"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
结果XMLspy报错,说是<A>冲突了


--  作者:gemingke
--  发布时间:10/26/2006 1:48:00 PM

--  
必须在引用A时加一句“maxoccurs="unbounded"”
--  作者:macrohard
--  发布时间:10/26/2006 2:58:00 PM

--  
明白了,感谢ing

题外话,论坛发帖子的系统和新浏览器是不是有点兼容问题?(也可能和我机子有关),现在的状况是我本机装了IE7以及FF2都不能正确发贴,总是报告异常,只有在VPC里用IE6发帖,怪!


--  作者:gemingke
--  发布时间:10/26/2006 3:23:00 PM

--  
也许把,呵呵
--  作者:macrohard
--  发布时间:10/26/2006 4:43:00 PM

--  
不好意思,又想到一个问题,如果一个元素限定它不要有任何属性,子元素或值
<item/>
应该如何限定呢?
--  作者:gemingke
--  发布时间:10/26/2006 7:54:00 PM

--  
空元素?我不擅长
--  作者:carver
--  发布时间:10/29/2006 2:46:00 PM

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