说我不知道元素的名字是什么,但我确实知道孩子会是什么。例如,名称“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>
只能包含注释并拒绝输入类型。
我可以使用名称空间来处理未知元素名称吗?我应该放弃,不要试图验证孩子,只记录内容必须是什么?
答案 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等)