2012-05-10 6 views
4

부모가 요소 이름으로 고유 한 자식 요소를 갖고 있는지 확인하려고합니다. 또한 가능한 요소 중 적어도 하나가 존재하는지 확인해야합니다.XML 스키마의 고유 한 자식 요소

<StorageTypes> 
    <Status/> 
    <Warning/> 
    <Error/>    
</StorageTypes> 

는 유효 할 것이지만

<StorageTypes> 
    <Status/> 
    <Status/> 
    <Warning/> 
    <Error/>    
</StorageTypes> 

<StorageTypes>    
</StorageTypes> 

이 유효 할 것이다.

xs : unique을 사용하여 현재 노드를 선택했지만 일반적으로 필드 요소로 요소를 선택할 수 없습니다.

아래의 내용은 내가 찾고있는 것이지만 내가 찾고있는 강력한 해결책은 아닙니다. 나는 모든 변경에 대해 xpath를 변경하지 않고 더 많은 유형을 추가 할 수 있기를 원합니다.

<element ect.> 
    <xs:unique name="something"> 
     <xs:selector xpath="."/> 
     <xs:field xpath="Status"/> 
     <xs:field xpath="Warning"/> 
     <xs:field xpath="Error"/> 
    </xs:unique> 
</element> 

이것은 가능합니까? 이 좋은 습관인가? 어떤 조언을 주시면 감사하겠습니다.

답변

1

XSD 1.0 기반의 일반적인 솔루션은 불가능합니다. 나는 필드의 값이 text()를 사용하여 평가되기 때문에 독자가 원하는 것을 얻을 수 있다고 생각하지 않는다. 그래서 태그의 이름은이 일에 결코 영향을 미치지 않습니다 ...

원하는 것에 가깝게 달성 할 수는 있지만 모든 시나리오에서 작동하지 않거나 우아함이 부족하거나 타당성 ...

아래의 접근법은 일부에서는 우아한 것으로 간주되지 않을 수도 있지만 그럼에도 불구하고 동일한 목적을 달성 할 수 있습니다. 예를 들어

, 당신은에서와 같이 "태그"이름을 캡처하는 속성을 대신 사용하는 경우 :

<StorageTypes> 
    <Storage type="Status"/> 
    <Storage type="Warning"/> 
    <Storage type="Error"/> 
</StorageTypes> 

을 그리고 저장의 순서와 결합, @type 필드에 고유 작성, maxOccurs에의 =를 제공 어떤 당신이 묘사 한 것을 엄격히 말하십시오.

실제로 복잡한 콘텐츠가있는 요소를 찾고 있거나 속성이 허용되지 않은 경우 동일한 효과로 대체 그룹을 사용할 수 있습니다.

+0

감사합니다. 대체 그룹을 더 살펴 보겠습니다. 내가 제시 한 솔루션과 비슷한 솔루션을 가지고 있지만 열거 형을 사용하고 있습니다. 우리는 프레임 워크 스키마를 변경할 필요없이 미래의 스키마에 의한 확장을 허용하는보다 일반적인 것을 찾고있었습니다. – gettingSmarter

관련 문제