以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DTD/XML Schema 』  (http://bbs.xml.org.cn/list.asp?boardid=23)
----  关于schema中unique遇到的问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=46094)


--  作者:calmness
--  发布时间:4/27/2007 12:10:00 AM

--  关于schema中unique遇到的问题
今天在写一个schema时,使用unique遇到个问题,xml文件使用noNamespaceSchemaLocation指定schema的时候,遇到重复的数据就会正常报错,然而如果使用命名空间的话就可以保存,不会报重复值的错误,但是其他验证却又正常,仅仅只有验证unique时候才有问题,schema代码如下:
以下内容为程序代码:

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by wxb (nudt) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.easyjfweb.com/easyjf-test"
elementFormDefault="qualified" attributeFormDefault="unqualified">
 <xs:element name="easyjf-web">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="forms">
     <xs:annotation>
      <xs:documentation>
       Forms标签定义,可包含一个或多个form标签
      </xs:documentation>
     </xs:annotation>
     <xs:complexType>
      <xs:sequence>
       <xs:element name="form" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
         <xs:documentation>
           form标签定义
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
         <xs:sequence>
          <xs:element name="property" maxOccurs="unbounded">
           <xs:complexType>
            <xs:attribute name="initial" type="xs:string"/>
            <xs:attribute name="name" type="xs:string" use="required"/>
            <xs:attribute name="notNull" type="xs:string" default="no"/>
            <xs:attribute name="size" type="xs:integer"/>
            <xs:attribute name="type" type="xs:string" default="java.lang.String"/>
            <xs:attribute name="event" type="xs:string"/>
            <!--属性type类型默认为java.lang.String-->
           </xs:complexType>
          </xs:element>
         </xs:sequence>
         <xs:attribute name="name" type="xs:string"/>
         <xs:attribute name="alertType" type="xs:string"/>
         <xs:attribute name="bean" type="xs:string"/>
         <xs:attribute name="clientValidate" type="xs:boolean" default="false"/>
         <xs:attribute name="serverValidate" type="xs:boolean" default="false"/>
         <xs:attribute name="event" type="xs:string"/>
        </xs:complexType>
       </xs:element>
      </xs:sequence>
     </xs:complexType>
     <xs:unique name="EOneKeyU">
      <xs:selector xpath=".//form"/>
      <xs:field xpath="@name"/>
     </xs:unique>
    </xs:element>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

使用命名空间的XML:
以下内容为程序代码:

<?xml version="1.0" encoding="UTF-8"?>
<easyjf-web xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.easyjfweb.com/easyjf-test"
xsi:schemaLocation="http://www.easyjfweb.com/easyjf-test testunique.xsd">
 <forms>
  <form name="aaa">
   <property name=""/>
  </form>
  <form name="aaa">
   <property name=""/>
  </form>
 </forms>
</easyjf-web>

上面这一个XML就会直接保存,不会报错,而下面不使用命名空间的XML就会正常报错:

以下内容为程序代码:

<?xml version="1.0" encoding="UTF-8"?>
<easyjf-web xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="testunique.xsd">
 <forms>
  <form name="aaa">
   <property name=""/>
  </form>
  <form name="aaa">
   <property name=""/>
  </form>
 </forms>
</easyjf-web>

注:当使用第二个XML时,需要把schema的targetNamespace删除掉。

上面两个XML除了引用schema的方式不一样以外,其他都是一样的,可是验证的结果却不相同,请教schema高手,这是什么原因???


--  作者:gogy
--  发布时间:4/27/2007 12:20:00 AM

--  
xpath1.0不认识默认名称空间,它会把默认名称空间的元素当作无名称空间元素,默认名称空间元素根本无法被正确识别。
需要明确的加前缀。如:
<?xml version="1.0" encoding="UTF-8"?>
<easyjf-web xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ejf="http://www.easyjfweb.com/easyjf-test"
xsi:schemaLocation="http://www.easyjfweb.com/easyjf-test testunique.xsd">
注意下面的xpath要写成:<xs:selector xpath=".//ejf:form"/>。
当然,前缀我随意定的。



--  作者:calmness
--  发布时间:4/27/2007 12:25:00 AM

--  
谢谢这位大哥,终于搞定了
--  作者:gogy
--  发布时间:4/27/2007 12:27:00 AM

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