2016-11-18 2 views
1

XSD 1.1 스키마를 사용하여 XML 문서의 유효성을 검사하는 데 최선을 다하고 있지만 방법이 없습니다. 나는이처럼 내 샘플을 단순화 보이는했습니다루핑 XSD 1.1 assert

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified"> 
    <xs:element name="message1"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element type="xs:string" name="indexmessage"/> 
       <xs:element name="rows" maxOccurs="1"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="row" minOccurs="1" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:sequence> 
             <xs:element name="code"> 
              <xs:simpleType> 
               <xs:restriction base="xs:string"> 
                <xs:minLength value="1"/> 
                <xs:maxLength value="16"/> 
               </xs:restriction> 
              </xs:simpleType> 
             </xs:element> 
             <xs:element name="totalquantity"> 
              <xs:simpleType> 
               <xs:restriction base="xs:decimal"> 
                <xs:fractionDigits value="2"/> 
               </xs:restriction> 
              </xs:simpleType> 
             </xs:element> 
             <xs:element name="attachments" minOccurs="0" maxOccurs="1"> 
              <xs:complexType> 
               <xs:sequence> 
                <xs:element name="attachment" minOccurs="1" 
                maxOccurs="unbounded"> 
                 <xs:complexType> 
                  <xs:sequence> 
                   <xs:element name="quantity"> 
                    <xs:simpleType> 
                     <xs:restriction base="xs:decimal"> 
                      <xs:fractionDigits value="2"/> 
                     </xs:restriction> 
                    </xs:simpleType> 
                   </xs:element> 
                  </xs:sequence> 
                 </xs:complexType> 
                </xs:element> 
               </xs:sequence>                        
              </xs:complexType> 
             </xs:element> 
            </xs:sequence>         
            <xs:assert test="every $r in row/attachments/attachment satisfies eq(row/quantitytotal, sum($r/quantity)"/> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

그래서 내가 XS에서 구현하고 싶은 : 주장은 quantitytotal이어야한다는 것입니다 "행 첨부 파일"의 양의 합과 같다. "모든"키워드를 사용하는 많은 샘플을 보았지만 결코 작동하지 않습니다. 여기에 또한 XSD 샘플입니다 :이 샘플

<?xml version="1.0" encoding="UTF-8"?> 
<message1>     
    <indexmessage>02</indexmessage>  
    <rows>    
     <row>   
      <code>1789</code>  
      <totalquantity>3</totalquantity> 
      <attachments> 
       <attachment> 
        <quantity>2</quantity> 
       </attachment> 
       <attachment> 
        <quantity>1</quantity> 
       </attachment> 
      </attachments> 
     </row> 
     <row> 
     ... 
     </row>    
    </rows>    
</message1> 

어설 진정한 원인 2 + 1 = 3이어야은 그리고 내가 XS를 구현하기 위해 노력하고있어 이유입니다 : 모든 행을 반복 주장한다.

많은 감사)

답변

0

row 요소를 통해 "반복"할 필요가 없습니다. 귀하의 주장은 이미 row 레벨입니다. 이 주장은 자동으로 각 row 점검한다

<xs:assert test="sum(attachments/attachment/quantity) = totalquantity"/> 

: 거기에서, sum() 모든 quantity 값을 추가 할 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
      vc:minVersion="1.1" 
      elementFormDefault="qualified"> 
    <xs:element name="message1"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element type="xs:string" name="indexmessage"/> 
     <xs:element name="rows" maxOccurs="1"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="row" minOccurs="1" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="code"> 
         <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:minLength value="1"/> 
          <xs:maxLength value="16"/> 
         </xs:restriction> 
         </xs:simpleType> 
        </xs:element> 
        <xs:element name="totalquantity"> 
         <xs:simpleType> 
         <xs:restriction base="xs:decimal"> 
          <xs:fractionDigits value="2"/> 
         </xs:restriction> 
         </xs:simpleType> 
        </xs:element> 
        <xs:element name="attachments" minOccurs="0" maxOccurs="1"> 
         <xs:complexType> 
         <xs:sequence> 
          <xs:element name="attachment" minOccurs="1" 
             maxOccurs="unbounded"> 
          <xs:complexType> 
           <xs:sequence> 
           <xs:element name="quantity"> 
            <xs:simpleType> 
            <xs:restriction base="xs:decimal"> 
             <xs:fractionDigits value="2"/> 
            </xs:restriction> 
            </xs:simpleType> 
           </xs:element> 
           </xs:sequence> 
          </xs:complexType> 
          </xs:element> 
         </xs:sequence>                        
         </xs:complexType> 
        </xs:element> 
        </xs:sequence>         
        <xs:assert test="sum(attachments/attachment/quantity) = totalquantity"/> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

많은 감사 kjhughes;)는 매력처럼 작동합니다. – Fxbrandon

0

귀하의 깊은 중첩이 매우 어려운 여기에 논리를 참조 할 수 있습니다,하지만 난 그것을 바로 XS를 읽으면 : 어설 요소 행의 정의의 일부이며, 행 요소가되지 않습니다 row라는 자식을 가지므로 행/첨부 파일/첨부 파일은 아무 것도 선택하지 않습니다.

그런데, "볼 수있는 것처럼"당신의 믿을 수 없을 정도로 예측할 수 있습니다. 그것을 달성하지 못하는 코드를 읽음으로써 달성하고자하는 것을 정말로 기대할 수 있습니까?

+0

감사 마이클, 난 더 나은 설명과 함께 자신을 답변 해 드리겠습니다 :

여기 XSD의 맥락에서 위의 주장이다. – Fxbrandon