在xsd 1.1中的xs:anyTipe元素上定义属性断言

时间:2015-06-16 15:29:01

标签: xml xsd

我必须首先定义任何类型元素的序列。我的情况如下:

<staticAction name="Jump" >
    <"anyElementName" reqPoints="" gainedPoints="" />
    <"anyElementName" reqPoints="" gainedPoints="" />
    <"anyElementName" reqPoints="" gainedPoints="" />
    ...
</staticAction>

所以,我的问题是:如何用&#34;动态&#34;定义一个无界的元素序列?名称但具有固定属性(reqPoints和gainPoints)?两个属性都是xs:integer。我考虑过通过断言添加属性,但我仍然不知道如何做到这一点。提前致谢。

1 个答案:

答案 0 :(得分:1)

通常&#34;动态&#34; 名称可以替换,因此可以使用XSD进行调节。例如:

<places>
    <country value="x"/>
    <city value="y"/>
    <town value="z"/>
</places>

<places>
    <place type="country" value="x"/>
    <place type="city" value="y"/>
    <place type="town" value="z"/>
</places>

在这个新案例中,只有属性值是&#34; dynamic&#34; 。这适用于使用XSD建模,这比XPath断言更容易和更具表现力。

但是,如果您确实需要验证具有已知属性和内容类型的&#34; dynamic&#34; 名称,您可以看到带有断言的示例模式(在架构中解释):< / p>

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    vc:minVersion="1.1" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning">
    <xs:element name="staticAction">
        <xs:complexType>
            <xs:complexContent>
                <!-- Base is anyType -->
                <xs:extension base="xs:anyType">
                    <xs:attribute name="name" type="xs:string"/>
                    <!-- Check that every "dynamic" child has the two integer attributes and no other attributes -->
                    <xs:assert test="every $element in ./* satisfies 
                        ($element[
                            matches(@reqPoints, '^[+-]?\d+$') and
                            matches(@gainedPoints, '^[+-]?\d+$') and
                            count(@*=2)])"/>
                    <!-- Test that there is no content in staticAction nor in the "dynamic" nodes -->
                    <xs:assert test="matches(string(.), '^\s*$')"/>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:element>
</xs:schema>

请注意,通过扩展 xs:anyType 并使用该断言,您将获得具有任何名称和这两个属性的无界元素序列。