문제

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

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

자격 있는 - 요소 및 속성 의 targetNamespace에 있습니다. 스키마

자격이 없는 - elements 및 attributes에는 네임스페이스가 없습니다.

따라서 해당 정의에 따르면 스키마가 규정됨으로 설정된 경우 유형 앞에 네임스페이스를 접두어로 붙여야 하는 이유는 무엇입니까?그리고 그 문제에 대해 하나를 부적격으로 설정하는 시나리오는 무엇입니까?인터넷 검색을 시도했지만 내가 얻은 것은 이해하기 매우 어려운 몇 개의 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·.

이는 스키마 상단에서 선언 한 TargetNamespace가 스키마 호환 XML 문서의 요소에만 적용되거나 어떤 ElementFormDefault 중 하나가 "적격"이거나 스키마에서 요소가 form = "자격이있는"것으로 명시 적으로 선언 된 경우에만 적용된다는 것입니다. .

예를 들어 : ElementFormDefault가 자격이없는 경우 -

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

"이름"요소가 TargetNamespace에 있고 "페이지"요소가 널 네임 스페이스에있을 것으로 예상됩니다.

모든 요소 선언에 form = "자격을 갖추어야한다"는 것을 절약하려면 elementformDefault = "자격을 갖춘"내용은 요소 선언에 form = "자격이없는"것을 고정하지 않는 한 TargetNamespace가 각 요소에 적용됨을 의미합니다.

다른 팁

다음 복합 유형을 고려하십시오 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, 그러면 기본값 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로 정의 된 요소는 기본적으로 네임 스페이스가 없습니다.
    • 기본값이기 때문입니다 elementFormDefault ~이다 unqualified.
    • 이것은 아마도 XSD 제작자의 디자인 실수입니다.
    • 표준 실습은 항상 사용하는 것입니다 elementFormDefault="qualified"~하도록 하다 assignment 예상대로 대상 네임 스페이스에 있습니다.

겉보기에는 유효한 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은 다음과 같은 혼란스러운 검증 오류를 산출합니다.

ERROR] try.xml : 4 : 23 : CVC-Complex-Type.2.4.a : 요소 '할당'부터 시작하여 잘못된 내용이 발견되었습니다. '{과제}'중 하나가 예상됩니다.

메모:

  • 당신은이 진단을 저주 한 최초의 개발자가 아닙니다. 내용은 assignment 요소이지만 실제로는 발견되었습니다 assignment 요소. (wtf)
  • 이것이 실제로 의미하는 바 : { 그리고 } 주위에 assignment 유효성 검사가 예상되었음을 의미합니다 assignment 네임 스페이스가 없습니다 여기. 불행히도, 그것이 발견되었다고 말할 때 assignment 요소, 네임 스페이스가없는 기본 네임 스페이스에서 찾았다 고 언급하지 않습니다.

해결책

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

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 년 적어도 2011 년 버전)에는 elementFormDefault = "Qualified"가 사용되는 경우 TargetNamespace가 필요합니다. 그렇지 않으면 검증되지 않습니다. 또한 네임 스페이스 접두사로 XML을 생성하지 않습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top