2013-10-28 136 views
1

如何定義xsd:complexType這樣它將驗證以下兩個構造?XSD的定義 - 屬性或元素

<Element Key="test" Value="test" /> 

<Element Key="test"> 
    <Value>test</Value> 
</Element> 

(並不會驗證這一個:)

<Element Key="test" Value="test"> 
    <Value>another test</Value> 
</Element> 
+0

這是不可能的XSD 1.0;如果您對XSD 1.1解決方案感興趣,請將您的問題標記爲XSD 1.1 –

+0

@PetruGardea我想知道,我有什麼選擇。如果你知道,如何在XSD 1.1中解決這個問題,隨時寫一個答案。 – Spook

回答

3

這是不可能的XSD 1.0,除非你使用的東西,如Schematron的(在頂部XSD 1.0)。

這些是您使用XSD 1.1的選項:斷言和類型選項。您在下面看到的是基於Xerces的XSD 1.1規範的實現進行測試。

(編輯,包括Michael Kay的變化在現實生活中,只能選擇一個。)

<?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" xmlns:xerces="http://xerces.apache.org"> 
    <xsd:element name="Element"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="Value" type="xsd:string" minOccurs="0"/> 
      </xsd:sequence> 
      <xsd:attribute name="Key" type="xsd:string" use="required"/> 
      <xsd:attribute name="Value" type="xsd:string"/> 
      <xsd:assert test="(Value and not(@Value)) or (@Value and not(Value))" xerces:message="Choose your Value wisely, one only."/> 
      <xsd:assert test="exists(Value) != exists(@Value)" xerces:message="One way..."/>    
      <xsd:assert test="count((Value,@Value))=1" xerces:message="Another way..."/> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="Element1"> 
     <xsd:alternative test="@Value" type="att"/> 
     <xsd:alternative test="not(@Value)" type="elt"/> 
    </xsd:element> 
    <xsd:complexType name="elt"> 
     <xsd:sequence> 
      <xsd:element name="Value" type="xsd:string"/> 
     </xsd:sequence> 
     <xsd:attribute name="Key" type="xsd:string" use="required"/> 
    </xsd:complexType> 
    <xsd:complexType name="att"> 
     <xsd:attribute name="Key" type="xsd:string" use="required"/> 
     <xsd:attribute name="Value" type="xsd:string" use="required"/> 
    </xsd:complexType> 

</xsd:schema> 
+2

斷言也可以寫成'test ='exists(Value)!= exists(@Value)'',或'test =「count((Value,@ Value))= 1」'。 –

相關問題