带有未定义内容的XSD元素

时间:2011-11-30 09:09:24

标签: xsd

我需要安装一个可以部分验证文件的XSD架构。文件结构是:

<Root>
    <Node name="core">
        <ElementA>String</ElementA>
        <ElementB>String</ElementB>
    </Node>
    <Node name="something unique">
        (any number of elements, with unknown names and types)
    </Node>
</Root>

我的XSD类似于:

<xs:element name="Root">
    <xs:complexType>
        <xs:sequence maxOccurs="unbounded">
            <xs:element name="Node">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="unbounded" />
                    </xs:sequence>                        
                    <xs:attribute name="name" type="xs:string" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

哪个不完整且不完全正确,未命名的<xs:element>无效。

需要一些节点,以及每个节点都有唯一的name属性;这是我想验证的。名称列表和这些节点的内容是预定义的。

名称未知的节点的内容也是未知的,可能包含任意数量的具有任何名称和类型的元素,但不得自行拥有属性或值。

我遇到麻烦的部分是允许子元素而不知道他们的名字。

是否可以使用XSD执行此类操作?有没有办法拥有复杂类型的元素,anyType和属性?

编辑:使用<Node> name作为元素类型,然后只允许使用名称未知的其他元素,这是可以接受的。无论哪种方式,我都需要允许名称和类型未知的节点。

1 个答案:

答案 0 :(得分:8)

要允许“不知道名字的子元素”,你可以使用xsd:any;在特定的(在“设计时”)内容之后将其添加为重复粒子。

<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Root">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Node">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="ElementA" type="xsd:string" />
              <xsd:element name="ElementB" type="xsd:string" />
            </xsd:sequence>
            <xsd:attribute name="name" type="xsd:string" use="required" />
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="Extensions" minOccurs="0">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:any maxOccurs="unbounded"     processContents="lax"/>
                </xsd:sequence>
                <xsd:anyAttribute processContents="lax"/>
            </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>