XSD替换组n:m映射/多个替换组

时间:2014-09-01 11:07:25

标签: xml powershell xsd substitution

我正在开发可通过XML配置并可使用PowerShell模块扩展的构建工具。我有一个XSD(http://download.crawler-lib.net/BuildTools/BuildConfig.xsd),它描述了开箱即用的功能。正如前一个问题(Extending XML Schema xs:choice)中所建议的,我想使用替换组以可扩展的方式映射我的工具。但现在我遇到了一个问题:有些工具只在某些地方有效。如何以可扩展的方式将工具限制或映射到我的元素?

硬编码我会使用<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 个答案:

答案 0 :(得分:1)

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