programing

FormDefault 요소는 XSD에서 무엇을 합니까?

yellowcard 2023. 10. 12. 22:41
반응형

FormDefault 요소는 XSD에서 무엇을 합니까?

인가란 입니까?elementFormDefault언제 사용해야 합니까?

에 몇 가지 .elementFormDefault값:

qualified - 요소 및 특성이 스키마의 targetNamespace에 있습니다.

unqualified - 요소 및 특성에 네임스페이스가 없습니다.

그래서 이 정의에 따르면 스키마가 qualified로 설정되어 있다면 유형에 네임스페이스를 붙여야 하는 이유가 무엇일까 생각합니다.그리고 그 문제에 대해 자격이 없는 것으로 설정된 시나리오는 무엇입니까?구글 검색을 해봤지만, 이해하기 매우 어려운 몇 개의 W3C 페이지밖에 없었습니다.

지금 작업 인데 왜 인데 로 요?target:TypeAssignments때를 targetNamespacexmlns:target?

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns" 
        elementFormDefault="qualified">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignments" type="target:TypeAssignments"
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="TypeAssignments">
    <sequence>
      <element name="assignment" type="target:assignmentInfo"
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
      <element name="page" type="target:TypePage"/>
      <element name="file" type="target:TypeFile" 
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
  <simpleType name="TypePage">
    <restriction base="integer">
      <minInclusive value="50" />
      <maxInclusive value="498" />
    </restriction>
  </simpleType>
  <simpleType name="TypeFile">
    <restriction base="string">
      <enumeration value=".xml" />
      <enumeration value=".dtd" />
      <enumeration value=".xsd" />
    </restriction>
  </simpleType>
</schema>

ElementFormDefault는 스키마에 있는 유형의 네임스페이스와는 무관하며 스키마를 준수하는 XML 문서에 있는 요소의 네임스페이스에 관한 것입니다.

사양의 관련 섹션은 다음과 같습니다.

Element Declaration Schema

Component Property  {target namespace}
Representation      If form is present and its ·actual value· is qualified, 
                    or if form is absent and the ·actual value· of 
                    elementFormDefault on the <schema> ancestor is qualified, 
                    then the ·actual value· of the targetNamespace [attribute]
                    of the parent <schema> element information item, or 
                    ·absent· if there is none, otherwise ·absent·.

즉, 스키마 맨 위에 선언한 targetNamespace가 스키마 호환 XML 문서의 요소에만 적용된다는 것입니다. 요소FormDefault가 "qualified"이거나 요소가 스키마에 명시적으로 form="qualified"로 선언된 경우에만 해당됩니다.

예를 들어,요소FormDefault가 정규화되지 않은 경우 -

<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>

는 "name" 요소가 대상 Namespace에 있고 "page" 요소가 null 네임스페이스에 있을 것으로 예상합니다.

모든 요소 선언에 form="qualified"를 입력해야 하는 상황을 방지하기 위해 elementFormDefault="qualified"를 입력하면 요소 선언에 form="unqualified"를 입력하여 무시하지 않는 한 대상 Namespace가 각 요소에 적용됩니다.

ComplexType 합니다를 합니다.AuthorType에 의해 사용된author

<xsd:complexType name="AuthorType">
  <!-- compositor goes here -->
  <xsd:sequence>
     <xsd:element name="name" type="xsd:string"/>
     <xsd:element name="phone" type="tns:Phone"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="tns:AuthorId"/>
</xsd:complexType>
<xsd:element name="author" type="tns:AuthorType"/>

한다면elementFormDefault="unqualified"

다음 XML 인스턴스가 유효합니다.

<x:author xmlns:x="http://example.org/publishing">
   <name>Aaron Skonnard</name>
   <phone>(801)390-4552</phone>
</x:author>

작성자의 이름 특성은 네임스페이스를 지정하지 않고 허용됩니다(무자격).입니다의 한 .<xsd:complexType>로컬에서 complexType으로 간주됩니다.

한다면elementFormDefault="qualified"

그런 다음 인스턴스는 로컬 요소를 검증해야 합니다.

<x:author xmlns:x="http://example.org/publishing">
   <x:name>Aaron Skonnard</name>
   <x:phone>(801)390-4552</phone>
</x:author>

자세한 내용은 이 링크를 참조해 주시기 바랍니다.

새롭고 상세한 답변과 설명은 자주 묻는 질문에...

단답형:추가하지 않으면elementFormDefault="qualified".xsd:schema, 그 다음에 채무 불이행자unqualifiedvalue는 로컬로 선언된 요소가 네임스페이스에 없음을 의미합니다.

인지에 이 많습니다.elementFormDefault하지만 이것은 간단한 예로 빨리 밝혀질 수 있습니다.

XSD의 간소화된 버전:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignment" type="target:assignmentInfo" 
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
</schema>

주요 사항:

  • assignment요소는 로컬로 정의됩니다.
  • XSD에 로컬로 정의된 요소는 기본적으로 네임스페이스에 없습니다.
    • 그 는 입니다의 입니다.elementFormDefault이다.unqualified.
    • 이것은 거의 틀림없이 XSD 제작자들의 설계 실수입니다.
    • 입니다를 입니다.elementFormDefault="qualified" 해서tassignment예상하는 대로 대상 네임스페이스에 있습니다.
  • 그것은 거의 사용되지 않습니다.form 책임을 돌리다xs:element언에 elementFormDefault기본값을 설정합니다.

유효해 보이는 XML

이 XML은 위의 XSD에 따라 유효해야 할 것으로 보입니다.

<assignments xmlns="http://www.levijackson.net/web340/ns"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.levijackson.net/web340/ns try.xsd">
  <assignment id="a1">
    <name>John</name>
  </assignment>
</assignments>

공지사항:

  • assignments.assignments 항목목()http://www.levijackson.net/web340/ns).

당혹스러운 유효성 검사 오류

유효한 것처럼 보이지만 위 XML에서 다음과 같은 혼동스러운 유효성 검사 오류가 발생합니다.

[오류] try.xml:4:23: cvc-complex-type.2.4.a: 요소 '할당'으로 시작하는 내용이 잘못되었습니다.'{assignment}' 중 하나가 필요합니다.

주의:

  • 요소를 찾을 것으로 예상했지만 실제로 요소를 발견했기 때문에 내용이 잘못되었다고 말하는 것 같은 이 진단을 저주한 개발자는 당신이 처음이 아닐 것입니다. (WTF)
  • 이것이 진정으로 의미하는 것은: 더{그리고.}assignment즉,입니다.assignment 이름 공간없습니다.불행하게도, 그들이 발견한 것은assignment는 non non nespace다와(와) 네임스페이스에서 하지 않았습니다.

해결책

  • 대부분의 경우: 추가elementFormDefault="qualified"xsd:schemaXSD의 요소입니다.이것은 XSD에서 로컬로 선언될 때 유효한 XML이 대상 네임스페이스에 요소를 배치해야 한다는 것을 의미합니다. 그렇지 않으면 유효한 XML이 로컬로 선언된 요소를 네임스페이스가 없는 곳에 배치해야 합니다.
  • 그 시대의 극소수:XML을 XSD의 요구 사항에 맞게 변경합니다.assignment네임스페이스가 없습니다.는 예를 들어다를 할 수 .xmlns=""assignment요소.

크레딧:이 답변에 대해 유익한 피드백을 주신 마이클 케이 께 감사드립니다.

요소FormDefault와 함께 유의할 점은 스키마의 최상위 레벨에 정의된 글로벌 요소와는 달리 복잡한 Type 블록 내에서 일반적으로 명명된 요소인 로컬 정의 요소에 적용된다는 것입니다.elementFormDefault="qualified"를 사용하면 스키마의 대상 네임스페이스를 문서의 기본 네임스페이스로 사용하여 xml 문서 내에서 스키마의 로컬 요소를 지정할 수 있습니다.

실제로 elementFormDefault="qualified"를 사용하여 중첩된 블록의 요소를 선언할 수 있습니다. 그렇지 않으면 최상위 레벨의 모든 요소를 선언하고 ref 속성을 사용하여 중첩된 요소의 스키마에서 참조해야 하므로 훨씬 덜 콤팩트한 스키마가 됩니다.

XML Schema Primer의 이 부분은 다음과 같습니다. http://www.w3.org/TR/xmlschema-0/ #NS

elementFormDefault="qualified"는 스키마 문서 자체(.xsd 파일)의 네임스페이스가 아니라 XML 인스턴스 문서(.xml 파일)의 네임스페이스 사용을 제어하는 데 사용됩니다.

elementFormDefault="qualified"를 지정하여 이 스키마로 유효성을 확인한 문서에 네임스페이스 선언을 사용하도록 강제합니다.

이 값을 지정하여 요소가 자격이 없는 것이 아니라 자격이 있는 것으로 선언하는 것이 일반적입니다.그러나 속성 FormDefault="unqualified"는 기본값이므로 네임스페이스를 한정하지 않으려면 스키마 문서에서 지정할 필요가 없습니다.

XMLspy(최소 2011 버전)는 요소FormDefault="qualified"를 사용할 경우 정의된 대상NameSpace를 needs합니다.그렇지 않으면 검증되지 않습니다.또한 네임스페이스 접두사를 사용하여 xmls를 생성하지 않습니다.

언급URL : https://stackoverflow.com/questions/1463138/what-does-elementformdefault-do-in-xsd

반응형