我必须首先定义任何类型元素的序列。我的情况如下:
<staticAction name="Jump" >
<"anyElementName" reqPoints="" gainedPoints="" />
<"anyElementName" reqPoints="" gainedPoints="" />
<"anyElementName" reqPoints="" gainedPoints="" />
...
</staticAction>
所以,我的问题是:如何用&#34;动态&#34;定义一个无界的元素序列?名称但具有固定属性(reqPoints和gainPoints)?两个属性都是xs:integer。我考虑过通过断言添加属性,但我仍然不知道如何做到这一点。提前致谢。
答案 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 并使用该断言,您将获得具有任何名称和这两个属性的无界元素序列。