XML Schema 1.0 - 限定与不合格:有效实例中的具体更改是什么?

时间:2017-04-03 12:07:01

标签: validation xsd xml-namespaces

假设我有一个有效的XML实例文件(“1”),它只包含其架构targetNamespace中的元素(架构“A”)。该实例对此架构有效。实例1在其(1)根节点上的模式具有正确的名称空间声明,而在其他任何地方都没有。

现在我采用相同的实例1并尝试针对Schema“B”进行验证。

除了我将elementFormDefault="unqualified"更改为elementFormDefault="qualified"之外,

B与A相同。

我看到1未能验证B.为什么?我需要更改1(生成实例“2”)以使其再次对B有效吗?

XML模式的“限定”风格是否仅适用于每个元素都带有显式名称空间前缀的实例?

示例模式:所有模式都基于最小的XML结构,用于传递某些数据结构,如file/record/info1。不幸的是,这些似乎与我的现实世界的例子(这些例子太大而不能在这里发布)的表现不同了。

A:不合格的架构

<?xml version="1.0" encoding="UTF-8"?>
<!-- The UNqualified version -->
<xs:schema elementFormDefault="unqualified" targetNamespace="http://example.com/xsd-prefixes-test"
  xmlns:test="http://example.com/xsd-prefixes-test" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="file">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="test:record" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="record">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="test:info1" />
        <xs:element ref="test:info2" />
      </xs:sequence>
      <xs:attribute name="id" type="xs:integer" use="required" />
      <xs:attribute name="status" type="xs:NCName" use="required" />
    </xs:complexType>
  </xs:element>
  <xs:element name="info1">
    <xs:complexType />
  </xs:element>
  <xs:element name="info2">
    <xs:complexType />
  </xs:element>
</xs:schema>

B:QUALIFIED schema

<?xml version="1.0" encoding="UTF-8"?>
<!-- The QUALIFIED version -->
<xs:schema elementFormDefault="qualified" targetNamespace="http://example.com/xsd-prefixes-test"
  xmlns:test="http://example.com/xsd-prefixes-test" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="file">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="test:record" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="record">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="test:info1" />
        <xs:element ref="test:info2" />
      </xs:sequence>
      <xs:attribute name="id" type="xs:integer" use="required" />
      <xs:attribute name="status" type="xs:NCName" use="required" />
    </xs:complexType>
  </xs:element>
  <xs:element name="info1">
    <xs:complexType />
  </xs:element>
  <xs:element name="info2">
    <xs:complexType />
  </xs:element>
</xs:schema>

示例模式实例:

实例1 - 所有元素上targetNamespace的前缀;验证两种模式

<?xml version="1.0" encoding="UTF-8"?>
<!-- ALL prefixes -->
<test:file xmlns:test="http://example.com/xsd-prefixes-test"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://example.com/xsd-prefixes-test xsd-prefixes-test_qualified.xsd">
    <!-- validates against xsd-prefixes-test_UNqualified.xsd AND xsd-prefixes-test_qualified.xsd -->
    <test:record id="1" status="ok">
        <test:info1 />
        <test:info2 />
        <!-- etc... -->
    </test:record>
    <test:record id="1" status="ok">
        <test:info1 />
        <test:info2 />
        <!-- etc... -->
    </test:record>
    <test:record id="1" status="duplicate_deprecated">
        <test:info1 />
        <test:info2 />
        <!-- etc... -->
    </test:record>
</test:file>

实例2: - 在任何地方都没有名称空间前缀,但仍然对A和B进行验证!

<?xml version="1.0" encoding="UTF-8"?>
<!-- NO prefixes anywhere -->
<file xmlns="http://example.com/xsd-prefixes-test" xmlns:test="http://example.com/xsd-prefixes-test"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://example.com/xsd-prefixes-test xsd-prefixes-test_qualified.xsd">
    <!-- validates against BOTH xsd-prefixes-test_UNqualified.xsd AND xsd-prefixes-test_qualified.xsd -->
    <record id="1" status="ok">
        <info1 />
        <info2 />
        <!-- etc... -->
    </record>
    <record id="1" status="ok">
        <info1 />
        <info2 />
        <!-- etc... -->
    </record>
    <record id="1" status="duplicate_deprecated">
        <info1 />
        <info2 />
        <!-- etc... -->
    </record>
</file>

实例3 - 不对A或B进行验证 - 为什么不?

<?xml version="1.0" encoding="UTF-8"?>
<!-- NO prefixes anywhere -->
<test:file xmlns:test="http://example.com/xsd-prefixes-test"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://example.com/xsd-prefixes-test xsd-prefixes-test_qualified.xsd">
    <!-- validates against NEITHER xsd-prefixes-test_UNqualified.xsd NOR xsd-prefixes-test_qualified.xsd -->
    <record id="1" status="ok">
        <info1 />
        <info2 />
        <!-- etc... -->
    </record>
    <record id="1" status="ok">
        <info1 />
        <info2 />
        <!-- etc... -->
    </record>
    <record id="1" status="duplicate_deprecated">
        <info1 />
        <info2 />
        <!-- etc... -->
    </record>
</test:file>

错误消息(与架构A和B相同):

我看到这个错误或者与1和2模式的实例文件非常相似,当与“相反”风格的模式一起使用时(带有前缀的实例与不合格的模式)。

相反,我看到样式3的实例确实根据限定类型模式进行验证。

  • 是否依赖于使用的语言/解析器/验证引擎?

0 个答案:

没有答案