2013-07-10 8 views
0

목표 :XSD에서 XSD를 사용할 수 있습니까? type 속성을 요구하도록 xs : complexType 요소를 다시 정의 하시겠습니까?

  • 가 강제로 다른 스키마에서 재정의 http://www.w3.org/2001/XMLSchema을 다시 사용할 수 스키마에 정의 된 요소 :

    1. 는 "형식"속성이 모든 XS 필요 XSD 만들기 정의 된 모든 XS : 요소 (들) (XMLSPY에서 예를 들어) 우리의 XSD에서 "유효하지 않습니다"로 다음 "유형"속성을

    예를 들어, 내가 좋아하는 것이 필요합니다

    <xs:element name="SomeElement"/> 
    

    다음 여기

    <xs:element name="SomeElement" type="abc:SomeType"/> 
    

    유효 할 것입니다 반면에 내가 "유형"속성을 요구하도록 <xs:complexType name="element">를 재정의하려고했습니다 스키마의 예입니다. "텍스트"보기에서

    1. 및 저장하려고, XMLSPY : 이제

      <?xml version="1.0"?> 
      <!-- edited with XMLSpy v2013 (http://www.altova.com) --> 
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://www.w3.org/2001/XMLSchema" 
            elementFormDefault="qualified" attributeFormDefault="unqualified"> 
          <xs:redefine schemaLocation="http://www.w3.org/2001/XMLSchema.xsd"> 
           <xs:complexType name="element" abstract="true"> 
            <xs:complexContent> 
             <xs:restriction base="xs:element"> 
              <xs:attribute name="type" use="required"> 
               <xs:simpleType> 
                <xs:restriction base="xs:QName"/> 
               </xs:simpleType> 
              </xs:attribute> 
             </xs:restriction> 
            </xs:complexContent> 
           </xs:complexType> 
           <xs:complexType name="topLevelElement"> 
            <xs:complexContent> 
             <xs:restriction base="xs:topLevelElement"/> 
            </xs:complexContent> 
           </xs:complexType> 
           <xs:complexType name="localElement"> 
            <xs:complexContent> 
             <xs:restriction base="xs:localElement"/> 
            </xs:complexContent> 
           </xs:complexType> 
           <xs:complexType name="narrowMaxMin"> 
            <xs:complexContent> 
             <xs:restriction base="xs:narrowMaxMin"/> 
            </xs:complexContent> 
           </xs:complexType> 
          </xs:redefine> 
          <xs:element name="SomeElement"/> 
      </xs:schema> 
      

      ,이 스키마의 몇 가지 흥미로운 측면, 그리고 XMLSPY 2013 (서비스 팩이) 몇 가지 이상한 행동이있다 C에 대한 스키마가

    2. "스키마"보기에서

      및 저장하려고 "유효하지"을 나타냅니다, XMLSPY가 표시 스키마가 유효

    3. 시도 XMLSpy에서 샘플 XML 파일을 다시 작성하면 스키마가 유효하지 않음을 나타내는 오류가 발생합니다.

    4. 유효하지 않아야하는 스키마의 유일한 부분은 <xs:element name="SomeElement">이며 "유형"속성으로 정의되지 않았기 때문에 <xs:element name="SomeElement">입니다.

    5. 발생하는 오류는 중복 된 선언과 관련이 있습니다. 그러나 시도되는 것은 다른 선언보다는 재정의 것이다.

    질문 :

    1. IT는 "유형"속성을 필요로 <xs:complexType name="element">을 다시 정의 할 수 있습니까?
    2. 다른 "targetNamespace"를 가진 다른 XSD에서이 재정의 된 유형을 사용할 수 있습니까?
  • 답변

    0

    "XSD"는 W3C에서 제어하는 ​​W3C XML 스키마 언어이므로 에는 아무 것도 다시 정의 할 수 없습니다. 특히 http://www.w3.org/2001/XMLSchema 네임 스페이스에 정의 된 것을 다시 정의 할 수 없습니다!

    어떻게 할 수 있습니까? 결국, 당신이 무엇을 하든지간에, 당신은 항상 그 네임 스페이스에 이미 정의되어있는 일반 <xs:schema> 요소에서 시작해야합니다. 그리고 '정의 된'은 이미 <xs:schema>의 가능한 내용이 이미 정의되어 있음을 의미합니다. 여기에 어떤 종류의 부트 스트래핑이있을 수 없습니다! 그러면 다른 언어가됩니다.

    글쎄, 할 수있는 일은 자신의 XML 스키마 언어 (예 : 'XSDX')를 정의하는 것입니다. 그러나 다른 네임 스페이스에서, 그리고 예, 표준 XSD를 기반으로 할 수 있습니다. http://www.w3.org/2001/XMLSchema 네임 스페이스를 가져 와서 거기에 정의 된 구성 (즉, 전역 구성 요소)을 다시 사용하기 만하면됩니다. 그 'XSDX'언어를 사용할 수있는 것은 다른 이야기입니다. (제 생각에는, 새로운 소프트웨어를 개발해야합니다.)

    그러나 실제 목표는 XML 스키마 의 유효성을 검사하여 해당 "type"속성과 같은 일부 추가 요구 사항을 준수하는지 확인하는 것입니다.

    당신은 여분 검증의 어떤 종류를 개발하여이를 achive 수 있습니다.

    다른 방법으로는 (일시적으로) URI가 확장 된 XML 스키마 언어를 대표하여 스키마 (들)의 http://www.w3.org/2001/XMLSchema 문자열을 대체 할 수 있습니다. 그런 다음, 그것을 생각 표준 소프트웨어는 또 다른 XML 및 그 어떤 검증 또는 어떤 다른 사람과 함께 할 것입니다. 그러나 확장 된 XML 스키마 언어의 본격적인 정의 (일부 XML 스키마)가 여전히 필요합니다.