XSD 检查所有元素匹配项是否在整个 XML 文件中包含相同的值

XSD to check if all element occurrence contains the same value in the whole XML file

提问人:Filipe Santos 提问时间:9/29/2020 更新时间:9/29/2020 访问量:137

问:

我正在寻找一个 XSD 来验证包含具有许多付款的文件元素的 XML 是否具有相同的货币。

例:

<Payments>
    <Payment>
        <PaymentDate>2020-09-28</PaymentDate>
        <Amount>11</Amount>
        <Currency>USD</Currency>
    </Payment>
    <Payment>
        <PaymentDate>2020-09-27</PaymentDate>
        <Amount>19</Amount>
        <Currency>USD</Currency>
    </Payment>
    <Payment>
        <PaymentDate>2020-09-27</PaymentDate>
        <Amount>12</Amount>
        <Currency>USD</Currency>
    </Payment>
</Payments>

应将上面的 XML 视为有效,因为所有元素都包含相同的货币信息。<Currency>

但是,以下 XML 不应有效,因为它至少包含一笔具有不同货币信息的付款:

    <Payments>
        <Payment>
            <PaymentDate>2020-09-28</PaymentDate>
            <Amount>11</Amount>
            <Currency>USD</Currency>
        </Payment>
        <Payment>
            <PaymentDate>2020-09-27</PaymentDate>
            <Amount>19</Amount>
            <Currency>EUR</Currency>
        </Payment>
        <Payment>
            <PaymentDate>2020-09-27</PaymentDate>
            <Amount>12</Amount>
            <Currency>USD</Currency>
        </Payment>
    </Payments>

我应该为我的 XSD 做些什么? 谢谢!

XML XSD 验证 值限制

评论


答:

0赞 Michael Kay 9/29/2020 #1

这需要带有断言的 XSD 1.1:

<xs:assert test="count(distinct-values(.//Currency)) = 1"/>

我认为 XSD 1.0 没有任何方法可以做到这一点。

评论

0赞 zx485 9/29/2020
我也想出了这样的东西。但它在任何地方都被拒绝了(我创建了一个 MCVE)。它在语法上似乎是正确的,但我无法将其放入 XSD-1.1 验证器的完整场景中。hu.unideb.inf.validator.SchemaValidator
0赞 zx485 9/29/2020 #2

只是为了提供 MCVE(这不应被视为答案):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema version="1.1" xmlns:xs="http://www.w3.org/2001/XMLSchema"  elementFormDefault="unqualified">

  <xs:element name="Payments">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Payment" maxOccurs="unbounded">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="PaymentDate" />
                <xs:element name="Amount" />
                <xs:element name="Currency" />
              </xs:sequence>
            </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:assert test="count(distinct-values(Payment/Currency)) = 1" />
    </xs:complexType>
  </xs:element>
  
</xs:schema>

这是行不通的。
这仅作为其他人在此基础上提供。