2011-10-31 53 views
1

我正在尝试编写一些类似HTML的XML的模式。 它有< b> < u> < i> <> < img>标签内所有< p>(aragraph)标记。问题是,他们可以在任何顺序:为假html编写XML模式

<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> 

回答

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:序列。我会把它拿出来...

+0

辉煌,完美的工作。我是xml架构的新手,“gaaah”引起了我的共鸣...... – shane

+1

@shane我对XML Schema并不陌生,每次都会让我接近疯狂。我永远不会理解事情如何能够直截了当地工作。有时在晚上当我独自一人在办公室时,我打印出它的规格,然后立即通过碎纸机运行。无论如何,我认为你明白了。 –

+1

RNG RNG RNG RNG RNG。 – bmargulies

1

一个很好的设计模式是使用抽象元素和替换组。将textElements的内容模型定义为<xs:element ref="inline" maxOccurs="unbounded"/>。将inline定义为抽象元素。将元素b,i,u等定义为内联替换组。将内联模型定义为textElements。

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