2011-08-12 11 views
2

xs:uniqueを使用しようとしています。次の単純なXMLファイルが検証され、これを使用してXSDスキーマが属性値をユニークにしようとしています

<?xml version="1.0" encoding="utf-8"?> 
    <xs:schema xmlns="http://testuri/test.xsd" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://testuri/test.xsd" 
     elementFormDefault="qualified" 
     id="XMLSchema1"> 
     <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="items"> 
       <xs:complexType> 
       <xs:sequence> 
        <xs:element name="item" maxOccurs="unbounded"> 
        <xs:complexType> 
         <xs:attribute name="id" type="xs:string" use="required"/> 
        </xs:complexType> 
        </xs:element> 
       </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:schema> 

<?xml version="1.0" encoding="utf-8" ?> 
    <root xmlns="http://testuri/test.xsd"> 
     <items> 
     <item id="1"/> 
     <item id="1"/> 
     <item id="1"/> 
     </items> 
    </root> 

は、今の私たちは、属性IDが一意にしたいとしましょう、私は次のような単純なスキーマを持っています。私は単にスキーマを次のように変更することを考えていました:

<?xml version="1.0" encoding="utf-8"?> 
    <xs:schema 
     xmlns="http://testuri/test.xsd" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://testuri/test.xsd" 
     elementFormDefault="qualified" id="XMLSchema1"> 
     <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="items"> 
       <xs:complexType> 
       <xs:sequence> 
        <xs:element name="item" maxOccurs="unbounded"> 
        <xs:complexType> 
         <xs:attribute name="id" type="xs:string" use="required"/> 
        </xs:complexType> 
        </xs:element> 
       </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:unique name="itemKey"> 
      <xs:selector xpath="items/item"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
     </xs:element> 
    </xs:schema> 

しかし、上記のXMLはまだ有効です。

問題がセレクタのxpathにあることが最も確かです。何か案は?

答えて

2

XPath 1.0にはデフォルト名前空間の概念がないため、XPath式に名前空間接頭辞を修飾する必要があると思います。だからあなたのターゲット名前空間の名前空間宣言を追加します。その後、

<xs:schema 
    xmlns="http://testuri/test.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://testuri/test.xsd" 
    xmlns:p="http://testuri/test.xsd" 
    elementFormDefault="qualified" id="XMLSchema1"> 

とあなたのXPath式でそのプレフィックスを使用します。

<xs:unique name="itemKey"> 
     <xs:selector xpath="p:items/p:item"/> 
     <xs:field xpath="@id"/> 
    </xs:unique> 

でも、私は、このことを確認していません。

+0

それです。私はノード名の資格を見たはずです。どうもありがとう –

関連する問題