2012-04-27 41 views
10

我有構造爲Q & XML文檔的同級元素的屬性唯一約束A,其遵循以下格式(編輯爲清楚起見):XSD上的特定類型

<question> 
    <answer id="1"> 
     <question> 
      <answer id="1"/> 
      <answer id="2"/> 
      <answer id="3"/> 
     </question> 
    </answer> 
    <answer id="2"> 
     <question> 
      <answer id="1"/> 
      <answer id="2"/> 
     </question> 
    </answer> 
</question> 

我的XSD看起來像這樣:

<xs:element name="question"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="answer" type="answerType" minOccurs="2" maxOccurs="unbounded"> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="AnswerIdUnique"> 
     <xs:selector xpath="./*" /> 
     <xs:field xpath="@id" /> 
    </xs:unique> 
</xs:element> 

<xs:complexType name="answerType"> 
    <xs:sequence> 
     <xs:element ref="question" minOccurs="0" maxOccurs="1" /> 
    </xs:sequence> 
    <xs:attribute name="id" type="xs:token" use="required" /> 
</xs:complexType> 

當然,它比上面所看到的要多,但這說明了我的問題。 我需要id屬性answer元素在兄弟姐妹中是唯一的。上面定義的XSD強制同胞元素中的id屬性的唯一性,但它不區分元素類型。我已經嘗試過各種選擇器和字段的唯一約束,但還沒有找到可行的組合。 有什麼建議嗎?

回答

14

只要將選擇器更改爲<xs:selector xpath="answer"/>,您就會安然無恙。如果僅出於性能原因,通常最好避免像.//*這樣的XPath。

這是XML示例XML架構您提供,我認爲是工作,你想要的方式:

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="question" type="questionType"> 
     <xs:unique name="AnswerIdUnique"> 
      <xs:selector xpath="answer"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
    </xs:element> 
    <xs:complexType name="questionType"> 
     <xs:sequence> 
      <xs:element name="answer" type="answerType" minOccurs="2" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="answerType"> 
     <xs:sequence> 
      <xs:element ref="question" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
     <xs:attribute name="id" type="xs:token" use="required"/> 
    </xs:complexType> 
</xs:schema> 

您發佈的XML驗證罰款以上;複製任何兄弟答案的id會產生驗證錯誤。例如,下面的XML:

<question> 
    <answer id="1"> 
     <question> 
      <answer id="1"/> 
      <answer id="2"/> 
      <answer id="1"/> 
     </question> 
    </answer> 
    <answer id="1"> 
     <question> 
      <answer id="1"/> 
      <answer id="2"/> 
     </question> 
    </answer> 
</question> 

當驗證(在QTAssistant,應該是類似於Visual Studio的,因爲它是基於相同的技術信息),這些都是錯誤的:

Error occurred while loading [], line 6 position 5 
There is a duplicate key sequence '1' for the 'AnswerIdUnique' key or unique identity constraint. 
Error occurred while loading [], line 9 position 3 
There is a duplicate key sequence '1' for the 'AnswerIdUnique' key or unique identity constraint. 
Document1.xml is invalid. 

以下是Visual Studio 2010的屏幕截圖,顯示了上述針對我發佈的XSD的XML驗證;儘管這些問題被無意中報告爲警告,但它們仍然被報道。

VS2010 showing unique constraint errors

我隨機挑選的在線驗證(http://xsdvalidation.utilities-online.info/),並驗證了相同的XML和XSD我已經張貼;錯誤報告爲:

你必須要注意org.xml.sax.SAXParseException: Duplicate unique value [1] declared for identity constraint of element "question".org.xml.sax.SAXParseException: Duplicate unique value [1] declared for identity constraint of element "question".

的一件事是,當你有你的XSD目標命名空間;在這種情況下,需要爲所有涉及的命名空間定義一個別名,並在您的選擇器中使用它們。

UPDATE:和使用命名空間的XSD:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://localhost" xmlns="http://localhost" targetNamespace="http://localhost" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="question" type="questionType"> 
     <xs:unique name="AnswerIdUnique"> 
      <xs:selector xpath="tns:answer"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
    </xs:element> 
    <xs:complexType name="questionType"> 
     <xs:sequence> 
      <xs:element name="answer" type="answerType" minOccurs="2" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="answerType"> 
     <xs:sequence> 
      <xs:element ref="question" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
     <xs:attribute name="id" type="xs:token" use="required"/> 
    </xs:complexType> 
</xs:schema> 

請注意引進tns前綴,並在選擇使用它。

+0

由於某種原因,這似乎不起作用。請參閱我的更新問題 – joelmdev 2012-04-30 15:44:18

+0

如果我知道爲什麼它不起作用,我不會在第一時間發佈問題,因此聲明由於某種原因不起作用。我使用的是VS2010,似乎xpath選擇器中包含「答案」的每個變體都拒絕工作。從answerType中刪除唯一的常量並添加ref =「question」引起了一個模糊的錯誤,該錯誤簡單地聲明「'ref'屬性不能存在。「編輯與Ive得到的工作代碼一樣緊密,請張貼您的xsd,我會在本地嘗試,感謝您的支持 - 自從我必須編寫一個XML模式文檔並且生鏽以來,已經有好幾年了。 – joelmdev 2012-04-30 19:44:13

+0

Petru,你使用什麼軟件來處理XML並根據模式驗證它? – joelmdev 2012-05-01 21:20:12