2014-09-01 2 views
0

XML을 통해 구성 가능하고 PowerShell 모듈로 확장 가능한 빌드 도구를 개발 중입니다. 나는 박스 기능을 설명하는 XSD (http://download.crawler-lib.net/BuildTools/BuildConfig.xsd)를 가지고있다. 이전 질문 (Extending XML Schema xs:choice)에서 제안했듯이 대체 도구를 사용하여 내 도구를 확장 가능한 방식으로 매핑합니다. 하지만 이제는 문제가 있습니다. 일부 도구는 특정 위치에서만 유효합니다. 도구를 확장 가능하게 요소에 제한하거나 매핑하는 방법은 무엇입니까?XSD 대체 그룹 n : m 매핑/다중 대체 그룹

하드 코드 특정 위치에 도구를 정의하려면 <xs:choice>을 사용합니다. 예 빌드 도구 :

<xs:choice maxOccurs="unbounded" minOccurs="0"> 
    <xs:element ref="bt:AppendText"/> 
    <xs:element ref="bt:Autover"/> 
    <xs:element ref="bt:Call"/> 
    <xs:element ref="bt:CopyFile"/> 
    <xs:element ref="bt:Download"/> 
    <xs:element ref="bt:DumpContext"/> 
    <xs:element ref="bt:FxCop"/> 
    <xs:element ref="bt:IntelliLock"/> 
    <xs:element ref="bt:MSBuild"/> 
    <xs:element ref="bt:NuGetPack"/> 
    <xs:element ref="bt:NuGetPush"/> 
    <xs:element ref="bt:NUnit"/> 
    <xs:element ref="bt:NuSpecUpdate"/> 
    <xs:element ref="bt:Powershell"/> 
    <xs:element ref="bt:RemoveFile"/> 
    <xs:element ref="bt:Upload"/> 
    <xs:element ref="bt:VerifyFile"/> 
    <xs:element ref="bt:Xslt"/> 
    <xs:element ref="bt:Zip"/> 
    </xs:choice> 

자격 증명 도구 :

<xs:choice maxOccurs="unbounded" minOccurs="0"> 
    <xs:element ref="bt:Powershell"/> 
    <xs:element ref="bt:File"/> 
    <xs:element ref="bt:Plain"/> 
    </xs:choice> 

공통의 파워 쉘 도구를 가지고있다. 그렇지 않으면 대체 그룹을 사용하는 데 아무런 문제가 없습니다. 따라서 이러한 요소를 재사용 가능한 방식으로 매핑하는 방법을 모르겠습니다.

답변

1

XSD 1.0에서 대체 그룹은 계층 구조를 형성하므로 다른 위치에서 허용되는 도구 세트가 단순히 중첩 된 경우에만 작동합니다. XSD 1.1에서 요소는 둘 이상의 하위 그룹에 속할 수 있으므로 해당 집합을 대체 그룹 (일반적으로 추상 요소를 머리로 갖는)으로 매핑하고 각 그룹에 대해 고유하게 멤버를 정의 할 수 있습니다. 그러나 어레인지에 대한 자연스러운 의미가있는 경우, 즉 도구가 사용자에게 의미있는 방식으로 설명 될 수있는 세트를 구성하는 경우에만이 방법을 사용합니다.

+0

정보를 제공해 주셔서 감사합니다. 약간 다른 접근 방식을 시도했습니다. 일반적인 도구 요소 ()와 특정 도구를 habe하기 위해 필요한 특정 도구 요소를 정의했습니다. (). 그런 다음 도구를 사용해야하는 일반 요소와 특정 요소를 선택합니다. 그래서 어디서나 사용할 수있는 "일반적인"도구와 빌드 단계, 레이블, 버전 등을위한 특정 도구가 있습니다. 완전히 유연하지는 않지만 그 의미론은 저에게 효과적입니다. –