2012-10-05 118 views
4

如果設置了其他屬性,是否可以創建屬性required僅在設置了其他屬性時才需要屬性

E.g.在下面的代碼中,viewId屬性必須被設置爲required,iff action屬性被設置。

XML:

<node id="id1" destination="http://www.yahoo.com" /> 
<node id="id2" action="demo" viewId="demo.asp"/> 

如果這是可能的,請你告訴我如何做到這一點。截至目前,我在所有情況下設置了viewId集合required,因爲第一個node元素未通過驗證。

回答

3

單獨使用XSD 1.0是不可能的。您必須使用另一種XML模式語言,除XSD之外或代替XSD,或移至XSD 1.1。

另一種選擇可能是重構您的模式。如果@destination與{@action,@viewId}互斥,也許可以使用元素,然後允許您使用xsd:choice

更新:對於XSD 1.1

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="node"> 
     <xsd:complexType> 
      <xsd:attribute name="id" type="xsd:ID" use="required"/> 
      <xsd:attribute name="destination" type="xsd:string"/> 
      <xsd:attribute name="action" type="xsd:string"/> 
      <xsd:attribute name="viewId" type="xsd:string"/> 
      <xsd:assert test="(@viewId) or not(@action)" /> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+0

如何在XSD 1.1中解決原始問題? –

+0

@ChrisCharabaruk,我已經更新了XSD 1.1規範的帖子。 –

+0

太棒了,謝謝。 –

1

您可以創建你的元素「節點」的抽象複雜類型(姑且稱之爲abstactNode),其中包含@id的定義。

然後創建一個複雜類型「nodeWithDestination」,它擴展了abstactNode和@destination的定義。

第二個複雜類型「nodeWithActionAndViewId」,擴展了abstactNode,以及@action和@viewId屬性定義。

你的XML應該是這樣的:

<node id="id1" destination="http://www.yahoo.com" xsi:type="nodeWithDestination"/> 
<node id="id2" action="demo" viewId="demo.asp" xsi:type="nodeWithActionAndViewId"/> 

會符合您的需要呢?

+0

Petru的回答之後,我做了一些調查,發現這是一種可能的解決方法,但不是我們真正想做的事情。 XML文件通常來自我們框架的用戶,因此我們很難控制強制用戶定義'xsi:type'。 – Arjun

相關問題