2014-09-01 45 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> 

有共同PowerShell的工具。否则使用替代组是没有问题的。所以我不知道如何以可重用的方式映射这些元素。

回答

1

在XSD 1.0替换组中形成一个层次结构,所以只有在不同地方允许的工具集合只是嵌套的情况下才能使用。在XSD 1.1中,元素可以属于多个置换组,因此您可以(如果有意义的话)将每个这样的置换集映射到置换组(通常以抽象元素作为头部)并为每个定义专门的成员资格。然而,如果这种安排有一些自然的语义,那么我只会倾向于这样做,也就是说,如果这些工具形成了可以以对用户有意义的方式描述的集合。

+0

谢谢你的信息,我尝试了一个稍微不同的方法。我定义了一个通用工具元素()以及我需要特定工具的特定工具元素。 ()。然后,我将选择一般和特定的元素放在需要使用这些工具的地方。所以我拥有可以在任何地方工作的“通用”工具,以及用于构建步骤,标签,版本等的特定工具。它不完全灵活,但其语义对我来说很有用。 – 2014-09-01 13:59:29