通常「動態」名稱可以被替換,因此它們可以使用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>
在這個新的情況下,只有屬性值是「動態」。這適用於使用XSD進行建模,這比XPath斷言更容易和更具表現力。
但是,如果你真的需要驗證「動態」名稱與已知的屬性和內容類型,你可以看到斷言這個示例模式(該模式中解釋):
<?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並使用該斷言,您將獲得具有任何名稱和這兩個屬性的無限元素序列。
如果您想爲此使用xpath斷言,您需要指定很多事情:每個元素具有reqPoints和gainsPoints屬性,這兩個屬性都是數字,只有兩個屬性並且沒有更多,元素沒有內容等。 ...看看你可以在斷言中使用的符號:'./*中的每個$元素都滿足($ element [@reqPoints和@gainedPoints和count(@ * = 2)等)]'這更容易在XSD中做,因爲它更具表現力,問題是動態名稱,你真的需要它們嗎? – sergioFC
@sergioFC不幸的是我真的需要這些元素是動態的。我不是一般的斷言和xsd方面的專家..你可以使用xs:anyType或xs:any來爲動態元素定義一些代碼,併爲相應的屬性聲明嗎?提前致謝!! – Tarta