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


91

무엇을 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>

답변:


72

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가 각 요소에 적용됩니다.


이 답변은 사양을 참조하지만 올바르게 해석하지 않습니다. 로컬로 정의 된 요소는 여전히 targetNamespace에 있으며 null 네임 스페이스에는 없습니다. elementFormDefault는 인스턴스에서 네임 스페이스를 한정해야하는지 여부를 지정하는 스위치 일뿐입니다.
Ihe Onwuka

1
@Ihe, 그것은 정확하지 않습니다. 또는 어쨌든 사람들을 혼란스럽게 할 수 있습니다. 로컬 요소 선언에 form = qualified가없는 경우 요소 선언 스키마 구성 요소의 {target namespace} 속성은 "absent"이며 이는 요소 인스턴스의 네임 스페이스 URI 속성도 "없음"이어야 함을 의미합니다.
Michael Kay

@MichaelKay 나에게 그것은 훨씬 더 혼란 스럽습니다. 문제는 예제 페이지에서 null 네임 스페이스에 있는지 여부입니다. 사양이 단순히 elementFormDefault = unqualified 설정이 null 네임 스페이스에 로컬로 정의 된 요소를 넣는다 고 말하지 않는 이유입니다. 페이지가 네임 스페이스에 없다고 말하는 것과 동일한 인스턴스에서 페이지가 네임 스페이스에 한정되어서는 안된다고 말하는 것입니다. 사양이 단순히 그렇게 말하지 않는 이유와 targetNamespace가있는 스키마가 그렇지 않은 것을 확인하는 이유 그 네임 스페이스에서?
Ihe Onwuka

1
매우 비공식적으로 설명하고 있기 때문에 "단순히 그렇게 말하는 것"이 ​​아닙니다. "널 네임 스페이스에 요소 배치"라는 문구는 XSD 사양의 용어를 사용하지 않습니다. 사양은 훨씬 더 신중한 용어를 사용하는 것을 선호하므로 종종 읽기 어렵지만 훨씬 더 정확 해집니다.
Michael Kay

1
내가 아는 한, 그것은 정답입니다.
Michael Kay

60

요소에서 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>

자세한 내용은 링크를 참조하십시오


56

오래된 자주 묻는 질문에 대한 새롭고 자세한 답변 및 설명 ...

짧은 답변 : 당신은 추가하지 않는 경우 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 에게 감사드립니다 .


12

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

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

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


가장 정확한 답변에 대한 약간의 설명. elementFormDefault = qualified를 사용하면 인턴 스의 로컬 요소를 네임 스페이스로 한정해야합니다. unqualified로 설정하면 네임 스페이스를 한정하지 않아야합니다.
Ihe Onwuka

6

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

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

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


elementFormDefault는 로컬로 정의 된 요소에만 적용됩니다. 전역 요소는 정규화 된 네임 스페이스 여야합니다.
Ihe Onwuka

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.