如何在XSD中定义递归类型?

时间:2013-04-19 03:12:34

标签: xml validation xsd

此刻我正在与XSD战斗,这是一种胜利。我正在尝试按如下方式定义类型:

 <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.abc.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema">  
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Condition1" minOccurs="1" maxOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Operator" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="xs:string" name="SourceTableValue" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="xs:string" name="ValueToCompareTo" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="logicalOperator" name ="AND" minOccurs="0" maxOccurs="unbounded"/>
                  <xs:element type="logicalOperator" name ="OR" minOccurs="0" maxOccurs="unbounded"/>
                  <xs:element type="logicalOperator" name ="NOT" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="Condition2" minOccurs="0" maxOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Operator" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="xs:string" name="SourceTableValue" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="xs:string" name="ValueToCompareTo" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="logicalOperator" name ="AND" minOccurs="0" maxOccurs="unbounded"/>
                  <xs:element type="logicalOperator" name ="OR" minOccurs="0" maxOccurs="unbounded"/>
                  <xs:element type="logicalOperator" name ="NOT" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
....

但是,这给了我一个错误,Visual Studio强调 xs:element type =“logicalOperator”,并说“Namespace''不能在此模式中引用”。 然后,当我试图在模式中稍后引用类型“logicalOperator”时,我收到错误“未声明类型logicalOperator”。 我做错了什么?

2 个答案:

答案 0 :(得分:0)

您的架构太精确,无法进行精确诊断;假设XML名称空间声明只是您显示的声明,那么只需将xmlns="http://www.abc.com/"添加到&lt; xs:schema&gt; 元素,您就应该可以引用内容了使用没有前缀的名称在相同的模式文件或具有相同目标名称空间的不同模式文件中定义。

此片段:

<xs:element type="logicalOperator" .../>

正在尝试查找没有命名空间的logicalOperator类型 - 有时打印为{}logicalOperator

通过添加如上所示的xmlns,然后相同的变为{http://www.abc.com/}logicalOperator

公平地说,XSD不是唯一一个在这里打架的人; XML Namespaces也是:)......

答案 1 :(得分:0)

好的,我明白了。谢谢Petru。

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.abc.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:abc="http://www.abc.com/">  
   <xs:complexType  name="logicalOperator">
      <xs:sequence>
        <xs:element name="Condition1" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="Operator" minOccurs="1" maxOccurs="1"/>
              <xs:element type="xs:string" name="SourceTableValue" minOccurs="1" maxOccurs="1"/>
              <xs:element type="xs:string" name="ValueToCompareTo" minOccurs="1" maxOccurs="1"/>
              <xs:element type="abc:logicalOperator" name ="AND" minOccurs="0" maxOccurs="unbounded"/>
              <xs:element type="abc:logicalOperator" name ="OR" minOccurs="0" maxOccurs="unbounded"/>
              <xs:element type="abc:logicalOperator" name ="NOT" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Condition2" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="Operator" minOccurs="1" maxOccurs="1"/>
              <xs:element type="xs:string" name="SourceTableValue" minOccurs="1" maxOccurs="1"/>
              <xs:element type="xs:string" name="ValueToCompareTo" minOccurs="1" maxOccurs="1"/>
              <xs:element type="abc:logicalOperator" name ="AND" minOccurs="0" maxOccurs="unbounded"/>
              <xs:element type="abc:logicalOperator" name ="OR" minOccurs="0" maxOccurs="unbounded"/>
              <xs:element type="abc:logicalOperator" name ="NOT" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>