只要將選擇器更改爲<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驗證;儘管這些問題被無意中報告爲警告,但它們仍然被報道。
我隨機挑選的在線驗證(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
前綴,並在選擇使用它。
由於某種原因,這似乎不起作用。請參閱我的更新問題 – joelmdev 2012-04-30 15:44:18
如果我知道爲什麼它不起作用,我不會在第一時間發佈問題,因此聲明由於某種原因不起作用。我使用的是VS2010,似乎xpath選擇器中包含「答案」的每個變體都拒絕工作。從answerType中刪除唯一的常量並添加ref =「question」引起了一個模糊的錯誤,該錯誤簡單地聲明「'ref'屬性不能存在。「編輯與Ive得到的工作代碼一樣緊密,請張貼您的xsd,我會在本地嘗試,感謝您的支持 - 自從我必須編寫一個XML模式文檔並且生鏽以來,已經有好幾年了。 – joelmdev 2012-04-30 19:44:13
Petru,你使用什麼軟件來處理XML並根據模式驗證它? – joelmdev 2012-05-01 21:20:12