Xml 如何检查a<;中的整数和;xs:list itemType=";xs:integer"/&燃气轮机;在XSD1.1中

Xml 如何检查a<;中的整数和;xs:list itemType=";xs:integer"/&燃气轮机;在XSD1.1中,xml,xsd,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:simpleTyp

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

    <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,但只有在我的“演员”属性中有字符串“me”。我的想法是这样的,但不起作用:

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

你能帮我找出问题出在哪里吗?谢谢

根据和:

由列表或联合派生的类型不是原子类型

在这种情况下,您需要知道的重要一点是,模式验证器知道
percentage
属性的类型是一个int列表,因为它是从list派生的(type不是字符串)。因此,在本例中,与
@百分比相关联的数据(例如)是列表
(30,30,40)
,而不是字符串
“30,40”
。这也意味着您不能调用
规范化空间(@percentage)
,因为函数需要字符串。第二个错误是,您将总和的结果与字符串
“100”
而不是数字
100
进行比较

因此,您的断言的总和应该如下所示:

sum(data(@percentage)) = 100

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

Ok perfect!如果我只想在属性actor中有字符串“Me”时检查此总和,该怎么办?不起作用。应该行得通。嗯,不幸的是。。该断言应用于此类节点:如果我不在percentage属性中插入一个总数为100的数字列表,即使actor属性为空,它也会给出错误。我希望“sum=100”仅在actor中存在XML有效的“Me”时才是必需的,再次验证并检查是否没有任何重复的断言或仅包含求和部分的断言。我有另一个断言:但这检查百分比属性中是否有一定数量的整数,这些整数必须与numberOfChoices属性中表示的数字相同。同样,只有当actor属性等于“Me”时,才会签出该属性。。所以我想说的是:当**actor**=“Me”时,检查该属性中有一定数量的整数,但它们的和等于100