2012-10-24 88 views
1

我想打一个XSD,将允许类似如下:制约混合模式XSD

<document> 
    Here is first paragraph with e.g. <i>itallic</i> and <b>bold</b>. 

    <p>Here is the second paragraph also with some <i>itallic</i></p> 

    <p>Here is the third paragraph</p> 

    <!-- If there is any character data here it should be rejected --> 
</document> 

例如,我想允许第一段没有< p>标签角落找寻它,但后续段落必须具备。

任何提示我应该看什么?在我看来,我无法通过将mixed =“true”放在复杂类型定义上来获得我想要的结果。

更新:这不是因为第一段是特殊的。这仅仅是因为我想避免写一些标签。例如,我希望能够让这个命令列表:

<ol> 
    <le>Here is the first list element, only one paragraph, easy to write</le> 
    <le>Here is the second element. 
     <p>The second element has an extra paragaph.</p> 
    </le> 
</ol> 

正常情况下将是只有一个在每个列表元素段落所以很讨厌不得不写两个<乐>和< p>。不过,我想支持列表元素中多个段落的不寻常情况。

+1

你有没有尝试过你可以分享? – psubsee2003

+0

有时当XSD不允许某种设计时,这是因为XSD的设计者不想鼓励人们以这种方式使用XML。有时候我认为他们是对的。 –

回答

0

事实上,你无法得到你想要的XSD 1.0。虽然XSD 1.0混合内容可能控制出现在实例XML中的子元素的顺序和数量,但它无法控制其中的文本。如果你不允许< p>标签之外的任何文本,将两个“领域”拆分可能是你唯一的选择:第一个是混合内容,对于第一个段落,其他的将是p的任意重复序列混合或任何内容的标签。

我在说明一个可能的例子,假设第一段是“特殊的”,因为它是一个“介绍”;因此,对于这个XML:

<document> 
    <intro>Here is first paragraph with e.g. <i>itallic</i> and <b>bold</b>.</intro> 
    <p>Here is the second paragraph also with some <i>itallic</i></p> 
    <p>Here is the third paragraph</p> 
</document> 

您可以定义是这样的:

<?xml version="1.0" encoding="utf-8"?> 
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)--> 
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="document"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="intro"> 
      <xsd:complexType mixed="true"> 
      <xsd:sequence> 
       <xsd:element name="i" type="xsd:string" /> 
       <xsd:element name="b" type="xsd:string" /> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     <xsd:element maxOccurs="unbounded" name="p"> 
      <xsd:complexType mixed="true"> 
      <xsd:sequence minOccurs="0"> 
       <xsd:element name="i" type="xsd:string" /> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

当然,你要怎样炼成的标记可以被使用,但你的想法...您转换可以照顾根据需要去除< intro>标签。

如果您对提示的要求意味着什么其他模式语言,你可以使用,然后...

  • 如果你可以部署XSD 1.1架构,新xsd:assert可以帮助你在这里。

  • 如果您可以部署其他架构语言,那么Relax NG就是您的票;试试这个为introduction

+0

感谢您的快速回复!我认为我理解你的建议基本上有一个“文档”节点,其中直接混合了内容,还有一个“document2”节点,它有一个序列p标签。无论如何,我明白,我所尝试的是XSD 1.0所无法实现的,而这正是我之前所做的。不幸的是,我的编辑器(Eclipse)仅支持DTD和XSD 1.0,所以我必须坚持使用它们。 – user1772004

+0

@ user1772004,如果你愿意,你可以尝试另一条路线。我喜欢认为XML标签应该传达语义。因此,我会尝试首先确定“第一个”文本块的含义,它是什么使它变得特别。一旦你找到了,在你的XML标记中调用它。它将使您更容易使用您的模式,并阅读XML。 –