2010-10-11 30 views
6

我要找選擇一個屬性的元素的變體,可以直接設置或引用。選擇在XML實例屬性(S)直接定義的屬性或引用

這就是我的想法:

<root>  
<element> 
    <attribute ref="shortname" /> 
</element> 
<element> 
    <attribute name="shortname" isEditable="true" anotherattrib="0815" /> 
</element> 
</root> 

由於這也不是沒有的XML解決方案的問題,這個屬性的定義是,如果需要元素屬性的屬性「名」挺難的。

方案可能看起來像這樣

<xs:element name="attribute"> 
<xs:complexType> 
<xs:attribute name="ref" use="required" /> 
<xs:attribute name="name" use="required" /> 
</xs:complexType> 
</xs:element> 

是否有可能作出選擇(類似於XS:爲元素選擇)屬性之間?就像如果從名爲ref的元素屬性中有一個屬性一樣,則不允許其他屬性。如果不是,屬性「名稱」必須設置...

這個問題聽起來很純虛和學術,但我會很高興,如果有可能是一個解決方案,或者如果我完全錯了與我有什麼記: )

預先感謝您的幫助!

戴夫

回答

1

在我看來,這是不可能像你想定義的XML Schema。您應該定義兩個不同的元素名稱類似<attribute><attributeRef>具有不同的必需屬性集,或者您應該既不將"ref"也不將"name"屬性定義爲"required"

XML Schema是不是驗證數據的唯一方法,你不能對於XML模式定義的屬性值之間的一些角色。因此,如果您確實需要在XML文檔中驗證更復雜的關係,則可以使用XPath和XSLT來執行此操作(請參閱Schematron,XML Schema Language Comparison,Beyond W3C XML Schema,Improving XML Document Validation with Schematron,Advanced XML validationUsing XSL as a Validation Language)。

+0

我認爲,只有這樣,才能表達這一點,將是:全內容聲明一個複雜類型,對於限制聲明兩個派生類型,聲明父內容使用的選擇時。 – 2010-10-12 20:46:48

+0

@Alejandro:你可以聲明兩種類型。這不是問題,但是如何定義一個具有**相同名稱**「」和不同類型的元素的選擇?我不確定這是可能的。在我看來,你會收到錯誤,元素「」的定義是模糊的。 – Oleg 2010-10-12 21:07:29

+0

@Oleg:選擇是兩個元件(每一個與不同的派生類型),但相同的名稱,**在父聲明**之間,如例如:複雜類型名爲'Base';從'Base'派生的complexType,名爲'BaseA',有限制;對於名爲'BaseB'的complexType也是一樣的;元素名稱「Parent」,可以在名爲'Child'的元素與'BaseA'類型或名爲'Child'的元素與'BaseB'類型之間進行選擇。 – 2010-10-12 22:14:45

0

這可以通過XML模式斷言1.1來實現:

<xsd:complexType name="AttributeType"> 
    <xsd:sequence /> 
    <xsd:attribute name="ref" type="xsd:string" /> 
    <xsd:attribute name="name" type="xsd:string" /> 
    <xsd:assert test="count(@ref | @name) = 1" /> 
</xsd:complexType> 

assert元件確保只有refname和一個被使用。