2014-03-06 62 views

回答

1

可以實現,如果你的解析器支持W3C XSD 1.1:

<xs:element name="port" type="portType" /> 
<xs:complexType name="portType"> 
    <xs:attribute name="min" type="xs:integer" use="optional"/> 
    <xs:attribute name="max" type="xs:integer" use="optional"/> 
    <xs:attribute name="num" type="xs:integer" use="optional"/> 
    <xs:assert test="@num or (@max and @min)" /> 
</xs:complexType> 

如果你的分析器不支持XSD 1.1,你可以使用XSD 1.0 + Schematron的,在這裏你將裏面xs:annotation/xs:appinfo和使用您的斷言XSLT或一些外部工具來驗證它們。就你而言,僅僅在XSD驗證之後檢查運行解析器的語言中的斷言可能會更簡單。

2

helderdarocha已經指向XSD 1.1。另一種方法是重新考慮你的設計。它目前對兩種不同的結構使用相同的名稱;給他們不同的名字使問題變得微不足道。

<portnum num="80"/> 
<portrange min="80" max="443"/> 

<port><num>80</num></port> 
<port><range min="80" max="443"/></port>