Xml XSD可以定义通配符复杂类型吗?
假设我不知道一个元素的名称是什么,但我知道它的子元素是什么。例如,未规定名称“foo”和“bar”,但规定名称“A”、“B”和“C” 这也不起作用,Xml XSD可以定义通配符复杂类型吗?,xml,xsd,Xml,Xsd,假设我不知道一个元素的名称是什么,但我知道它的子元素是什么。例如,未规定名称“foo”和“bar”,但规定名称“A”、“B”和“C” 这也不起作用,只能包含注释并拒绝类型 我可以用名称空间来处理未知的元素名吗?我是否应该放弃,而不是尝试验证子项,而只是记录必须包含的内容?在XML模式中,您无法完全实现您想要做的事情。有一个接近的解决方案,但不完全是您想要的: <xs:element name="example"> <xs:complexType>
只能包含注释并拒绝类型
我可以用名称空间来处理未知的元素名吗?我是否应该放弃,而不是尝试验证子项,而只是记录必须包含的内容?在XML模式中,您无法完全实现您想要做的事情。有一个接近的解决方案,但不完全是您想要的:
<xs:element name="example">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:any namespace="##other" processContents="lax"/>
</xs:sequence>
</xs:complexType>
</xs:element>
这就是您所能做的(这是您的“多名称空间”解决方案)。您无法避免完全列出这些元素。如果这还不够好,那么将
processContents
设置为skip
的
是您唯一的解决方案,然后是外部验证(代码、Schematron等)您可以尝试使用:
我不确定这是否允许在不声明类型的情况下添加任意外部元素(通过
xsi:type
属性),但它至少允许描述您要查找的文档类型。外部验证是我唯一剩下的选项。+1是一个巧妙的技巧。如果我能让过去和未来的每一位开发人员都参与进来,在他们的XML中包含替换,那么这个答案将是成功的,但不幸的是,这是不可能的。如果你想让未来的每一位开发人员都遵守你的模式,那么你就在一场失败的战斗中。我见过人们所说的XML。我看过他们是如何“解析”它的。亲爱的上帝,我已经看到了他们所做的……使用xsi:type
注释并将解析器置于验证模式(默认情况下通常是关闭的)可能是您唯一的希望。(然后问欧比万。)
<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:element name="example">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:any namespace="##other" processContents="lax"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="foo">
<xs:complexType>
....
</xs:complexType>
</xs:element>
<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" />