将#PCDATA 放在 DTD 混合内容中
Place #PCDATA in DTD mixed Content
实际上可以指定一个元素可以同时包含PCDATA 和其他元素。这种内容模型称为混合。要指定混合内容模型,只需列出#PCDATA 以及您要允许的子元素:
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (CUSTOMER)*>
<!ELEMENT CUSTOMER (NAME,DATE,ORDERS)>
<!ELEMENT NAME (LAST_NAME,FIRST_NAME)>
<!ELEMENT LAST_NAME (#PCDATA)>
<!ELEMENT FIRST_NAME (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT ORDERS (ITEM)*>
<!ELEMENT ITEM (PRODUCT, NUMBER, PRICE)>
<!ELEMENT PRODUCT (#PCDATA | PRODUCT_ID)*>
<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ELEMENT PRODUCT_ID (#PCDATA)>
]>
<DOCUMENT>
<CUSTOMER>
<NAME>
<LAST_NAME>Weber</LAST_NAME>
<FIRST_NAME>Bill</FIRST_NAME>
</NAME>
<DATE>October 25, 2003</DATE>
<ORDERS>
<ITEM>
<PRODUCT>Asparagus</PRODUCT>
<NUMBER>12</NUMBER>
<PRICE>.95</PRICE>
</ITEM>
<ITEM>
<PRODUCT>Lettuce</PRODUCT>
<NUMBER>6</NUMBER>
<PRICE>.50</PRICE>
</ITEM>
</ORDERS>
</CUSTOMER>
</DOCUMENT>
我在使用验证器(.NET XML 解析器、MSXML SAX、MSXML DOM、Java 内置),如果 #PCDATA
在列表的顶部 - 检查通过。如果在 #PCDATA 之前是成员 - 存在验证错误。
为什么混合#PCDATA
元素一定要放在第一位?
是的,您在这里指定的是 混合内容,如 w3C specification, §3.2.2 中所定义。
混合内容声明
[51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'
事实上,限制是:
#PCDATA
必须先出现;
- 之后可以提供标签列表,每个标签只能出现一次;
- 最后唯一允许出现的规范是
*
。
所以基本上 #PCDATA
必须先出现的原因是 因为规范要求。
实际上可以指定一个元素可以同时包含PCDATA 和其他元素。这种内容模型称为混合。要指定混合内容模型,只需列出#PCDATA 以及您要允许的子元素:
<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (CUSTOMER)*>
<!ELEMENT CUSTOMER (NAME,DATE,ORDERS)>
<!ELEMENT NAME (LAST_NAME,FIRST_NAME)>
<!ELEMENT LAST_NAME (#PCDATA)>
<!ELEMENT FIRST_NAME (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT ORDERS (ITEM)*>
<!ELEMENT ITEM (PRODUCT, NUMBER, PRICE)>
<!ELEMENT PRODUCT (#PCDATA | PRODUCT_ID)*>
<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ELEMENT PRODUCT_ID (#PCDATA)>
]>
<DOCUMENT>
<CUSTOMER>
<NAME>
<LAST_NAME>Weber</LAST_NAME>
<FIRST_NAME>Bill</FIRST_NAME>
</NAME>
<DATE>October 25, 2003</DATE>
<ORDERS>
<ITEM>
<PRODUCT>Asparagus</PRODUCT>
<NUMBER>12</NUMBER>
<PRICE>.95</PRICE>
</ITEM>
<ITEM>
<PRODUCT>Lettuce</PRODUCT>
<NUMBER>6</NUMBER>
<PRICE>.50</PRICE>
</ITEM>
</ORDERS>
</CUSTOMER>
</DOCUMENT>
我在使用验证器(.NET XML 解析器、MSXML SAX、MSXML DOM、Java 内置),如果 #PCDATA
在列表的顶部 - 检查通过。如果在 #PCDATA 之前是成员 - 存在验证错误。
为什么混合#PCDATA
元素一定要放在第一位?
是的,您在这里指定的是 混合内容,如 w3C specification, §3.2.2 中所定义。 混合内容声明
[51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'
事实上,限制是:
#PCDATA
必须先出现;- 之后可以提供标签列表,每个标签只能出现一次;
- 最后唯一允许出现的规范是
*
。
所以基本上 #PCDATA
必须先出现的原因是 因为规范要求。