XSD 断言属性与嵌套元素的相等性?
XSD to assert equality of attributes against nested elements?
我正在尝试向 XSD (1.1) 架构添加断言,该架构将检查元素的属性与其子元素的值是否相等。
我有以下 XML:
<?xml version="1.0" encoding="UTF-8"?>
<CarList Maker="Tesla">
<Car>
<Year>2010</Year>
<Color>Blue</Color>
<Price>40000</Price>
<Maker>Tesla</Maker>
</Car>
<Car>
<Year>2011</Year>
<Color>White</Color>
<Price>20000</Price>
<Maker>Tesla</Maker>
</Car>
<Car>
<Year>2012</Year>
<Color>Black</Color>
<Price>55000</Price>
<Maker>Tesla</Maker>
</Car>
</CarList>
我想确保 CarList
元素的 Maker
属性是后续 Car 元素中使用的唯一标记。我使用 XSD 1.1,所以我尝试使用 xs:assert
来实现,如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="Year" type="xs:positiveInteger"/>
<xs:element name="Color" type="xs:string"/>
<xs:element name="Price" type="xs:positiveInteger"/>
<xs:element name="Maker" type="MakerType"/>
<xs:simpleType name="MakerType">
<xs:restriction base="xs:string">
<xs:enumeration value="Tesla"/>
<xs:enumeration value="GM"/>
<xs:enumeration value="Ford"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="Car">
<xs:complexType>
<xs:sequence>
<xs:element ref="Year"/>
<xs:element ref="Color"/>
<xs:element ref="Price"/>
<xs:element ref="Maker"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CarList">
<xs:complexType>
<xs:sequence>
<xs:element ref="Car" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="Maker" type="MakerType" use="required"/>
<xs:assert test="Car/Maker eq @Maker"/>
</xs:complexType>
</xs:element>
</xs:schema>
但是当我尝试验证它时(使用 python xmlschema 库)我收到以下错误:
'/' operator at line 1, column 4: [err:XPTY0004] atomized operand is a sequence of length greater than one
xs:assert
元素中 test
属性的 XPath 格式似乎有错误,更具体地说,我尝试访问子元素 Maker
的方式有问题Car
元素。
我做错了什么?知道我怎样才能完成这个断言吗?
您 xs:assert
中的 Car/Maker
XPath 正在选择多个元素,这些元素无法直接与属性值进行比较,@Maker
。
要修复,请将您的 xs:assert
更改为
<xs:assert test="Car/Maker eq @Maker"/>
至
<xs:assert test="every $maker in Car/Maker satisfies $maker eq @Maker"/>
我正在尝试向 XSD (1.1) 架构添加断言,该架构将检查元素的属性与其子元素的值是否相等。
我有以下 XML:
<?xml version="1.0" encoding="UTF-8"?>
<CarList Maker="Tesla">
<Car>
<Year>2010</Year>
<Color>Blue</Color>
<Price>40000</Price>
<Maker>Tesla</Maker>
</Car>
<Car>
<Year>2011</Year>
<Color>White</Color>
<Price>20000</Price>
<Maker>Tesla</Maker>
</Car>
<Car>
<Year>2012</Year>
<Color>Black</Color>
<Price>55000</Price>
<Maker>Tesla</Maker>
</Car>
</CarList>
我想确保 CarList
元素的 Maker
属性是后续 Car 元素中使用的唯一标记。我使用 XSD 1.1,所以我尝试使用 xs:assert
来实现,如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="Year" type="xs:positiveInteger"/>
<xs:element name="Color" type="xs:string"/>
<xs:element name="Price" type="xs:positiveInteger"/>
<xs:element name="Maker" type="MakerType"/>
<xs:simpleType name="MakerType">
<xs:restriction base="xs:string">
<xs:enumeration value="Tesla"/>
<xs:enumeration value="GM"/>
<xs:enumeration value="Ford"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="Car">
<xs:complexType>
<xs:sequence>
<xs:element ref="Year"/>
<xs:element ref="Color"/>
<xs:element ref="Price"/>
<xs:element ref="Maker"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CarList">
<xs:complexType>
<xs:sequence>
<xs:element ref="Car" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="Maker" type="MakerType" use="required"/>
<xs:assert test="Car/Maker eq @Maker"/>
</xs:complexType>
</xs:element>
</xs:schema>
但是当我尝试验证它时(使用 python xmlschema 库)我收到以下错误:
'/' operator at line 1, column 4: [err:XPTY0004] atomized operand is a sequence of length greater than one
xs:assert
元素中 test
属性的 XPath 格式似乎有错误,更具体地说,我尝试访问子元素 Maker
的方式有问题Car
元素。
我做错了什么?知道我怎样才能完成这个断言吗?
您 xs:assert
中的 Car/Maker
XPath 正在选择多个元素,这些元素无法直接与属性值进行比较,@Maker
。
要修复,请将您的 xs:assert
更改为
<xs:assert test="Car/Maker eq @Maker"/>
至
<xs:assert test="every $maker in Car/Maker satisfies $maker eq @Maker"/>