XSD 检查所有元素是不是在整个 XML 文件中包含相同的值
Posted
技术标签:
【中文标题】XSD 检查所有元素是不是在整个 XML 文件中包含相同的值【英文标题】: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 应该被认为是有效的,因为所有 <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 做些什么? 谢谢!
【问题讨论】:
【参考方案1】:这需要带有断言的 XSD 1.1:
<xs:assert test="count(distinct-values(.//Currency)) = 1"/>
我认为 XSD 1.0 没有任何办法。
【讨论】:
我也想出了这样的东西。但它在任何地方都被拒绝了(我创建了一个 MCVE)。它似乎在语法上是正确的,但我无法将它用于使用 XSD-1.1hu.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>
它不起作用。 这只是作为其他人工作的基础。
【讨论】:
以上是关于XSD 检查所有元素是不是在整个 XML 文件中包含相同的值的主要内容,如果未能解决你的问题,请参考以下文章