2

目标:创建一个 complexType,允许元素“跳过”以任何顺序包含任何元素、任意次数,并验证我的 xml 没有错误。

架构:skip.xsd

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema
  xmlns="http://www.example.com/main"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://www.example.com/main" 
  attributeFormDefault="unqualified" 
  elementFormDefault="qualified"
  >

  <xs:complexType name="skip">
    <xs:sequence>
      <xs:any minOccurs="1" 
              maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

</xs:schema>

我将 skip.xsd 导入我的 main.xsd

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema
  xmlns:esc="http://www.escmatrix.com/main"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://www.example.com/main" 
  attributeFormDefault="unqualified" 
  elementFormDefault="qualified"
  >

    <xs:include 
      schemaLocation="http://www.example/skip" />

    <xs:element name="tasks">
      <xs:complexType>
        <xs:choice minOccurs="0" 
                   maxOccurs="unbounded" >
          <xs:element name="skip" 
                      type="esc:skip" />
        </xs:choice>
      </xs:complexType>
    </xs:element>
<xs:schema>

我需要验证可以具有以下形式的 xml:

<skip>
   <anyelement1></anyelement1>
   <anyelement2></anyelement2>
   <anyelementN></anyelementN>
</skip>

问题:验证时出错;“cvc-complex-type.2.4.c:匹配的通配符是严格的,但找不到元素'anyelement1'的声明”

4

1 回答 1

6

如果您显示的架构文档产生了您引用的错误消息,那将是令人惊讶的;我希望您的第一个问题是您的架构文档(您说)名为 skip.xsd,但相关 xs:include 上的 schemaLocation 属性指向http://example.com/skip,而您的第二个问题是您的跳过类型位于命名空间http://www.example.com/main中,但跳过元素的声明引用了命名空间http://escmatrix.com/main中的类型。但我想这些只是在减少问题的示例代码时犯的笔误。

错误消息非常清楚:您的通配符被解释为严格的通配符,因此匹配它的元素应该有声明,如果没有,则文档无效。您的通配符是一个严格的通配符,因为您没有processContents为其指定属性,默认processContents值为strict. 如果要允许未声明的元素,则需要指定processContents="lax"processContents="skip"-- 如果确实存在声明的元素应根据这些声明进行验证,则使用宽松的通配符,如果不希望它们在全部,在这种情况下skip只要其子元素格式正确,元素就会有效。你说你想要一个“验证我的xml没有错误”的模式,我猜你的意思是“接受我的XML在所有情况下都有效”(处理器已经正确并成功地检查了你的输入的有效性而没有失败,所以它是已经验证了您的 XML 且没有错误),所以看起来您想要一个跳过通配符。

于 2013-06-19T16:19:49.593 回答