如何在XSD 1.1中查看<xs:list itemtype =“xs:integer”>中的整数之和

时间:2015-06-19 15:32:29

标签: xml xsd

我有几个以这种方式定义的属性:

    <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”属性中有字符串的情况下“我”。我认为是这样的,但它不起作用:

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

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

1 个答案:

答案 0 :(得分:1)

根据XSD 1.1 specsXPath 2.0 Data Model specs

  

list或union派生的类型不是原子的。

在这种情况下,您需要知道的重要事情是Schema验证器知道您的percentage属性的类型是一个int列表,因为它是从list派生的(type不是一个字符串)。因此,在这种情况下,数据与@percentage相关联(例如)列表(30, 30, 40)而不是字符串"30 30 40"。这也意味着您无法调用normalize-space(@percentage),因为函数需要一个字符串。您的第二个错误是您要将总和的结果与字符串"100"进行比较而不是数字100

因此,你的断言的总和比较应该像这样简单:

sum(data(@percentage)) = 100

编辑:将数据()添加到表达式,以便它也使用xerces进行验证。