무엇을 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에 로컬로 정의 된 요소는 기본적으로 네임 스페이스가 없습니다.
- 의 기본값
elementFormDefault
이unqualified
입니다. - 이것은 의심 할 여지없이 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}
aroundassignment
는 유효성 검사가 여기에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을 생성하지 않습니다.
답변
![](http://daplus.net/wp-content/uploads/2023/04/coupang_part-e1630022808943-2.png)