我的要求是有一个 XSD 文件,它根据属性值检查元素。我能够将 XSD 编写到可以限制 Application/@Type 属性值的程度。谁能帮助我完成 XSD 文件,在其中我可以根据 Application/@Type 属性制作一些必需的元素?

我想做

  • PackageArg 仅当 Application/@Type 为“Batch”时才需要
  • 仅当 Application/@Type 为“Service”时才需要版本
  • 仅当Application/@Type 为“Web”或“Service”时才需要Project

XML 文件

<Applications>         
    <Application Name="ConfigManagement" Type="Web">             
        <ProjectDirName>ConfigManagement</ProjectDirName> 
        <Project>Web.ConfigManagement.csproj</Project> 
        <OutputDirName>ConfigManagement</OutputDirName>             
    </Application> 
    <Application Name="Util" Type="Web">             
        <ProjectDirName>Web</ProjectDirName> 
        <Project>Web.csproj</Project>         
        <OutputDirName>Util</OutputDirName>     
    </Application> 
    <Application Name="ConfigService" Type="Service"> 
        <ProjectDirName>WebServices\ConfigService</ProjectDirName> 
        <Project>ConfigService.csproj</Project>     
        <Version>2015\04</Version> 
        <OutputDirName>ConfigService</OutputDirName> 
    </Application> 
    <Application Name="DeliverEmail" Type="Batch">         
        <ProjectDirName>\Batch\DeliverEmail</ProjectDirName> 
        <PackageArg>Release</PackageArg>         
        <OutputDirName>Tidal\DeliverEmail</OutputDirName>             
    </Application> 
</Applications> 

XSD 文件

<xs:element name="Applications" maxOccurs="1"> 
  <xs:complexType> 
    <xs:sequence> 
      <xs:element name="Application" maxOccurs="unbounded" minOccurs="1"> 
        <xs:complexType> 
          <xs:all> 
            <xs:element type="xs:string" name="ProjectDirName"/> 
            <xs:element type="xs:string" name="Project" minOccurs="0"/> 
            <xs:element type="xs:string" name="Version" minOccurs="0"/> 
            <xs:element type="xs:string" name="PackageArg" minOccurs="0"/> 
            <xs:element type="xs:string" name="OutputDirName"/> 
          </xs:all> 
          <xs:attribute type="xs:string" name="Name" use="optional"/> 
          <xs:attribute name="Type" use="required"> 
            <xs:simpleType> 
              <xs:restriction base="xs:string"> 
                <xs:enumeration value="Web"/> 
                <xs:enumeration value="Batch"/> 
                <xs:enumeration value="Service"/> 
              </xs:restriction> 
            </xs:simpleType> 
          </xs:attribute> 
        </xs:complexType> 
      </xs:element> 
    </xs:sequence> 
  </xs:complexType> 
</xs:element> 

请您参考如下方法:

更新: OP 已编辑问题以删除 xs:assert 的使用,并在注释中声明验证必须在 C# 中进行。 OP问题的答案现在变成:

您无法使用 XSD 1.0 强制执行根据属性值改变元素需求的约束,并且 Microsoft 不支持 XSD 1.1,因此您必须放宽约束或在 XSD 之外检查它们。

<小时 />

原始 XSD 1.1 答案

(保留是为了将来的读者)

你很接近,但你的断言,

      <xs:assert test="count(./PackageArg[@type eq 'Batch']) eq 1"/> 

当应该在 Application 上测试 @Type 时,在 PackageArg 上测试 @type

以下 XSD 将验证您的 XML 并强制执行与属性相关的要求:

XSD 1.1

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
           vc:minVersion="1.1"> 
  <xs:element name="Applications"> 
    <xs:complexType> 
      <xs:sequence> 
        <xs:element name="Application" maxOccurs="unbounded" minOccurs="1"> 
          <xs:complexType> 
            <xs:all> 
              <xs:element type="xs:string" name="ProjectDirName"/> 
              <xs:element type="xs:string" name="Project" minOccurs="0"/> 
              <xs:element type="xs:string" name="Version" minOccurs="0"/> 
              <xs:element type="xs:string" name="PackageArg" minOccurs="0"/> 
              <xs:element type="xs:string" name="OutputDirName"/> 
            </xs:all> 
            <xs:attribute type="xs:string" name="Name" use="optional"/> 
            <xs:attribute name="Type" use="required"> 
              <xs:simpleType> 
                <xs:restriction base="xs:string"> 
                  <xs:enumeration value="Web"/> 
                  <xs:enumeration value="Batch"/> 
                  <xs:enumeration value="Service"/> 
                </xs:restriction> 
              </xs:simpleType> 
            </xs:attribute> 
            <xs:assert test="PackageArg or @Type != 'Batch'"/> 
            <xs:assert test="Version or @Type != 'Service'"/> 
            <xs:assert test="Project or not(@Type = 'Web' or @Type = 'Service')"/> 
          </xs:complexType> 
        </xs:element> 
      </xs:sequence> 
    </xs:complexType> 
  </xs:element> 
</xs:schema> 

请注意,Microsoft 不支持 XSD 1.1。 (您已用“msxml”标记您的问题)。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!