如何创建一个在属性值验证方面不同的XSD?

时间:2012-09-26 11:24:56

标签: sql-server xml xsd

我一直在寻找一段时间,并得出结论可能无法更改属性的每个值的验证。

例如,我有两个“动作”节点,都有“type”属性和两个元素(“name”和“description”)

只有当“type”属性的值为“1”时,它才有一个带有“abc”子元素的“a”元素,当“type”属性为“2”时,它有一个带有“bla”元素的“bla”元素但“儿童元素。

类型1的示例

<action type="1">
  <name>yup</name>
  <description>yyy</description>
  <a>
    <abc>false</abc>
  </a>
</action>

类型2的示例

<action type="2">
  <name>yup2</name>
  <description>RRR</description>
  <bla>
    <yet />
  </bla>
</action>

我想创建一个可以检查这两种类型的XSD *,这可能吗? 如果是这样,怎么样?

  • 它必须是一个XSD,因为我想将XSD放在MSSQL数据库表的XML列上。

2 个答案:

答案 0 :(得分:1)

你是对的,XSD 1.0不可能是MSSQL支持的唯一XSD版本。您可以获得的最佳效果是在abla之间创建一个选项,可能会对属性type值设置一些限制等。下面是一个插图。

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="action">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" type="xs:string" />
        <xs:element name="description" type="xs:string" />
        <xs:choice>     
            <xs:element name="a">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="abc" type="xs:boolean" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="bla">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="yet" type="xs:anyType" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
        </xs:choice>
      </xs:sequence>
      <xs:attribute name="type" type="xs:unsignedByte" use="required" />
    </xs:complexType>
  </xs:element>
</xs:schema>

如果您控制XML结构,并且仍想使用某个属性来控制内容模型,则xsi:type是在XSD 1.0中执行此操作的唯一方法。

答案 1 :(得分:0)

您可以使用工具XML Stylus Studio创建任何类型的复杂XSD。

查看详细信息:http://www.stylusstudio.com/