您当前的位置: 首页 > 学无止境 > XML与XSLT 网站首页XML与XSLT
dtd文档详解-属性篇
发布时间:2015-03-31 19:13:25编辑:雪饮阅读()
当我们的xml使用了dtd来做验证时候,若dtd文档中没有声明属性列表的时候是不能够随便使用属性的:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE 班级 [<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 ANY>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
]>
<班级>
<学生 住址="花果山">
<名字>孙悟空</名字>
<年龄>500</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生>
<名字>林青霞</名字>
<年龄>32</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级>
该xml中使用了dtd文档验证,dtd中并没有属性“住址“。所以运行验证脚本后会出现属性的错误。我们需要为该xml加入属性的使用权:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE 班级 [<!ELEMENT 班级 (学生+)>
<!ATTLIST 学生
住址 CDATA #REQUIRED
>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 ANY>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
]>
<班级>
<学生 住址="花果山">
<名字>孙悟空</名字>
<年龄>500</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生 住址="花果山">
<名字>林青霞</名字>
<年龄>32</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级>
我们在dtd中声明了”住址“属性,类型为字符数据(CDATA),且该属性必须有(#REQUIRED),由于该属性是添加在”学生“的标签属性列表中,所以下面的xml文档中两个”学生“标签都需要加入该属性。
有的情况下我们并不需要”住址“属性,或者说有的学生的住址我们不清楚,那么我们可不可以不录入任何信息呢,答案是肯定的,只需要为”住址“属性值的类型为#IMPLIED(可以有,也可以没有),语法如:
<!ATTLIST 学生
住址 CDATA #IMPLIED
>
xml也可以像数据库的字段一样可以有唯一性:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE 班级 [<!ELEMENT 班级 (学生+)>
<!ATTLIST 学生
住址 CDATA #IMPLIED
学号 ID #REQUIRED
>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 ANY>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
]>
<班级>
<学生 住址="花果山" 学号='a001'>
<名字>孙悟空</名字>
<年龄>500</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生 学号='a001'>
<名字>林青霞</名字>
<年龄>32</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级>
这里我们新增属性”学号“,其类型为”ID“,声明ID类型后,但由于ID的唯一性,所以该段代码无法通过校验。他们的”学号“都是”a001“违反了唯一性 。
另外我们需要注意的是,ID类型的属性值不能够以数字开头。
既然xml标签可以有唯一性,那么是否可以利用唯一性来关联我们所需要的标签呢?IDREF类型的属性拥有此功能。
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE 班级 [<!ELEMENT 班级 (学生+)>
<!ATTLIST 学生
住址 CDATA #IMPLIED
学号 ID #REQUIRED
大哥 IDREF #REQUIRED
>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 ANY>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
]>
<班级>
<学生 住址="花果山" 学号='a001' 大哥='a002'>
<名字>孙悟空</名字>
<年龄>500</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生 学号='a002' 大哥='a001'>
<名字>林青霞</名字>
<年龄>32</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级>
关联属性名称没有任何限制,但关联属性值必须是已有的值且该值必须是某标签的ID类型属性值。若是我们需要对多个标签进行关联,那么我们可以变更”大哥“属性的类型,语法如:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE 班级 [<!ELEMENT 班级 (学生+)>
<!ATTLIST 学生
住址 CDATA #IMPLIED
学号 ID #REQUIRED
大哥 IDREFS #REQUIRED
>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 ANY>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
]>
<班级>
<学生 住址="花果山" 学号='a001' 大哥='a002'>
<名字>孙悟空</名字>
<年龄>500</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生 学号='a002' 大哥='a001 a002'>
<名字>林青霞</名字>
<年龄>32</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级>
xml的属性类型还有枚举类型,那么什么是枚举类型?如下:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE 班级 [<!ELEMENT 班级 (学生+)>
<!ATTLIST 学生
住址 CDATA #IMPLIED
学号 ID #REQUIRED
大哥 IDREFS #REQUIRED
情感状况 (单身|结婚|离婚) #REQUIRED
>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 ANY>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
]>
<班级>
<学生 住址="花果山" 学号='a001' 大哥='a002' 情感状况='单身'>
<名字>孙悟空</名字>
<年龄>500</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生 学号='a002' 大哥='a001 a002' 情感状况='单身'>
<名字>林青霞</名字>
<年龄>32</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级>
一个人的情感状况无非就是这几种,所谓枚举类型也就是”或“的逻辑类型,只能在指定的几个值中有一个。
xml也可以像php一样拥有常量:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE 班级 [<!ELEMENT 班级 (学生+)>
<!ATTLIST 学生
住址 CDATA #IMPLIED
学号 ID #REQUIRED
大哥 IDREFS #REQUIRED
情感状况 (单身|结婚|离婚) #REQUIRED
国籍 CDATA #FIXED "中国"
>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 ANY>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
]>
<班级>
<学生 住址="花果山" 学号='a001' 大哥='a002' 情感状况='单身' 国籍='中国'>
<名字>孙悟空</名字>
<年龄>500</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生 学号='a002' 大哥='a001 a002' 情感状况='单身'>
<名字>林青霞</名字>
<年龄>32</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级>
”国籍“属性值的类型是”#FIXED“指的是固定值,也就是说国籍这个属性要么没有,若是一定要有,那么其值必须是”中国“。
当一个内容要多处使用时,我们可以为其定义参数实体,而参数实体分为外部实体与内部实体。
内部实体定义与调用:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE 班级 [<!ELEMENT 班级 (学生+)>
<!ENTITY intro "这是一个介绍">
<!ATTLIST 学生
住址 CDATA #IMPLIED
学号 ID #REQUIRED
大哥 IDREFS #REQUIRED
情感状况 (单身|结婚|离婚) #REQUIRED
国籍 CDATA #FIXED "中国"
>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 ANY>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
]>
<班级>
<学生 住址="花果山" 学号='a001' 大哥='a002' 情感状况='单身' 国籍='中国'>
<名字>孙悟空</名字>
<年龄>500</年龄>
<介绍>&intro;学习刻苦</介绍>
</学生>
<学生 学号='a002' 大哥='a001 a002' 情感状况='单身'>
<名字>林青霞</名字>
<年龄>32</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级>
内部实体可以写在dtd文件中,也可以直接连同dtd一起插入在xml文件中。
外部实体声明与调用:
dtd源文件:
<!ELEMENT 班级 (学生+)>
<!ENTITY intro "这是一个介绍">
<!ENTITY % mingzi "名字">
<!ATTLIST 学生
住址 CDATA #IMPLIED
学号 ID #REQUIRED
大哥 IDREFS #REQUIRED
情感状况 (单身|结婚|离婚) #REQUIRED
国籍 CDATA #FIXED "中国"
>
<!ELEMENT 学生 (%mingzi;,年龄,介绍)>
<!ELEMENT %mingzi; ANY>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
关键字词:dtd,属性,个人博客