xml - XSD 断言嵌套元素的属性相等?

标签 xml xsd xsd-validation xml-validation xsd-1.1

我正在尝试向 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 格式似乎存在错误,更具体地说,是我尝试访问 sub 的方式存在错误。 Car 元素的 Maker 元素。

我做错了什么?知道如何实现这个断言吗?

最佳答案

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

关于xml - XSD 断言嵌套元素的属性相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64593524/

相关文章:

javascript - 按字母顺序对 <li> 元素进行排序

c# - 如何解决数据集错误 - 数据集不支持 'union' 或 'list' 作为 simpleType

xslt - ID/IDREFS 在 XML Schema 中的使用

xml - 根据所使用的 XML 解析器出现 XML 验证问题.....我如何表示要普遍接受的约束

visual-studio-2012 - 基本的 XSD 导入和 xsd.exe?

java - 如何使用 xsd 验证 xml?

java - 如何在 Web 应用程序中加载多个 XSD?

java - 在同一个Android Studio页面中显示两个listView

xml - 如何使用 XSL 从 XML 中删除属性并删除根元素

xml - XSLT 2.0 将 xml 中所有出现的 'true/false' 替换为 'yes/no'