[xml] XSD에서 elementFormDefault는 무엇을합니까?

무엇을 elementFormDefault하고 언제 사용해야합니까?

그래서 elementFormDefault값에 대한 몇 가지 정의를 찾았습니다 .

규정 됨 -요소 및 속성이 스키마의 targetNamespace에 있습니다.

규정되지 않음 -요소 및 속성에 네임 스페이스가 없습니다.

그래서 그 정의에서 스키마가 정규화로 설정되어 있다면 왜 네임 스페이스를 타입에 접두사로 붙여야합니까? 그리고 그 문제에 대해 자격을 갖추지 못한 시나리오는 무엇입니까? 인터넷 검색을 시도했지만 이해하기 매우 어려운 W3C 페이지 몇 개뿐이었습니다.

이것은 내가 지금 작업하고있는 파일입니다 target:TypeAssignments. targetNamespace를 다음과 동일한 것으로 선언 할 때 유형을 선언해야하는 이유는 xmlns: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·.

즉, elementFormDefault가 “qualified”이거나 요소가 form = “qualified”를 갖는 것으로 스키마에서 명시 적으로 선언 된 경우 스키마 상단에서 선언 한 targetNamespace는 스키마 호환 XML 문서의 요소에만 적용됩니다. .

예 : elementFormDefault가 규정되지 않은 경우-

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

“name”요소는 targetNamespace에 있고 “page”요소는 null 네임 스페이스에 있어야합니다.

모든 요소 선언에 form = “qualified”를 넣지 않아도되도록 elementFormDefault = “qualified”를 지정하면 요소 선언에 form = “unqualified”를 넣어 재정의하지 않는 한 targetNamespace가 각 요소에 적용됩니다.


답변

요소에서 AuthorType사용 하는 다음 ComplexType을 고려하십시오.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>

작성자의 이름 속성은 네임 스페이스 (unqualified)를 지정하지 않고 허용됩니다. 의 일부인 모든 요소는 <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, 디폴트 unqualified로컬로 선언 된 요소에 값 수단 것을 더 네임 스페이스 .

무엇을하는지에 대해 많은 혼란 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에 로컬로 정의 된 요소는 기본적으로 네임 스페이스가 없습니다.
    • 의 기본값 elementFormDefaultunqualified입니다.
    • 이것은 의심 할 여지없이 XSD 제작자의 디자인 실수입니다.
    • 표준 관행은 예상대로 대상 네임 스페이스에 elementFormDefault="qualified"
      있도록 항상 사용 하는 assignment것입니다.
  • 기본값 을 설정 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}’중 하나가 필요합니다.

메모:

  • 요소 를 찾을 것으로 예상 assignment했지만 실제로 요소 를 찾았 기 때문에 콘텐츠가 유효하지 않다고assignment 말하는이 진단을 저주 한 최초의 개발자는 아닙니다 . ( WTF )
  • 이것이 실제로 의미하는 바 : The {and }around assignment는 유효성 검사가 여기에 assignment 네임 스페이스가 없다는 것을 의미합니다 . 안타깝게도 assignment요소를 찾았다 고 말할 때 네임 스페이스가없는 것과 다른 기본 네임 스페이스에서 찾았다는 것을 언급하지 않습니다.

해결책

  • 대부분의 시간 : XSD 요소에 추가 elementFormDefault="qualified"합니다 xsd:schema. 즉, 유효한 XML은 XSD에서 로컬로 선언 될 때 대상 네임 스페이스에 요소를 배치해야합니다. 그렇지 않으면 유효한 XML은 로컬로 선언 된 요소를 네임 스페이스없이 배치해야합니다.
  • 시간의 극히 일부 :assignment 네임 스페이스가없는 XSD의 요구 사항을 준수하도록 XML을 변경합니다 . 예를 들어 요소 에 추가 xmlns=""하여 이를 수행 할 수 있습니다 assignment.

크레딧 : 이 답변에 대한 유용한 피드백을 주신 Michael Kay 에게 감사드립니다 .


답변

elementFormDefault에서 주목해야 할 중요한 점 은 스키마의 최상위 수준에 정의 된 전역 요소와 달리 일반적으로 complexType 블록 내에서 이름이 지정된 요소 인 로컬로 정의 된 요소에 적용된다는 것 입니다. elementFormDefault = “qualified”를 사용하면 스키마의 대상 네임 스페이스를 문서의 기본 네임 스페이스로 사용하여 xml 문서 내에서 스키마의 로컬 요소를 처리 할 수 ​​있습니다.

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

XML Schema Primer의이 부분은 이에 대해 설명합니다. http://www.w3.org/TR/xmlschema-0/#NS


답변

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

elementFormDefault = “qualified”를 지정하여이 스키마로 검증 된 문서에서 사용되는 네임 스페이스 선언을 적용합니다.

요소가 규정되지 않은 것이 아니라 규정되어야 함을 선언하기 위해이 값을 지정하는 것이 일반적입니다. 그러나 attributeFormDefault = “unqualified”가 기본값이므로 네임 스페이스를 한정하지 않으려는 경우 스키마 문서에 지정할 필요가 없습니다.


답변

XMLSpy (최소 2011 버전)에는 elementFormDefault = “qualified”가 사용되는 경우 정의 된 targetNameSpace가 필요하다는 것을 알게되었습니다. 그렇지 않으면 유효성을 검사하지 않습니다. 또한 네임 스페이스 접두사가있는 xml을 생성하지 않습니다.


답변