2015-04-01 117 views
3

我有一個看起來像這樣的XML:我正在尋找一種方式來強制執行包含在Artifact小號Artifact元素的數量限制數量

<Artifacts count="2"> 
    <Artifact> 
    ... 
    </Artifact> 
    <Artifact> 
    ... 
    </Artifact> 
</Artifacts> 

應通過使用XSD模式等於「count」屬性的值。

儘管我找到了通過使用XSD 1.1規範來實現這一目標的可能方法,但我想知道如果沒有它,即基於XSD 1.0規範,它是否完全有可能。


編輯:我會嘗試提供一個更多的問題的上下文,以便更加精確。
XML文件將作爲輸入提供給C++應用程序。問題在於開發環境強制使用Xerces v。2.8.0庫進行分析。據我瞭解,這個版本不支持XSD 1.1標準。

當然,我可以添加額外的代碼,以便在XSD驗證後檢查Artifact元素的正確出現次數。我希望有一種方法可以避免額外的代碼段,並完全驗證基於XSD的輸入文件。

回答

2

您想要建模的約束類型的正確術語是聲明。不,XML Schema 1.0中不可能存在斷言。支持斷言的唯一驗證語言是XML Schema 1.1(xs:assert)和Schematron(sch:assertsch:report)。

除此之外,你可以寫正確的數量Artifact元素測試XPath表達式或XSLT樣式表:

/Artifacts/@count = count(/Artifacts/Artifact) 

的XML文件將被作爲輸入提供給C++應用程序。問題在於開發環境強制使用Xerces v。2.8.0庫進行分析。據我瞭解,這個版本不支持XSD 1.1標準。

我的猜測是,Xerces的2.8.0(過時的版本,不再支持)不符合XSD 1.1,但要找出最簡單的方法是簡單地測試它。在模式中包含任何xs:assert並查看會發生什麼。

當然,我可以添加額外的代碼,以便在XSD驗證後檢查「Artifact」元素的出現次數。我希望有一種方法可以避免額外的代碼段,並完全驗證基於XSD的輸入文件。

不,只有XSD 1.0你不能避免這些額外的代碼行。


編輯在評論中寫道什麼@kjhughes實際上應該是答案的一部分:

這是正確的,我也將挑戰OP的設計要求,僅僅反映了一個屬性子屬性的數量。

從XML設計的角度來看,如果這個屬性除了說明有多少個Artifact元素,其他什麼都沒有,爲什麼你把它包含在第一位呢?您應該始終不願意存儲冗餘信息和可恢復的信息。舉例來說,有沒有需要存儲的子元素的位置,像這樣:

<root> 
    <child n="1"/> 
    <child n="2"/> 
</root> 

而且你count屬性做一些非常相似。

+0

謝謝您的答覆。我希望能有一種方法來操縱模式來做我的出價,但似乎沒有。 我會給它更多的時間來看看是否有其他用戶提出的任何瘋狂的想法,否則這個答案是偉大的和正確的!與此同時,我正在創建具有此限制的模式,並且正在研究如何合併XLST和XPath。 – Vag 2015-04-01 12:29:46

+0

這是正確的,我也會挑戰OP的設計,這需要一個僅反映子屬性數量的屬性。 – kjhughes 2015-04-01 14:32:44

+0

@kjhughes好點,我試圖編輯這個到我的答案 - 讓我知道,如果它仍然需要改進。 – 2015-04-01 14:41:19

1

我假設計數值是基於實際元素的實際數量的動態值。一種方法(因爲我不知道什麼是你的上下文中)可以修改與此值根據的minOccurs和maxOccurs的XSD,然後再次驗證新模式......

<xsd:complexType name="Artifacts"> 
    <xsd:sequence> 
     <xsd:element name="Artifact" minOccurs="COUNT_VALUE" maxOccurs="COUNT_VALUE" />  
    </xsd:sequence> 
</xsd:complexType> 
+0

'minOccurs'的值必須是0或正整數,「COUNT_VALUE」將不起作用。 – 2015-04-01 11:40:07

+0

你是對的@Mathias關於minOccurs!爲什麼將maxOccurs設置爲與解析輸入xml中的count屬性相同的值,保存到新的模式,並針對新的模式進行驗證將無法工作? – exoddus 2015-04-01 11:44:28

+0

是的,這是可行的,但這是很多體力勞動,你不覺得嗎?每次你想驗證一個文檔,你都必須改變模式。在我看來,模式的要點是_automatic_ validation,而不需要人爲干預。 – 2015-04-01 11:47:45