XML - 在XSD中指定包含子元素的元素的类型

时间:2017-07-18 05:00:40

标签: xml xsd

我正在尝试为现有的XSD文件创建XMLXML包含一个块,如:

<Coords>
          <Coord1>L1:  50,L2: 9 </Coord1>
          <Coord2>L1:  51,L2: 19 </Coord2>
          <Coord3>L1:  521,L2: 29 </Coord3>
          <Coord4>L1:  53,L2: 39 </Coord4>
          <Coord5>L1:  54,L2: 49 </Coord5>
          <Coord6>L1:  55,L2: 59 </Coord6>
</Coords>

由于坐标数不是固定数,我试图在Coords中将xs:string的类型指定为XSD。应对xml进行哪些修改,以便根据XSD进行验证?

当我尝试使用Notepad ++中的XSD验证XML时,我得到的错误为Coords': Element content is not allowed, because the type definition is simple.

XSD部分是:

<xs:element name="Coords" type="xs:string"/> 

2 个答案:

答案 0 :(得分:2)

使用字符串类型的restriction。例如:

<xs:simpleType name="Point">
  <xs:restriction base="xs:string">
    <xs:pattern value="L1\:\s?\d+,\s?L2\:\s?\d+"/>
  </xs:restriction>
</xs:simpleType>

然后就可以应用于您的Coord元素:

<xs:element name="Coords">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Coord" type="Point" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

答案 1 :(得分:0)

XSD试图鼓励良好的XML设计,而不是描述任何可能的输入文档结构。使用元素名称coord1,coord2,coord3 ......绝对不是一个好的XML设计。 (更好的是<coord nr="1"/>,甚至更好,忘记数字,因为它是纯粹的噪音:如果它不存在,你可以重建它。)

所以在XSD 1.0中没有办法准确地说coords有一系列孩子,这些孩子都被命名为coordX,其中X是一个数字,更不用说X代表值1..n按顺序排列。你可以在XSD 1.1中使用断言来做到这一点,当然:

<xs:assert xpath="every $n in * satisfies (matches(name(), 'coord\d+')
and number(substring-after(name(), 'coord')) = count(preceding-sibling::*) + 1"/> 

但是再次阅读您的问题,听起来好像您已准备好修改XML设计。在这种情况下,将所有子项重命名为Coord,并使用由Coords元素序列组成的复杂类型定义Coord,每个元素都具有xs:string类型。