是否可以创建一个XML Schema,它对属性/元素对强加共生约束?
<primitive-list>
<primitive name="P1">
<definition><!-- primitive specification --></definition>
</primitive>
<primitive name="P2">
<definition><!-- primitive specification --></definition>
</primitive>
<!-- other common primitives are specified here-->
<primitive-list>
<composite-list>
<composite name="C1">
<primitive ref="P1" />
<primitive ref="P2" />
<primitive>
<definition><!-- inline primitive specification --></definition>
</primitive>
</composite>
<!-- Other compisites are specified here-->
</composite-list>
架构应该意味着:
我很确定这是可能的,因为XML Schema中的元素元素本身就是这样。所以任何拥有这种神圣知识的人都请分享: - )
提前谢谢。
答案 0 :(得分:9)
在互联网上搜索并挖掘了一些书后,我想出了如何实现它。
首先,我们需要定义一个泛型类型,它适应两种原语元素的所有属性和元素。假设定义元素在其他地方定义。
<xs:complexType name="primitive" abstract="true">
<xs:sequence>
<xs:element ref="definition" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" type="xs:Name" />
<xs:attribute name="ref" type="xs:Name" />
</xs:complexType>
然后我们定义两个原始子类型,用于基元列表和 分别为复合。
<xs:complexType name="public-primitive">
<xs:complexContent>
<xs:restriction base="primitive">
<xs:sequence>
<xs:element ref="definition" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" type="xs:Name" use="required" />
<xs:attribute name="ref" use="prohibited" />
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="private-primitive">
<xs:complexContent>
<xs:restriction base="primitive">
<xs:sequence>
<xs:element ref="definition" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" use="prohibited" />
</xs:restriction>
</xs:complexContent>
</xs:complexType>
现在我们可以根据这些复杂类型定义 primitive-list 和复合元素,如下所示:
<xs:element name="primitive-list">
<xs:complexType>
<xs:sequence>
<xs:element name="primitive" type="public-primitive" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="composite">
<xs:complexType>
<xs:sequence>
<xs:element name="primitive" type="private-primitive" maxOccurs="unbounded">
<xs:key name="definition-ref--co-occurrence--constraint">
<xs:selector xpath="." />
<xs:field xpath="definition|@ref" />
</xs:key>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
让我们看看原始架构要求,看看它们是如何实施的:
- 如果在 primitive-list 元素中指定了 primitive 元素,那么它应该包含 name 属性和嵌入的定义元素,但不是 ref 属性。
此要求仅由 public-primitive 类型的定义强制执行。
- 如果复合元素中指定了原语元素,则它应包含 ref 属性或定义< / b>元素。两种情况都不允许使用名称。
此要求由 private-primitive 类型的定义以及原语元素中指定的 xs:key 元素强制执行在复合元素内部。 参考或定义的 xs:key 保证存在,但不是两者都存在。
答案 1 :(得分:0)
是的,这是可能的。在创建XML模式时,您将根据XML树中元素定义的位置为每个方案创建复杂类型。
如果我过了一会儿,我可以尝试在这里为你做一个例子,我只是没有时间把这一切都完美地发布在这里。
我个人强烈建议您查看此w3schools tutorial,因为它可以满足您的需求。
答案 2 :(得分:0)
好的,这是一个示例,这会让你关闭,唯一没有处理的是复合的primitive和ref属性。看看我能找到什么,通过模式几乎不可能做到这一点。我不是百分之百确定,但在我看到这一点的所有情况下,这样的模式用于高级验证,然后使用流程代码验证各个项目。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://www.iowacomputergurus.com/stackoverflow/samples/xsdexample"
elementFormDefault="qualified"
xmlns="http://www.iowacomputergurus.com/stackoverflow/samples/xsdexample"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:complexType name="PrimitiveType">
<xs:sequence>
<xs:element name="definition" type="xs:string" minOccurs="1" maxOccurs="1" />
</xs:sequence>
<xs:attribute name ="name" use="required" type="xs:string" />
</xs:complexType>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="primitive-list" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="primitive" type="PrimitiveType" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="composite-list" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="composite">
<xs:complexType>
<xs:sequence>
<xs:element name="primitive" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="definition" minOccurs="0" maxOccurs="1" />
</xs:sequence>
<xs:attribute name="ref" use="optional" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>