首页 > 解决方案 > 可以验证为 xsd:any 给出的元素结构吗?

问题描述

我偶然发现了这个关于 xsd:any 的w3schools 条目(请不要评论一般使用 w3schools 作为参考,这个问题是关于 w3schools 在这种特殊情况下是否正确)。它基本上描述了您将此元素作为基础(在某些模式中family.xsd):

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
      <xs:any minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

然后,您定义了一个额外的架构children.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="https://www.w3schools.com"
           xmlns="https://www.w3schools.com"
           elementFormDefault="qualified">
  <xs:element name="children">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="childname" type="xs:string"
                    maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema> 

现在他们说基于这些模式,你可以编写这个有效的文档:

<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns="http://www.microsoft.com"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.microsoft.com family.xsd
                             https://www.w3schools.com children.xsd">
  <person>
    <firstname>Hege</firstname>
    <lastname>Refsnes</lastname>
    <children>
      <childname>Cecilie</childname>
    </children>
  </person>
  <!-- ... -->
</persons>

假设未显示其定义的周围结构是有效的,我的问题是:验证器是否可以并且将实际检查<children>此处元素的正确结构,如果可以,如何?

我的理解是第二个模式定义了一个根是<children>元素的文档。但是,XSD 不提供从元素名称到类型的直接映射,因为在不同范围内具有相同名称的元素可能具有不同的类型(对吗?)。因此,正如我所看到的,验证器无法知道<children>内部给出的元素<person>实际上应该根据第二个模式中的定义进行验证。因此,第二个模式在这里是无用的,即使<children>包含一些元素,文档也是有效的<foo/>。那是对的吗?

标签: xmlvalidationxsd

解决方案


上的processContents="strict"属性xs:any表示此处出现的元素必须具有全局元素声明,并且必须针对该声明有效。对于任何给定的元素名称,只能有一个全局元素声明(全局声明是作为 的子项出现的声明xs:schema)。

在您的情况下,由于命名空间,该文档无效。children.xsd您的架构文档的目标名称空间是https://www.w3schools.com,但children实例中的元素在名称空间中http://www.microsoft.com。所以验证器应该报告没有children找到全局元素声明。


推荐阅读