XSD可以定义通配符复杂类型吗?

时间:2011-05-15 15:35:40

标签: xml xsd

说我不知道​​元素的名字是什么,但我确实知道孩子会是什么。例如,名称“foo”和“bar”没有规定,而是“A”,“B”和& “C”是。

<example>
    <foo>
        <A>A</A>
        <B>B</B>
        <C>C</C>
    </foo>
    <bar>
        <A>A</A>
        <B>B</B>
        <C>C</C>
    </bar>
</example>

我无法保留name属性,因为这是违规行为。我希望能够做到这一点:

<xs:element name="example">
    <xs:complexType>
        <xs:sequence maxOccurs="unbounded">
            <xs:any>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="A" type="xs:string"/>
                        <xs:element name="B" type="xs:string"/>
                        <xs:element name="C" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:any>
        </xs:sequence>
    </xs:complexType>
</xs:element>

这也不起作用,<xs:any>只能包含注释并拒绝输入类型。

我可以使用名称空间来处理未知元素名称吗?我应该放弃,不要试图验证孩子,只记录内容必须是什么?

2 个答案:

答案 0 :(得分:3)

您可以尝试使用substitution groups执行此操作:

<xs:element name="example">
  <xs:sequence>
    <xs:element ref="ABCSequence" minOccurs="0" maxOccurs="unbounded"/>
  </xs:sequence>
</xs:element>

<xs:element name="ABCSequence" abstract="true" type="ABCSeq" />
<xs:complexType name="ABCSeq">
  <xs:complexContent>
    <xs:sequence>
      <xs:element name="A" type="xsd:string" />
      <xs:element name="B" type="xsd:string" />
      <xs:element name="C" type="xsd:string" />
    </xs:sequence>
  </xs:complexContent>
</xs:complexType>

<xs:element name="foo" substitutionGroup="ABCSequence" type="ABCSeq" />
<xs:element name="bar" substitutionGroup="ABCSequence" type="ABCSeq" />

我不确定是否允许在不声明其类型(通过xsi:type属性)的情况下添加任意外部元素,但它至少允许描述您所追求的文档类型。

答案 1 :(得分:0)

你无法在XML Schema中完成你想要做的事情。有一个紧密的解决方案,但不是你想要的:

<xs:element name="example">
    <xs:complexType>
        <xs:sequence maxOccurs="unbounded">
            <xs:any namespace="##other" processContents="lax"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

现在,您可以为那里可能出现的元素提供单独的模式,例如一个用于foo,在单独的命名空间下和单独的模式文件中:

<xs:element name="foo">
    <xs:complexType>
        ....
    </xs:complexType>
</xs:element>

这就是你能做的所有事情(这是你的“多名称空间”解决方案)。您无法完全避免列出元素。如果这还不够好,那么将<xsd:any>设置为processContents的{​​{1}}是您唯一的解决方案,然后是外部验证(代码,Schematron等)