我有几个以这种方式定义的属性:
<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'"/>
你能帮我找出问题所在吗?谢谢!
答案 0 :(得分:1)
根据XSD 1.1 specs和XPath 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进行验证。