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



我正在尝试为现有的XML文件创建一个XSDXML包含一个块,如下所示:

<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的类型指定为XSD中的xs:string。应该对xml进行哪些修改,以便可以根据该XSD对其进行验证?

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

XSD 部分是:

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

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

<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>

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(), 'coordd+')
and number(substring-after(name(), 'coord')) = count(preceding-sibling::*) + 1"/> 

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

相关内容

最新更新