2016-05-24 6 views
1

私は(スキーマにマッチしたシンプルなxmlファイルと並んでたXMLDocumentでそれを使用して)テストの検証動作のために使用していた以下のスキーマがありますおろか、私はこのスキーマでもコンパイルしないと予想.NETでのXML ID制約の検証に関する問題?

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="testSchema.xsd" targetNamespace="testSchema.xsd"> 

    <xs:element name="multiEle" type="typeOne"> 
    <xs:key name="keyOne"> 
     <xs:selector xpath="./eleOne" /> 
     <xs:field xpath="@boolTwo" /> 
    </xs:key> 
    </xs:element> 

    <xs:complexType name ="typeOne"> 
    <xs:sequence> 
     <xs:element name="eleOne" type="xs:string"/> 

     <xs:sequence> 

     <xs:element name="eleTwo" type="xs:decimal" /> 

     <xs:element name="eleThree"> 
      <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:boolean"> 
       <xs:attribute name="boolTwo" /> 
       </xs:extension> 
      </xs:simpleContent> 
      </xs:complexType> 
     </xs:element>  

     </xs:sequence>  

     <xs:element name ="eleFour">   
     <xs:complexType> 
      <xs:sequence> 

      <xs:element name="eleOne"> 
       <xs:complexType> 
       <xs:sequence> 
        <xs:element name="eleFive" /> 
       </xs:sequence> 
       </xs:complexType> 
      </xs:element> 

      <xs:element name="eleSix" />  

      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 

     <xs:choice> 
     <xs:element name="eleOne" type="xs:string"/> 
     <xs:element name="eleTwo" type="xs:decimal" /> 
     </xs:choice> 

    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

を検証し、このような属性が存在しなかった要素の属性を指すアイデンティティ制約があるためです。さらに、何の属性は、これをしたXMLドキュメントに指定されていなかった。

<?xml version="1.0" encoding="utf-8"?> 
<multiEle xmlns="testSchema.xsd"> 
    <eleOne>eleOne1</eleOne> 
    <eleTwo>2</eleTwo> 
    <eleThree boolTwo="anySimpleType">true</eleThree> 
    <eleFour> 
    <eleOne> 
     <eleFive></eleFive> 
    </eleOne> 
    <eleSix>anyType</eleSix> 
    </eleFour> 
    <eleOne>abc</eleOne> 
</multiEle> 

しかし、私には、スキーマをコンパイルすることを発見し、任意の例外をスローせず、検証のXmlDocumentが(ハンドラにnullを指定した)こと。私が紛失しているものがありますか?

答えて

2

あなたxs:selector任意の要素を選択していません:それはなし名前空間のelemOne要素を探していますが、あなたのelemOne要素は、名前空間testSchema.xsdです。空のセットには、同じキー値を持つ2つの要素を含めることができないため、インスタンスは有効です。

あなたはサクソン9.6を使用して検証した場合、それはあなたのスキーマのコンパイル時に警告を与える:

Warning: on line 5 of test.xsd: 
    The complex type typeOne does not allow a child element named eleOne 

(サクソン9.7は、この警告を生産されていない - 私はなぜ調査しています。)

XSD仕様では、常に空のシーケンスを選択するXPath式を使用するとエラーになりません。これを指定するのはかなり複雑です.XQuery Formal Semantics仕様のすべての機構で静的な型定義ルールを定義する必要があります。 Saxonは、この分析を行うスキーマ認識XPath処理の背後に乗って(W3Cルールではなく、それ自身のルールに従って)、それを実行します。

+0

XPathクエリで名前空間を指定する必要があることをすべて忘れてしまった、それは私が欠けていたものです。名前空間の不足を修正したら、正しく失敗しました。ありがとうございます! –