如何在 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 进行验证。
我有几个这样定义的属性:
<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 进行验证。