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