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> タグを付けないようにしたいのですが、後続の段落には <p> タグを付ける必要があります。

何を見るべきかについてのヒントはありますか?complexType 定義に 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>

通常、各リスト要素には 1 つの段落しかないため、<le> と <p> の両方を書かなければならないのは面倒です。それでも、リスト要素に複数の段落があるという特殊なケースをサポートしたいと考えています。

4

1 に答える 1

0

実際、XSD 1.0 では望むものを得ることができません。XSD 1.0 混合コンテンツは、インスタンス XML に表示される子要素の順序と数を制御できますが、その中のテキストを制御することはできません。<p> タグの外側にテキストを許可しないと仮定すると、2 つの「レルム」を分割することが唯一のオプションになる可能性があります。混合または任意のコンテンツのタグ。

最初の段落が「イントロ」であるため「特別」であると仮定して、考えられる例を示しています。したがって、この 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 に答える