2015-06-16 163 views
0

我必須首先定義任何類型元素的序列。我的情況是這樣的:在xsd中定義屬性斷言xsd 1.1中的anyTipe元素

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

所以,我的問題是:我怎麼能定義一個「動態」的名字,但有固定屬性(reqPoints和gainedPoints)元素的無限序列?這兩個屬性都是xs:整數。我想通過斷言添加屬性,但仍然不知道如何去做。提前致謝。

+0

如果您想爲此使用xpath斷言,您需要指定很多事情:每個元素具有reqPoints和gainsPoints屬性,這兩個屬性都是數字,只有兩個屬性並且沒有更多,元素沒有內容等。 ...看看你可以在斷言中使用的符號:'./*中的每個$元素都滿足($ element [@reqPoints和@gainedPoints和count(@ * = 2)等)]'這更容易在XSD中做,因爲它更具表現力,問題是動態名稱,你真的需要它們嗎? – sergioFC

+0

@sergioFC不幸的是我真的需要這些元素是動態的。我不是一般的斷言和xsd方面的專家..你可以使用xs:anyType或xs:any來爲動態元素定義一些代碼,併爲相應的屬性聲明嗎?提前致謝!! – Tarta

回答

1

通常「動態」名稱可以被替換,因此它們可以使用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並使用該斷言,您將獲得具有任何名稱和這兩個屬性的無限元素序列。

+0

這是工作!再次感謝:)我已經接受它作爲答案,但如果可能,我想問你一些問題:我通過使用簡單的xs:sequence在我的xml文件的開頭聲明這些StaticActions,因爲我需要這些中的3個一定的順序。在那裏,我想確保這3個staticAction具有合適的名稱(通過您在解決方案中指定的「name」屬性):「Jump」「Greetings」和「Eat」。所以我需要檢查一下,在我的XML中,通過一個簡單的斷言,他們中的3個都是「Jump」,「Greetings」和「Eat」。請你幫助我嗎? – Tarta

+0

@Tarta當然,你可以聲明'/ root/staticAction [1] ='Jump'和/ root/staticAction [2] = ...'等。斷言中使用的語言是XPath,如果你想讓你可以閱讀這是一個很好又簡單的[XPath教程](http://www.w3schools.com/xpath/xpath_syntax.asp),它顯示了您可以在斷言中使用的XPath的基礎知識。 – sergioFC

+0

嗯不知何故,它不工作..我試圖應用它的方式,你寫它,但它似乎不工作。你給我的鏈接目前是離線的哈哈(幸運啊?:))我寫了另一個包含這一點的問題,所以也許回答比在這裏通過評論更容易回答..這是問題的第2點在這個鏈接:[鏈接](http:// stackoverflow。com/questions/30896717/definitions-assertions-depends-on-both-attributes-and-elements-in-xsd-1-1) 如果你還可以幫我一點,我會讓你成爲雕像,因爲我會幾乎完成我的項目:) – Tarta