2011-07-15 11 views
6

XML文書に存在するすべての要素にわたって属性の一意性を検証しようとしています。XML文書全体のXSDで属性の一意性を検証する

例XML:

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

私のXSDスキーマ:

<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が、ここで問題です。私はルートの下にすべての要素にマッチしたいが、戻って上記セレクタのXPath:

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

私は「*」にXPathを変更することができますが、それが唯一のルートの直接のファミリー・ツリーである要素にid属性を検証します。

DOMDocument::schemaValidate()を使用して、PHPのlib_xmlでこれを検証しています。どんな助けでも大歓迎です。

+1

属性タイプをIDに設定するか、ID属性にxml:idを使用するだけですか?これにより、一意性が自動的に強化されます。 IDは数字でもNCNamesでもかまいません。 – Gordon

+0

'xpathを '*'に変更することはできますが、ルートの直接の下位要素である要素のid属性のみを検証します。'私はあなたが「トップレベルの要素の直接の*子供*」という意味だと思いますよね? – LarsH

答えて

8

<xs:selector xpath=".//*"/>を使用してください。

+1

はい。このことを詳述するために、 '//'は '/ descendant-or-self :: node()/'と同等です。スラッシュで終わるので、完全なXPath式ではありません。 (例外は '/'それ自体です。) – LarsH

+1

@Gordon @LarsHありがとう、私は知らなかったことをいくつか学んだ。 –

関連する問題