为pseudo-html编写XML Schema

时间:2011-10-31 21:20:30

标签: xml xsd

我正在尝试为某些类似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>

2 个答案:

答案 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。

这种方法的优点是您(或您的继任者)可以随时向替换组添加新元素,而对现有定义没有任何影响。