如何在 XSD 1.1 中检查 <xs:list itemType="xs:integer"/> 中的整数总和

How to check out the sum of integers in a <xs:list itemType="xs:integer"/> in XSD 1.1

我有几个这样定义的属性:

    <xs:attribute name="actor" type="xs:string" use="required"/>
    <xs:attribute name="percentage" use="required">
        <xs:simpleType>
            <xs:list itemType="xs:integer"/>
        </xs:simpleType>
    </xs:attribute>

我需要做的是创建一个断言,检查该列表中的整数总和(注意空格)是否等于 100,但仅限于我的 "actor" 属性有字符串 "Me"。我的想法是这样的,但它不起作用:

<xs:assert test="@actor != 'Me' or sum (tokenize(normalize-space((@percentage)),'\s')) = '100'"/>

你能帮我找出问题所在吗?谢谢!

根据XSD 1.1 specs and XPath 2.0 Data Model specs

Types derived by list or union are not atomic.

在这种情况下,您需要知道的重要事情是架构验证器知道您的 percentage 属性的类型是一个整数列表,因为它是从列表派生的(类型不是一个字符串)。所以在这种情况下,与 @percentage 关联的数据是(例如)列表 (30, 30, 40) 而不是字符串 "30 30 40"。这也意味着您不能调用 normalize-space(@percentage),因为该函数需要一个字符串。您的第二个错误是您将求和结果与字符串 "100" 而不是数字 100.

进行比较

所以你的断言的总和比较应该像这样简单:

sum(data(@percentage)) = 100

编辑:向表达式添加了 data(),因此它也使用 xerces 进行验证。