【问题标题】:XSD to check if all element occurrence contains the same value in the whole XML fileXSD 检查所有元素是否在整个 XML 文件中包含相同的值
【发布时间】:2021-01-14 10:39:32
【问题描述】:

我正在寻找一个 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 应该被认为是有效的,因为所有 &lt;Currency&gt; 元素都包含相同的货币信息。

但是,以下 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-validation value-restriction


    【解决方案1】:

    这需要带有断言的 XSD 1.1:

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

    我认为 XSD 1.0 没有任何办法。

    【讨论】:

    • 我也想出了这样的东西。但它在任何地方都被拒绝了(我创建了一个 MCVE)。它似乎在语法上是正确的,但我无法将它用于使用 XSD-1.1 hu.unideb.inf.validator.SchemaValidator 验证器的完整场景。
    【解决方案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>
    

    它不起作用。
    这只是作为其他人工作的基础。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2021-06-20
      • 1970-01-01
      • 2012-08-21
      相关资源
      最近更新 更多