1

我想制作一个允许以下内容的 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> 标记,但后面的段落必须有它。

关于我应该看什么的任何提示?在我看来,通过在 complexType 定义上放置混合 =“真”,我无法得到我想要的东西。

更新:这不是因为第一段很特别。这只是因为我想避免编写一些标签。例如,我希望能够通过以下方式制作订单列表:

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

通常情况下,每个列表元素中只有一个段落,因此必须同时编写 <le> 和 <p> 很烦人。不过,我想支持列表元素中多个段落的不寻常情况。

4

1 回答 1

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 就是您的选择;试试这个作为介绍

于 2012-10-24T18:34:57.537 回答