XSD验证非命名空间元素上的命名空间属性?

时间:2017-04-09 13:12:50

标签: xml xsd xml-namespaces xsd-validation xml-validation

我被要求创建模式来验证在XML Schema成为事物之前开发了结构的文档。没有元素在名称中有冒号,但有些属性可以。理论上似乎应该可以用这样的东西来做:

$ cat repro.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns="" xmlns:x="namespace-x" targetNamespace="">
 <xsd:import namespace="namespace-x" schemaLocation="repro.inc"/>
 <xsd:element name="a" type="a"/>
 <xsd:complexType name="a">
  <xsd:simpleContent>
   <xsd:extension base="xsd:string">
    <xsd:attribute ref="x:y"/>
   </xsd:extension>
  </xsd:simpleContent>
 </xsd:complexType>
</xsd:schema>
$ cat repro.inc
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  targetNamespace="namespace-x">
 <xsd:attribute name="y" type="xsd:string"/>
</xsd:schema>

但架构验证器抱怨:

$ cat repro.xml
<a xmlns:x="namespace-x" x:y="foo"/>
$ xmllint --schema repro.xsd repro.xml
<?xml version="1.0"?>
<a xmlns:x="namespace-x" x:y="foo"/>
repro.xml:1: element a: Schemas validity error : Element 'a': No matching global declaration available for the validation root.
repro.xml fails to validate

targetNamespace=""是否意味着此架构文档中定义的元素不使用命名空间?如果没有,如何使用XML Schema验证这些文档?

不幸的是,将元素放在没有前缀(xmlns="other-ns")的命名空间中会破坏使用命名空间感知解析器的大量软件,因此这些方法的解决方案没有吸引力。

1 个答案:

答案 0 :(得分:2)

  

没有targetNamespace =&#34;&#34;表示此架构中定义的元素   文档不使用命名空间?如果没有,那怎么办呢   使用XML Schema验证这些文档?

不,targetNamespace的值绝不能为空;简单地省略targetNamespace而不是命名空间。您也可以从xmlns=""删除xsd:schema

repro.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:x="namespace-x">
  <xsd:import namespace="namespace-x" schemaLocation="repro.inc"/>
  <xsd:element name="a" type="a"/>
  <xsd:complexType name="a">
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:attribute ref="x:y"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
</xsd:schema>

repro.inc repro.xml 就好了。

通过上述更改,您的XSD将成功验证您的XML。