2013-11-22 7 views
1

내가 (전체 XML 파일에 대한 더 큰 DTD의 일부로서) 다음과 같은 요소에 대한 DTD를 구축하기 위해 노력하고있어 :XML DTD 필수 속성 옵션

<contact> 
     <base>019374627</base> 
     <mobile primaryContact="true">0861029388</phone> 
     <email>[email protected]</email> 
</contact> 

난 그냥 혼란 스러워요이 contact 요소 때문에 요소가 하나 이상 있어야하며 primaryContact="true" 특성이있는 contact 안에 정확히 하나의 요소가 있어야합니다.

어떻게 이것을 DTD로 나타낼 수 있습니까? 어떤 도움이라도 대단히 감사하겠습니다!

답변

2

이것은 DTD로 표현할 수 없습니다.

DTD에서 contact 요소에 mobile 요소가 있어야한다고 지정할 수 있습니다. 특정 부속 요소 (예 : mobile)가 primaryContact 속성에 "고정"값 ("true")이 있어야 함을 지정할 수도 있습니다.

그러나 요소에 적어도 하나의 하위 요소가 있어야하거나 primaryContact 특성이 정확히 하나의 하위 요소에 있어야한다고 선언하는 것은 불가능합니다. 허용 된 모든 부속 요소를 명시 적으로 선언해야합니다. 요소의 유효성은 다른 요소에 첨부 된 속성에 의존 할 수 없습니다.

FWIW, 제약은 Schematron 스키마에 표현 될 수있다 : 약간의 변화와

<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron"> 

    <sch:pattern name="Check children of 'contact'"> 
    <sch:rule context="contact"> 
     <sch:assert test="*"> 
     'contact' must contain at least one element 
     </sch:assert> 
     <sch:assert test="count(*[@primaryContact='true']) = 1"> 
     'contact' must contain exactly one element where @primaryContact='true' 
     </sch:assert> 
    </sch:rule> 
    </sch:pattern> 

</sch:schema> 
1

당신은 당신이 당신이 필요로 표현할 수 있습니다 DTD에. 아이디어는 필요한 콘텐츠를 새로운 요소 인으로 래핑하는 것입니다. 이것은 하나 개의 primary 요소를 가지고 당신이 필요로 contact에 지정할 수 있습니다 :

<contact> 
    <primary><mobile>0861029388</mobile></primary> 
    <base>019374627</base> 
    <email>[email protected]</email> 
</contact> 

귀하의 DTD는 다음과 같습니다

<!ELEMENT contact (primary, (mobile|base|email)*)> 
<!ELEMENT primary (mobile|base|email)+> 
<!ELEMENT mobile (#PCDATA)> 
<!ELEMENT base (#PCDATA)> 
<!ELEMENT email (#PCDATA)> 

을 또는 중복을 줄이고 유지 보수 증가 :

<!ENTITY % contact_field "mobile|base|email" > 
<!ELEMENT contact (primary, (%contact_field;)*)> 
<!ELEMENT primary (%contact_field;)+> 
<!ELEMENT mobile (#PCDATA)> 
<!ELEMENT base (#PCDATA)> 
<!ELEMENT email (#PCDATA)>