1

我正在学习如何编写 XML 模式,我想定义一个 XML 模式来验证这样的 XML 结构:

<mylist myattr="1">1 2 3 4 5 6 7</mylist>

因此,我试图定义一个complexType使用list并具有一个属性的。

这是我想出的架构:

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

  <xs:complexType name="mylist-type">
    <xs:simpleContent>
      <xs:extension base="xs:list" >
        <xs:attribute name="myattr" type="xs:integer"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:element name="mylist" type="mylist-type"/>
</xs:schema>

当我使用http://www.freeformatter.com/xml-validator-xsd.html针对架构验证 XML 时,我收到错误

Src-resolve.4.2: Error Resolving Component 'xs:list'. 
It Was Detected That 'xs:list' Is In Namespace 'http://www.w3.org/2001/XMLSchema', 
But Components From This Namespace Are Not Referenceable From Schema Document 'null'.
If This Is The Incorrect Namespace, Perhaps The Prefix Of 'xs:list' Needs To Be Changed.
If This Is The Correct Namespace, Then An Appropriate 'import' Tag Should Be Added To null'.

但是,如果我简单地更改xs:listxs:string,模式验证没有问题,这对我来说提出了一个问题,它是否真的是一个命名空间问题。

我究竟做错了什么?

4

2 回答 2

0

利用

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

  <xs:simpleType name="int-list">
     <xs:list itemType="xs:integer"/>
  </xs:simpleType>

  <xs:complexType name="mylist-type">
    <xs:simpleContent>
      <xs:extension base="int-list" >
        <xs:attribute name="myattr" type="xs:integer"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:element name="mylist" type="mylist-type"/>
</xs:schema>

所以基本上首先定义一个特定的列表类型,然后在你的扩展中使用该列表类型。

于 2013-11-10T13:14:34.213 回答
0

您的草稿模式定义mylist-type为 type 的扩展xs:listlist但是在 XSD 命名空间中没有命名数据类型。替换名称时错误消失的原因xs:string有一个名为 xs:string 的类型。

当您的处理器告诉您“可能需要更改 'xs:list' 的前缀”时,它猜测您的意思可能是list其他命名空间中的类型。

[附录] xs:list什么,你问,如果不是类型?它是从其他简单类型派生简单类型的三种方法之一。例如,以下类型声明描述了一个整数列表,由空格分隔。xs:list 元素上的itemType属性表示列表中的项目具有什么类型。

<xs:simpleType name="list-of-integer">
  <xs:list itemType="xs:integer"/>
</xs:simpleType>

在 XSD 中,通常使用匿名类型来代替命名类型;在这种情况下,相关的 simpleType 元素显示为 xs:list 的子元素。在下面的声明中,内部的 simpleType 元素声明了一个类型,其值是从 0 到 100 的整数(包括 0 到 100)(例如,课程中测验使用的分数等级),而外部的 simpleType 元素声明了一个类型,该类型由以下各项组成:这样的数字。

<xs:simpleType name="list-of-grades">
  <xs:list>
    <xs:simpleType>
      <xs:restriction base="xs:integer">
        <xs:minInclusive value="0"/>
        <xs:maxInclusive value="100"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:list>
</xs:simpleType>
于 2013-11-12T00:15:20.223 回答