2011-07-15 26 views
6

Bir XML belgesinde var olan tüm öğeler arasında bir özniteliğin tekliğini doğrulamaya çalışıyorum.XML belgesinde XSD ile öznitelik tekliğini doğrulayın

Örnek XML:

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

Benim XSD şeması:

<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> 

xpath burada konudur.

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

degisebilirim "*" ama bu sadece kökün doğrudan Torunlar olan unsurları id özelliğini doğrular için xpath: Ben kökün altındaki her eleman ama yukarıda döner seçici xpath eşleştirmek istiyoruz.

Bunu PHP'de DOMDocument::schemaValidate() kullanarak lib_xml ile doğrulıyorum. Herhangi bir yardım büyük beğeni topluyor.

+1

Neden öznitelik türünü kimliğe ayarladınız veya ID özniteliği için xml: kimlini kullanmıyorsunuz? Bu benzersizliği otomatik olarak zorlar. Yine de kimlikleri sayısal değil, ancak NCNames. – Gordon

+0

'xpath'i * * 'olarak değiştirebilirim, ancak bu yalnızca kök öznitelikleri olan öğelerdeki id özniteliğini doğrulayacaktır.' Bence "... en üst düzey elemanın doğrudan * çocukları *" demek istiyorsun, değil mi? – LarsH

cevap

8

<xs:selector xpath=".//*"/>'u kullanın.

+1

Evet. Bunun üzerinde durmak için, //// descendant-or-self :: node()/'ile eşdeğerdir. Bir eğik çizgi ile bittiğinden, tam bir XPath ifadesi değildir. (Istisna '/' kendisi.) – LarsH

+1

@Gordon @LarsH teşekkürler, bilmediğim birkaç şey öğrendim. –