XSD元素与不同命名空间中的类型声明?

问题描述 投票:1回答:1

我有许多XSD架构,它们是由另一个导入的。当针对类似于主包装器的XSD进行验证时,验证器似乎并未将类型与正确的XSD相关联。它似乎在某种程度上混淆了名称空间。

作为最小的示例,请考虑以下两个XSD,每个XSD定义了自己的类型和名称空间:

a.xsd定义a-type

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:tns="http://a"
           targetNamespace="http://a"
           elementFormDefault="qualified"
           attributeFormDefault="qualified">

  <xs:simpleType name="a-type">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>

</xs:schema>

b.xsd定义b-type

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:tns="http://b"
           targetNamespace="http://b"
           elementFormDefault="qualified"
           attributeFormDefault="qualified" >

  <xs:simpleType name="b-type">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>

</xs:schema>

ab.xsd使用上面定义的类型定义自己的ab-type

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:a="http://a"
           xmlns:b="http://b"
           xmlns:tns="http://ab"
           targetNamespace="http://ab"
           elementFormDefault="qualified"
           attributeFormDefault="qualified" >

  <xs:import namespace="http://a" schemaLocation="a.xsd"/>
  <xs:import namespace="http://b" schemaLocation="b.xsd"/>

  <xs:complexType name="ab-type">
    <xs:sequence maxOccurs="1">
      <xs:element name="a-tag" type="a:a-type"/>
      <xs:element name="b-tag" type="b:b-type"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="ab-tag" type="tns:ab-type"/>

</xs:schema>

当我针对以下XML文件验证它时:

<?xml version="1.0" encoding="UTF-8"?>
<ab:ab-tag
    xmlns:ab="http://ab"
    xmlns:a="http://a"
    xmlns:b="http://b">
  <a:a-tag>A</a:a-tag>
  <b:b-tag>B</b:b-tag>
</ab:ab-tag>

我从xmllint --schema ab.xsd ab.xml中收到以下错误:

ab.xml:6:元素a-tag:架构有效性错误:元素{http://a}a-tag:不需要此元素。预期为({http://ab}a-tag)。ab.xml无法验证

使用xsd11-validator.jar验证时,我也有类似的错误。因此,即使我在ab.xsd中指定a-tag的类型为a:a-tag,它似乎仍然尝试将其与ab中的命名空间相关联。

xml xsd xsd-validation xml-validation xmllint
1个回答
0
投票
在XSD中从另一个XML名称空间定义的

A type与在另一个XML名称空间中定义的element不同。

要在a-tag命名空间中放置http://a,实际上必须在该命名空间中放置元素声明...

a.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:tns="http://a"
  targetNamespace="http://a"
  elementFormDefault="qualified"
  attributeFormDefault="qualified">

  <xs:simpleType name="a-type">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:element name="a-tag" type="tns:a-type"/>
</xs:schema>

b.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:tns="http://b"
  targetNamespace="http://b"
  elementFormDefault="qualified"
  attributeFormDefault="qualified" >

  <xs:simpleType name="b-type">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:element name="b-tag" type="tns:b-type"/>

</xs:schema>

ab.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:a="http://a"
  xmlns:b="http://b"
  xmlns:tns="http://ab"
  targetNamespace="http://ab"
  elementFormDefault="qualified"
  attributeFormDefault="qualified" >

  <xs:import namespace="http://a" schemaLocation="a.xsd"/>
  <xs:import namespace="http://b" schemaLocation="b.xsd"/>

  <xs:complexType name="ab-type">
    <xs:sequence maxOccurs="1">
      <xs:element ref="a:a-tag"/>
      <xs:element ref="b:b-tag"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="ab-tag" type="tns:ab-type"/>

</xs:schema>

ab.xml

<?xml version="1.0" encoding="UTF-8"?>
<ab:ab-tag
  xmlns:ab="http://ab"
  xmlns:a="http://a"
  xmlns:b="http://b">
  <a:a-tag>A</a:a-tag>
  <b:b-tag>B</b:b-tag>
</ab:ab-tag>

如上定义,ab.xmlab.xsd有效。

© www.soinside.com 2019 - 2024. All rights reserved.