我正在尝试为某些类似HTML的XML编写模式。 它有< b><你<< i>< font>< img>标签全部在里面< p>(aragraph)标签。问题是它们可以按任何顺序排列:
<p> <u><b>test</u><b> </p>
或
<p> <b><u>test</u></b> </p>.
我正在尝试创建一个自引用复杂类型,但我总是得到“无效架构”错误。如果有人能指导我做正确的方法,我将不胜感激。
架构:
<xs:element name="HTMLDocument">
<xs:complexType>
<xs:sequence>
<xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="textElements" mixed="true">
<xs:group>
<xs:element name="b" type="textElements"/>
<xs:element name="i" type="textElements"/>
<xs:element name="u" type="textElements"/>
<xs:element name="a" type="textElements"/>
<xs:element name="font" type="textElements">
<xs:complexType>
<xs:attribute name="size" type="xs:string"/>
<xs:attribute name="face" type="xs:string"/>
<xs:attribute name="color" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="img">
<xs:complexType>
<xs:attribute name="src" type="xs:string"/>
<xs:attribute name="width" type="xs:decimal"/>
<xs:attribute name="height" type="xs:decimal"/>
</xs:complexType>
</xs:element>
</xs:group>
</xs:complexType>
</xs:schema>
答案 0 :(得分:1)
Gaaah,诅咒XML Schema!
抱歉,有时需要让它出来。我认为这可以做你想要的,但有些测试也不错:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="HTMLDocument">
<xs:complexType>
<xs:sequence>
<xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="textElements" mixed="true">
<xs:group ref="textElementGroup" minOccurs="0" maxOccurs="unbounded"/>
</xs:complexType>
<xs:group name="textElementGroup">
<xs:choice>
<xs:element name="b" type="textElements" minOccurs="0" maxOccurs="1"/>
<xs:element name="i" type="textElements" minOccurs="0" maxOccurs="1"/>
<xs:element name="u" type="textElements" minOccurs="0" maxOccurs="1"/>
<xs:element name="a" type="textElements" minOccurs="0" maxOccurs="1"/>
<xs:element name="font" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="textElements">
<xs:attribute name="size" type="xs:string"/>
<xs:attribute name="face" type="xs:string"/>
<xs:attribute name="color" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="img" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="src" type="xs:string"/>
<xs:attribute name="width" type="xs:decimal"/>
<xs:attribute name="height" type="xs:decimal"/>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:group>
</xs:schema>
编辑:哦,看起来你不需要额外的xs:序列。我会把它拿出来......
答案 1 :(得分:1)
一个好的设计模式是使用抽象元素和替换组。将textElements的内容模型定义为<xs:element ref="inline" maxOccurs="unbounded"/>
。将inline
定义为抽象元素。将元素b,i,u等定义为内联的替换组。将内联模型定义为textElements。
这种方法的优点是您(或您的继任者)可以随时向替换组添加新元素,而对现有定义没有任何影响。