XSD에서 elementFormDefault는 무엇을 합니까?
-
13-09-2019 - |
문제
무엇을 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을 생성하지 않습니다