论坛首页 入门技术论坛

xml schema中unique无法识别默认命名空间的问题

浏览 3491 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-27  
今天在写schema的时候,遇到一个问题如下
例如schema文件代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
 <xsd:element name="rootElement">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="elementOne" maxOccurs="unbounded">
     <xsd:complexType>
      <xsd:attribute name="elementOneKey" type="xsd:integer"/>
      <xsd:attribute name="elementOneDesc" type="xsd:string"/>
     </xsd:complexType>
    </xsd:element>
   </xsd:sequence>
  </xsd:complexType>
  <xsd:unique name="EOneKeyU">
   <xsd:selector xpath=".//elementOne"/>
   <xsd:field xpath="@elementOneKey"/>
  </xsd:unique>
 </xsd:element>
</xsd:schema>


这里对elementOne元素的elementOneKey属性设置了唯一性,在测试过程中,首先用以下XML代码进行测试:

<?xml version="1.0" encoding="UTF-8"?>
<rootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd">
 <elementOne elementOneKey="1" elementOneDesc="a"/>
 <elementOne elementOneKey="1" elementOneDesc="b"/>
</rootElement>


因为elementOneKey的取值重复,验证报错,这个XML是通过本地文件直接指定schema的,并没有使用命名空间,为了使用命名空间指定,将两个文件的改为如下:
schema
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns="http://www.uniquetest.com/uniquetest"
 targetNamespace="http://www.uniquetest.com/uniquetest"
elementFormDefault="qualified" attributeFormDefault="unqualified">
 <xsd:element name="rootElement">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="elementOne" maxOccurs="unbounded">
     <xsd:complexType>
      <xsd:attribute name="elementOneKey" type="xsd:integer"/>
      <xsd:attribute name="elementOneDesc" type="xsd:string"/>
     </xsd:complexType>
    </xsd:element>
   </xsd:sequence>
  </xsd:complexType>
  <xsd:unique name="EOneKeyU">
   <xsd:selector xpath=".//elementOne"/>
   <xsd:field xpath="@elementOneKey"/>
  </xsd:unique>
 </xsd:element>
</xsd:schema>


XML:
<?xml version="1.0" encoding="UTF-8"?>
<rootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.uniquetest.com/uniquetest"
xsi:schemaLocation="http://www.uniquetest.com/uniquetest schema.xsd">
 <elementOne elementOneKey="1" elementOneDesc="a"/>
 <elementOne elementOneKey="1" elementOneDesc="b"/>
</rootElement>


按照schema的约定,该XML验证时将会出错,然而事实上却并没有如期报错,正常保存,为了这个问题我简直抓破脑袋,后来终于搞清楚原因了,就是因为xpath1.0不认识默认名称空间,它会把默认名称空间的元素当作无名称空间元素,默认名称空间元素根本无法被正确识别,所以需要明确的加前缀。

因此我就把schema改成:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:tst="http://www.uniquetest.com/uniquetest"
 targetNamespace="http://www.uniquetest.com/uniquetest"
elementFormDefault="qualified" attributeFormDefault="unqualified">
 <xsd:element name="rootElement">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="elementOne" maxOccurs="unbounded">
     <xsd:complexType>
      <xsd:attribute name="elementOneKey" type="xsd:integer"/>
      <xsd:attribute name="elementOneDesc" type="xsd:string"/>
     </xsd:complexType>
    </xsd:element>
   </xsd:sequence>
  </xsd:complexType>
  <xsd:unique name="EOneKeyU">
   <xsd:selector xpath=".//tst:elementOne"/>
   <xsd:field xpath="@elementOneKey"/>
  </xsd:unique>
 </xsd:element>
</xsd:schema>


将默认命名空间改成前缀为tst,然后xpath指向".//tst:elementOne",接着就搞定,验证正常,希望本文对遇到同一问题的朋友能有所帮助吧。
   发表时间:2007-05-12  
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics