0

现在,我正在尝试做到这一点,因此我只有在选中第一个属性为检查时才验证付款中的第二个checknum属性。这是一些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>

我会使用哪种类型的 attlist 语句来明确说 check 必须有 checknum 但不能用于所有其他选择?

我在想这样的事情

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

但是当然第三行是无效的。

4

1 回答 1

1

这就是我理解这个问题的方式。<payment>元素有一个type属性。如果属性值为“check”,则checknum该元素上还必须有一个属性。如何在 DTD 中执行此操作?

基于其他元素和属性的值或出现对属性和元素的约束通常称为“共现约束”。这不能在 DTD 中表示。没有ATTLIST满足您要求的语法。所以答案是:不可能。

但是您可以使用RELAX NG来做到这一点。这是一个 RELAX NG 模式,其中包含两个可能的payment元素内容模型,仅在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 Schema 后继续存在。

自从写了那篇文章(我猜是大约 10 年前)以来,W3C XML Schema 已经在这个领域增加了新的特性(参见http://www.ibm.com/developerworks/xml/library/x-xml11pt2/index.html)。 html ). 但是 DTD 的功能并没有提高。

于 2013-09-21T08:17:22.863 回答