XML-将包含子元素的元素的类型指定为XSD中的字符串

XML-将包含子元素的元素的类型指定为XSD中的字符串,xml,xsd,Xml,Xsd,我正在尝试为现有的XML文件创建XSD。XML包含如下块: <Coords> <Coord1>L1: 50,L2: 9 </Coord1> <Coord2>L1: 51,L2: 19 </Coord2> <Coord3>L1: 521,L2: 29 </Coord3> <Coord4>L1: 53,L2: 39 &

我正在尝试为现有的
XML
文件创建
XSD
XML
包含如下块:

<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>
使用字符串类型。例如:

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

XSD试图鼓励良好的XML设计,而不是使描述任何可能的输入文档结构成为可能。使用元素名coord1、coord2、coord3。。。绝对不是好的XML设计。(最好是
,或者更好的是,忘记数字,因为它是纯噪音:如果没有,你可以重建它。)

因此,在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,并使用由一系列
Coord
元素组成的复杂类型定义
Coord
,每个元素都有type
xs:string

,您可以将string type与正则表达式一起使用。@Jackzz,我建议您使用相同的名称,因为内部元素的数量未知。您可以通过索引或使用附加属性来获取所需的元素。
<xs:element name="Coords">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Coord" type="Point" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:assert xpath="every $n in * satisfies (matches(name(), 'coord\d+')
and number(substring-after(name(), 'coord')) = count(preceding-sibling::*) + 1"/>