xml - 根据 XSD 中的属性值制作必需的 XML 元素

标签 xml xsd msxml

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

我想做

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

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 答案

(保留以供 future 读者使用)

你很接近,但是你的断言,

      <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”标记您的问题)。

关于xml - 根据 XSD 中的属性值制作必需的 XML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30606320/

相关文章:

xml - Treewalker 异常,Eclipse

java - xsd 验证失败

java - 如何在 Java 中从 xsd 创建对象树?

xml - 用于检索最旧/最早节点的 Xpath 表达式

c++ - MSXML2 : How can I get value of a node?

javascript - 在 indesign 脚本中使用 xml 内容标记

java - XML 属性值中无法识别换行符? Java、DOM、JTextArea

java - 根据屏幕尺寸调整项目高度以适合其 RecyclerView

c++ - 从 BSTR 中删除 XML 声明的最佳方法

java - 在 eclipse 中从 xsd 生成 JAXB 模型时出错