Xsd XML模式1.1:断言具有匹配id值的允许同级数

Xsd XML模式1.1:断言具有匹配id值的允许同级数,xsd,xpath-2.0,Xsd,Xpath 2.0,我有以下(预期有效)XML: 1. 1. 1. 2. 使用XSD 1.1和XPath 2.0,我想断言与“A”共享相同“id”值的名为“B”的元素的最大数量。具体地说,我想将名为“B”且“id”=1的元素的数量限制为2次。我不在乎有多少名为B的元素与A的id=“1”不匹配的其他“id”值(因此可能有一百万个2),它仍然会验证 下面是我尝试使用assert指令中的XPath 2.0表达式执行此操作的XML模式1.1: <xs:schema xmlns:xs="http://www.w3.

我有以下(预期有效)XML:


1.
1.
1.
2.
使用XSD 1.1和XPath 2.0,我想断言与“A”共享相同“id”值的名为“B”的元素的最大数量。具体地说,我想将名为“B”且“id”=1的元素的数量限制为2次。我不在乎有多少名为B的元素与A的id=“1”不匹配的其他“id”值(因此可能有一百万个
2
),它仍然会验证

下面是我尝试使用assert指令中的XPath 2.0表达式执行此操作的XML模式1.1:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Series" type="series"/>
  <xs:complexType name="series">
    <xs:sequence>
        <xs:element name="A" type="a"/>
        <xs:element name="B" type="b" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="a">
    <xs:sequence>
      <xs:element name="id" type="xs:string"/>
    </xs:sequence>
    <xs:assert test="count(following-sibling::element(B)[id/text() = ./id/text()]) eq 2"/>
  </xs:complexType>
  <xs:complexType name="b">
    <xs:sequence>
        <xs:element name="id" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

但是我的断言总是会失败,并显示一条cvc断言错误消息。如果我尝试将断言放宽为仅
,它仍然会失败,因此XML Schema 1.1似乎无法处理所有XPath 2.0构造


一般来说,在XML Schema 1.1中,有没有一种方法可以对同级进行断言?谢谢!

我找到了如何控制允许的同级数量的问题的答案。关键是不要将断言放在同级的类型中,而是放在父级中。assert子句也因此被更改为:
child::element(A)/id中的每一个$aid都满足(count(child::element(B)[child::id=$aid])le2)
。至于我在最后提出的关于在XSD 1.1中对兄弟姐妹进行断言的更一般性问题,我还没有开始弄清楚这一点

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Series" type="series"/>
    <xs:complexType name="series">
        <xs:sequence>
            <xs:element name="A" type="a"/>
            <xs:element name="B" type="b" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:assert test="every $aid in child::element(A)/id satisfies (count(child::element(B)[child::id = $aid]) le 2)"/>
    </xs:complexType>
    <xs:complexType name="a">
        <xs:sequence>
            <xs:element name="id" type="xs:string"/
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="b">
         <xs:sequence>
            <xs:element name="id" type="xs:string"/>
         </xs:sequence>
    </xs:complexType>
 </xs:schema>

XMLSchema1.1断言可以处理所有XPath2.0,但根据规范()

1.3根据“部分”·模式验证后信息集·,按照[XDM]中的描述构造数据模型实例。[XDM]实例的根节点由E构造;数据模型实例仅包含该节点以及由[attributes]、[children]和E的后代构造的节点。

注意:这种构造的结果是,尝试在断言中引用E的兄弟或祖先,或引用E本身之外的输入文档的任何部分,都将失败。。这种尝试的引用本身不是错误,但用于评估它们的数据模型实例不包括任何错误表示文件中E以外的任何部分,因此不能引用这些部分

(我的粗体)。在评估断言时,子树只根在承载断言的元素上,因此如果要断言树的不同部分中的元素之间的关系,必须将断言放在它们的一个共同祖先上


我假设它是这样设计的,允许验证解析器在解析过程中,在相关元素的末尾评估断言,而不必等到整个树构建完成,然后再评估所有断言。

我只是试图解决最后一个更一般的问题,即在X中对兄弟进行断言SD1.1.我尝试将其放入“a”类型,但运气不好:self::a/id中的每个$aid都满足(count(parent::element(Series)[child::B/id=$aid])le2)请参见我的答案,了解其不起作用的原因,但还要注意
child::element(B)
可以缩短为
B
-您的整个断言可以
每满足a中的$a(计数(B[id eq$a/id])le2)
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Series" type="series"/>
    <xs:complexType name="series">
        <xs:sequence>
            <xs:element name="A" type="a"/>
            <xs:element name="B" type="b" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:assert test="every $aid in child::element(A)/id satisfies (count(child::element(B)[child::id = $aid]) le 2)"/>
    </xs:complexType>
    <xs:complexType name="a">
        <xs:sequence>
            <xs:element name="id" type="xs:string"/
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="b">
         <xs:sequence>
            <xs:element name="id" type="xs:string"/>
         </xs:sequence>
    </xs:complexType>
 </xs:schema>