2017-09-12 7 views
2

XSD-Schema를 사용하여 유효성을 검사해야하는 일반 XML이 있습니다. 불행히도 XML의 구조는 고정되어 있으며 변경할 수 없습니다.assert와 xpath를 사용하여 xsd 1.1을 사용하여 xml 노드의 값을 검사하거나 유효성을 검사 할 수 있습니까?

는 XML :

<?xml version="1.0" encoding="UTF-8"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="RatingRequestShema-V2.xsd"> 
    <Request> 
    <Props id="Info"> 
     <Prop id="A" type="DATETIME">2017-10-01T09:34:11Z</Prop> 
     <Prop id="B" type="ENUM">Test</Prop> 
    </Props> 
    <Props id="Example"> 
     <Prop id="C" type="DATE">1980-08-14</Prop> 
     <Prop id="D" type="DECIMAL">34,5</Prop> 
    </Props> 
    </Request> 
</Root> 

XSD-스키마 : ID가 동일한 경우

<?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" attributeFormDefault="unqualified" vc:minVersion="1.1"> 
<xs:element name="Root"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Request"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="Props" maxOccurs="unbounded"> 
          <xs:complexType> 
           <xs:sequence> 
            <xs:element name="Prop" maxOccurs="unbounded"> 
             <xs:complexType> 
                <xs:attribute name="id" use="required"/> 
                <xs:attribute name="type" use="required"/> 
                <xs:assert test="if (@id eq 'A') then @type eq 'DATETIME' 
              else if (@id eq 'B') then @type eq 'ENUM' else false()"/> 
             </xs:complexType> 
            </xs:element> 
           </xs:sequence> 
           <xs:attribute name="id" use="required"> 
            <xs:simpleType> 
             <xs:restriction base="xs:string"> 
              <xs:enumeration value="Info"/> 
              <xs:enumeration value="Example"/> 
             </xs:restriction> 
            </xs:simpleType> 
           </xs:attribute> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
<xs:simpleType name="datetime"> 
    <xs:restriction base="xs:dateTime"/> 
</xs:simpleType> 
<xs:simpleType name="B_Enum"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="Test_1"/> 
     <xs:enumeration value="Test_2"/> 
     <xs:enumeration value="Test_3"/> 
    </xs:restriction> 
</xs:simpleType> 

XSD는-스키마는 이제 "A"타입은 "할 필요가 확인하는 동작 DATETIME "이지만"2017-10-01T09 : 34 : 11Z "값이 xs : dateTime인지 확인해야합니다. 다른 요소에도 동일하게 적용됩니다.

그래서 목표는 특정 ID 만 하나 유형 만 XS에 대한 것을 확인하는 것입니다 : 형 simpleType이 유효합니다.

내 현재 xs : assert 표현식을 사용하면 Prop 요소에 특정 ID 및 유형 특성 만 있는지 확인할 수 있습니다. 그러나 나는 또한 가치를 확인할 필요가있다.

감사합니다. Joe

답변

1

당신의 질문이 무엇인지 명시하지 않았습니다. 질문은 "값이 올바른 유형인지 어떻게 확인하나요?"라고 가정합니다.

한 가지 방법은

if (@type = 'DATETIME') then . castable as xs:dateTime 
else ... 

아마도 간단한 방법은 소품 적절한 유형을 지정 조건부 유형 지정을 사용하는 것이 일반적인 형태의 소유에 대한 선언에 추가 주장을 넣어하는 것입니다.