2011-07-15 67 views
6

Tôi đang cố gắng xác thực tính chất duy nhất của một thuộc tính trên tất cả các phần tử tồn tại trong một tài liệu XML.Xác thực tính duy nhất của thuộc tính với XSD trên tài liệu XML

Ví dụ XML:

<exampleXml> 
    <a id="1"/> 
    <a id="2"> 
    <b id="1"/> 
    </a> 
</exampleXml> 

giản đồ XSD của tôi:

<xs:schema elementFormDefault="qualified"> 
    <xs:element name="exampleXml"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="unbounded" name="a"> 
      <xs:complexType> 
      <xs:complexContent> 
       <xs:extension base="baseRuleType"> 
       <xs:sequence> 
        <xs:element minOccurs="0" maxOccurs="1" name="b"> 
        <xs:complexType> 
         <xs:complexContent> 
         <xs:extension base="baseRuleType"/> 
         </xs:complexContent> 
        </xs:complexType> 
        </xs:element> 
       </xs:sequence> 
       </xs:extension> 
      </xs:complexContent> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="duplicateIdsForbidden"> 
     <xs:selector xpath="//"/> 
     <xs:field xpath="@id"/> 
    </xs:unique> 
    </xs:element> 
    <xs:complexType name="baseRuleType"> 
    <xs:attribute name="id" use="optional"/> 
    </xs:complexType> 
</xs:schema> 

Các xpath là vấn đề ở đây. Tôi muốn để phù hợp với mọi phần tử dưới gốc nhưng xpath selector trên lợi nhuận:

 
Element '{http://www.w3.org/2001/XMLSchema}selector', attribute 'xpath': 
The XPath expression '//' could not be compiled 

tôi có thể thay đổi xpath để "*" nhưng điều đó sẽ chỉ xác nhận các thuộc tính id trên các yếu tố đó là decendants trực tiếp của root.

Tôi xác thực điều này bằng lib_xml bằng PHP sử dụng DOMDocument::schemaValidate(). Bất kỳ trợ giúp đánh giá rất nhiều.

+1

tại sao bạn không chỉ đặt loại thuộc tính thành ID hoặc sử dụng xml: id cho thuộc tính ID? Điều đó sẽ thực thi tính độc đáo một cách tự động. Các ID không thể là số, sau đó là NCNames. – Gordon

+0

'Tôi có thể thay đổi xpath thành '*' nhưng điều đó sẽ chỉ xác thực thuộc tính id trên các phần tử là các phần tử trực tiếp của gốc.' Tôi nghĩ rằng bạn có nghĩa là '... đó là trực tiếp * trẻ em * của các yếu tố cấp cao nhất', phải không? – LarsH

Trả lời

8

Sử dụng <xs:selector xpath=".//*"/>.

+1

Có. Để giải thích về điều này, '//' tương đương với '/ descendant-or-self :: node() /'. Vì nó kết thúc bằng dấu gạch chéo, nó không phải là một biểu thức XPath hoàn chỉnh. (Ngoại lệ là '/' chính nó.) – LarsH

+1

@Gordon @LarsH cảm ơn các bạn, đã học được một vài điều ở đó mà tôi không biết. –

Các vấn đề liên quan