0

現在、選択した最初の属性がチェックである場合にのみ、支払いのチェックナムの2番目の属性を検証しようとしています。ここにいくつかのxmlの例があります

小切手なしの支払いが選択されました

 <payment type="transfer" >
      <to category="utilities">Central Electric</to>
      <amount>94.85</amount>
      <date>2005-08-29</date>
      <description>Electric Bill</description>
   </payment>

小切手による支払いを選択

<payment type="check" checknum="C1213">
      <to category="food">Pizza Now</to>
      <amount>33.24</amount>
      <date>2005-08-28</date>
      <description>Dinner</description>
   </payment>

check には checknum が必要ですが、他のすべての選択には必要ないと具体的に言うには、どのタイプの attlist ステートメントを使用しますか?

私はこのようなことを線で考えていました

<!ELEMENT payment  (to,amount,date,description)>    
<!ATTLIST payment type (check | transfer | atm) "check" >
<!ATTLIST payment type (check)  checknum >

しかし、もちろん 3 行目は有効ではありません。

4

1 に答える 1

1

これが私が質問を理解する方法です。<payment>要素には属性typeがあります。属性値が「check」の場合、checknumその要素にも属性が必要です。これを DTD で強制するにはどうすればよいですか?

他の要素および属性の値または出現に基づく属性および要素に対する制約は、「共起制約」と呼ばれることがよくあります。これはDTDでは表現できません。ATTLIST要件を満たす構文はありません。したがって、答えは次のとおりです。それは不可能です。

しかし、 RELAX NGでそれを行うことができます。以下は、属性paymentの扱いのみが異なる要素の 2 つのコンテンツ モデルを持つ RELAX NG スキーマです。type

start = payment1 | payment2

payment1 = element payment { attribute type { "check" }, attribute checknum { text }, 
                             to, amount, date, description }
payment2 = element payment { attribute type { "transfer" | "atm" }, 
                             to, amount, date, description }

to = element to { attribute category { text }, text}
amount = element amount { xsd:float }
date = element date { xsd:date }
description = element description { text }

検証するテスト ドキュメント:

<payment type="check">
  <to category="food">Pizza Now</to>
  <amount>33.24</amount>
  <date>2005-08-28</date>
  <description>Dinner</description>
</payment>

Jingで確認すると、結果は次のようになります。

$ java -jar jing.jar -c payment.rnc payment.xml
payment.xml:1:23: error: element "payment" missing required attribute "checknum"

Eric van der Vlist 著の書籍「RELAX NG」には、共起制約に関するセクションがあります。ここに引用があります:

共起制約は強力な機能を提供しますが、残念ながら DTD や W3C XML スキーマへの変換には耐えられません。

それが書かれて以来 (約 10 年前だと思います)、W3C XML スキーマはこの分野の新機能で強化されました ( http://www.ibm.com/developerworks/xml/library/x-xml11pt2/index.html を参照)。 html )。しかし、DTD の機能は改善されていません。

于 2013-09-21T08:17:22.863 に答える