Tech view for DTD

【信息科学与工程学】【制造工程】第三十六篇 机械工程与自动化101 本系统通过多模型集成、知识增强、主动学习和持续优化等关键技术,实现了高效、高质量的自动化文本语料标注。系统采用模块化设计,支持灵活扩展,能够处理不同类型的文本数据,适应多样的标注需求。 阅读详情

Tech view for DTD1

author:tuiye@126.com


符合标准(Well-formed)的站点,第一件事情就是声明符合自己需要的DOCTYPE。DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本。DOCTYPE声明是必不可少的关键组成部分;除非你的XHTML确定了一个正确的DOCTYPE,否则你的标识和CSS都不会生效。

当然存在许多(X)HTML的类型,所有这些类型都以相应的W3C规范来定义,如HTML 4.01 Strict,HTML 4.01 Transitional, XHTML 1.0 Strict等。这些类型的定义就是DTD(Document Type Definition)。

在处理HTML文档时,需要知道(X)HTML用的是那种DTD,因此常在(X)THML的开始就声明一个DTD2,如下图:

以上的声明的DTD类型是一个Browser或其他处理HTML工具的关键信息。这样即加快了Browser等工具“理解”(Understanding)与显示的速度,也避免了不必要的处理出错。

DTD可以看作是一个模板,规定了相应文档中存在的元素、元素具有的属性、在元素内部元素的层次结构以及元素在整个文档中出现的顺序。DOCTYPE声明指出阅读程序应该用什么规则集来解释文档中的标记,Validate相应的文档。在Web文档的情况下,“阅读程序”通常是浏览器或者校验器这样的一个程序,“规则”则是W3C所发布的一个文档类型定义(DTD)中包含的规则。

使用DTD的好处:

  1. 提供资料格式一致性描述

  2. 验证资料的正确性

  3. 资料自动化处理

  4. 促进专业分工

  5. 提供更好的建构功能

用了DTD,使得:

a)使用DTD,我们每个XML文件都可以有自己的格式描述

b)使用DTD,独立的组织间可以用公用的DTD交换数据

c)在你的应用中可以用DTD检验你从外界得到的数据是否有效

DTD的一些说明如下,注意1)关键词大小写有别(Case Sensitive);2)空格有别(Space):

  1. 文体声明(Doc Type Declaration)

<!DOCTYPE root [DTD]>

<!DOCTYPE root SYSTEM URL>

<!DOCTYPE root PUBLIC FPI-identifier URL>

root是XML/HTML等文档的根节点,例如HTML文档的root为html

a) 文体声明必须在文件实体之前

b) 每个只可以出现一个文体声明

c) 所有元素需在DTD中定义

d) DTD可以内部声明,也可外部声明

  1. 注释(COMMENT)

与一般的HTML的注释一样,以 <!-- 符号开始,--> 符号结束。两个符号间的所有语句将被忽略,注释语句不能嵌套。

e.g.

<!-- this is a comment -->

  1. 实体(ENTITY)

实体把一个名称与一组字符串关联起来,当适用实体时,解析器都会使用相对应的字符串替换该实体的名称。实体分为:

    1. 可进行解析的(parsed)实体

      1. 通用(general)实体/一般实体,用于XML文档中

      2. 参数(parameter)实体,XML DTD中

    2. 不可进行解析的(unparsed)实体

每一个未解析实体都有一个相关联的用符号名称标识的符号(Notation)

可解析的实体将被解析器处理,而且绝大多数实体是可解析的;而不可解析的实体将被解析器忽略,他们基本被保留用于某些标签的属性列表,它是标签属性值可替换的字符串。

当然还可以按实体内容的位置可以分,两种:

– 内部实体(Internal Entity):实体内容在实体声明中给出。

– 外部实体(External Entity):实体内容在声明之外,例如另外一个文件。

e.g.

通用实体:

例如版权符号(©)的实体就是 &copy ,还有XML预先定义的5种最普通的通用实体

&amp; &

&apos; ’

&gt; >

&lt; <

&quot; “

  1. 内部通用实体

1)定义:<!ENTITY entity_name "entity_content"> 或

<!ENTITY entity_name 'entity_content'>

内容只能是字符数据。

2)引用:&entity_name;

要注意这里的&和;都是半角字符。

还有,实体的引用不能出现循环,而且不能用在元素和属性的声明中。

  1. 外部通用实体

1) 定义:<!ENTITY entity_name SYSTEM "entity_URI">

<!ENTITY entity_name PUBLIC "PublicIdentifier" "entity_URI">

2) 引用:&entity_name;

3) 注意:引用外部实体的时候,在主文档中,必须把外部实体文档的元素、属性等都加以定义。

参数实体:名称前带有一个百分号(%)

%告知解析器在DTD参数实体中寻找实体名称,然后将实体值插入到DTD中调用实体位置,最后将实体值作为DTD一部分进行处理。

参数实体是DTD的主体,没有它们,创建DTD变的十分困难3。

实体声明如下:

通用实体 :<!ENTITY name value>

参数实体 :<!ENTITY % name value>

name4,value5都有自己的命名与引用的注意点。%前后都是空白的

我们还可以引入公共文档,如下:

%HTMLlat1;

表明所有这些通用实体都被定义作为语言的一部分。

关键词NDATA可以来声明一个不能进行解析的实体。

a) 内部参数实体

1) 定义:<!ENTITY % entity_name "entity_content"> 或

<!ENTITY % entity_name 'entity_content'>

2) 引用:%entity_name;

3) 注意:实体的内容不但可以包括文本,还可以包括标记。参数实体只能用于外部DTD,而不能用于xml文档或者内部的DTD。使用内部参数实体可以提高创建DTD的效率,还可以便于批量修改。

b)外部参数实体

外部参数实体用于将多个DTD文档组合成一个完整的DTD。

1) 定义:<!ENTITY % entity_name SYSTEM "entity_URI">

<!ENTITY % entity_name PUBLIC "PublicIdentifier" "entity_URI">

2) 引用:%entity_name;

3) 注意:每一个外部DTD文档都必须有一个声明,说明使用的字符集。所有的DTD文档都要是一个完整的DTD定义。

实体的优先顺序:

a) 如在同一份DTD中声明了名称相同的ENTITY,则使用第一个ENTITY;

b) 如有内外DTD的声明名称相同的ENTITY,则使用内部声明的ENTITY。

  1. 元素(ELEMENT)

定义如下:

元素声明:<!ELEMENT name Type>

其中Type包括EMPTY、ANY、ELEMENT、MIXED,也可以省略。

EMPTY表示不包含任何数据内容,但是可以有属性。

ANY表示包含任何xml允许的内容。

ElEMENT表示只包含子元素。

MIXED表示允许元素包含子元素和数据内容。


子元素的定义:<!ElEMENT element_name ControlName>

控制方式有如下几种:

( )和, +和* ,?和| 说明在下表

混合型元素:

<!ElEMENT F_Element (#PCDATA|E_Element)*>

<!ElEMENT E_Element (子元素定义)>


元素类型一共有两种,一种是简单类型,只包含文本数据(#PCDATA),另外一种是符合类型,可以包含其它元素和文本数据。

它遵循与实体一样得命名规则。

表1 CONTENT(TYPE)形式

CONTENT

解释

EMPTY

如果一个元素的CONTENT被声明为EMPTY的话,表示该元素不能包含任何子元素和文本

ANY

表示该元素其中可以包含任何本身有效的元素内容,也就是说,它能够包含在DTD其他

位置已经声明过的元素

#PCDATA

被解析的CDATA

(parsed character data))

表明该元素可以包含任何字符数据,但是不能在其中包含任何子元素。假设我们定义

元素美女<!ELEMENT 美女 #PCDATA>则下面的实例是正确的:<美女>人是因为可爱而美丽,但是

美丽一点也就可爱了</美女>而下面的实例就是错误的:<美女>人是因为<B>可爱<B>而美丽,

但是美丽一点也就可爱了<美女>因为在其中包含了子元素<B>。一般如果定义元素的

CONTENT为#PCDATA,最好在其中只加入纯文本字符数据。

包含其他类型的元素

最通常的情况是一个元素本身是有其他元素的集合构成的,比如下面的例子:表示运算符

号这个元素可以选择加法、减法乘法、除法四个元素中的一个作为它的内容


元素语法

DTD 通过元素内容模型(ECM)可以定义以下6 种的元素内容类型:

  1. 简单类型,即只能包含文本字符内容,且没有属性定义。

简单类型表示元素内容只能是文本字符。简单类型的元素类型声明(ETD)采用如下结构:

<!ELEMENT elementName (#PCDATA)>

b) 带有简单内容的复杂类型,即只能包含文本字符内容,但可以有属性定义。

简单内容表示只能包含合法的XML 文本字符。而复杂类型表示该元素还可以有属性。带有简单内容的复杂类型的元素类型声明(ETD)采用的结构与简单类型的一样。但是在该元素上还有属性定义,即还要在DTD 中给该元素声明属性。

c) 带有复杂内容的复杂类型,即可以包含子元素,也可以有属性定义

复杂内容表示元素可以包含其他元素作为子元素。 带有复杂内容的复杂类型的元素类型声明(ETD)采用的结构有两种:

– 逗号方式:

<!ELEMENT elementName (element1,element2,…)>

– 或符号方式:

<!ELEMENT elementName (element1 | element2 | …)>

逗号方式也叫顺序方式,表示包含的子元素在实例XML 文档中必须按照逗号分隔的顺序出现。或符号方式表示只能出现或符号“|”分隔的任一个子元素。

d) 混合内容类型,即既要包含子元素,又要包含文本字符内容,也可以有属性定义。

即有#PCDATA 内容又有子元素的元素内容类型,可以说是具有混合内容。在DTD 中,混合内容类型只能使用或符号“|”,即它的元素类型声明(ETD)只能采用如下结构:

<!ELEMENT elementName (#PCDATA | element1 | element2 | …)*>

  1. 空内容类型,即只可以有属性定义,不能有其他任何内容,包括文本字符及子元素。

空元素,是由空标记定义的元素,它只可能有属性定义而不会任何内容。 空内容类型的元素类型声明采用的结构是:

<!ELEMENT elementName EMPTY>

“EMPTY”关键字表示元素“elementName”不能包含任何内容,包括文本字符及元素,但是它可以有属性,即在DTD 中可以有属性声明。

  1. 任何内容类型,即可以包含任何合法文本字符、子元素及属性定义。

如果元素的内容类型是任何内容,表示该元素可以包含任何子元素和文本内容,而且个数也是任意的,反正一切都是任意。所以对于任何内容类型的元素,除了指定了元素的名称,元素能包含的内容可以说没有做任何定义。对应的元素类型声明采用的结构为:

<!ELEMENT elementName ANY>

表2使用量词(Quantifier)符号

符号

目的

例子

意义

()

括号内包含元素群组或一组可选择的内容

(内容1, 内容2)

元素必须包含一连串的内容,如内容1及

内容2

,

将一连串项目分开

并确定显示顺序

(内容1, 内容2, 内容3)

元素必须依指定的顺序

包含内容1、内容2

及内容3

|

将可选择的项目以群

组分开

(内容1|内容2|内容3)

元素必须包含内容1、

内容2及内容3其中一

项

?

?

表示项目必须出现一

次或完全不出现

内容1?

元素可能包含内容1。

如果内容1真的出现,

它也只能出现一次

*

表示项目可出现任意

次数

内容1*

元素可以包含内容1。如果内容1真的出现,它可以出 现任意次数

+

表示项目必须出现

一次或一次以上

内容1+

元素必须包含内容1。它可以出现一次或任意次数

没有任何符号

表示只有一个项目会

出现

内容1

元素必须包含内容1

e.g.

<!ELEMENT EMAIL (TO+ , FROM , CC* , SUBJECT? , BODY?)>

To元素是必要的,而且至少出现一次 

From元素只能出现一次 

Cc元素是选择性的,但它可以出现一次或一次以上 

Subject元素是选择性的,如果出现在文件内时,只能出现一次 

Body元素是选择性的,如果出现在文件内时,只能出现一次


  1. 元素属性(ATTLIST)

定义

<!ATTLIST elementName attributeName attributeType attributeDefaultValue>

或

<!ATTLIST elementName

attributeName1 attributeType1 attributeDefaultValue1

attributeName2 attributeType2 attributeDefaultValue2

…>

其中:"attributeType"表示属性值的类型,而"attributeDefaultValue"是属性默认值。

在附录4中有ATTLIST的范例

    1. 属性值

表3 属性值列表(Attribute Type List)

类型

具体的含义说明

CDATA

这个类型表明该属性只能包含字符数据,比如"strong","23","美女","恐龙"等等

ID

该属性的取值必须是唯一的,就象我们每个人都有的身份证号码一样。在一个文档

内两个ID属性的值一定不可以一样。


IDREF,IDREFS

这个属性的值实际上就象C++中的指针一样,它是一个指向文档中其他地方声明的

ID值。所以如果具体的文档中该属性的取值和它所指向的ID值不匹配的话,就会

返回错误。IDREFS和IDREF类似,但是可以具有由空格分隔的多个引用。



ENTITY,ENTITIES

ENTITY属性的值必须对应一个在文档内部声明的但还没有分析过的实体。ENTITIES

属性和ENTITY类似,不同的是它可以包含多个实体,每一个实体之间可以用空格

进行分隔。需要注意的是实体包括普通实体、外部实体、参数实体和外部参数实

体。一般来说,你可以把实体理解为类似C++中的一个定义,比如在C++中,我们

定义一个变量: const MYCOMPANYNAME="BigSoft"以后你就可以在程序中

使用变量MYCOMPANYNAME。这里可以把MYCOMPANYNAME当成一个实体来理解。


NMTOKEN,NMTOKENS

NMTOKEN和CDATA非常类似,不同之处在于它是CDATA的一个子集。它所使用的字

符必须是字母、数字、句点[.]、破折号[-]、下划线[_]或冒号[:]。NMTOKENS和NMTOKEN类似,不同之处在于它可以包含多个值,每个值之间用空格进行分隔

NOTATION

NOTATION属性的值必须引用在文档中其他地方声明的某个注解的名称

NOTATION

(enumerated)

该属性的值必须匹配NOTATION名称列表中的某个名称,比如我们已经存在两个NOTATION,一个为beauty,一个为beast。我们可以定义一个属性类型为NOTATION(beauty | beast)


Enumerated

这个几乎和C++中的枚举变量一样,我们事先定义好一些值,该属性的值必须匹配

所列出的这些值。比如现在有值为美丽、泼辣、性感、智慧。该属性的类型就可以

表现为(美丽|泼辣|性感|智慧),实际内容文档必须从这些值中取一个。注意值之

间用"|"进行分隔

xml:

The value is a predefined xml value

String Type: CDATA

Tokenized Type: NMTOKEN, NMTOKENS, ID, IDREF, IDREFS, ENTITY, ENTITIES

Enumerated Type: NOTATION, EMUMERATION

b)必须的和默认的属性

可以选择四种值中的一种放在属性类型的后面

表4 属性类型(Default Value)

值

含义

#REQUIRED

用来告诉XML解析程序,该元素的所有实例都必须有该属性的值。就象数据表中某

一个字段不允许为空一样。

#IMPLIED

表示如果该元素的实例中没有指定该元素的值的话,就忽略该属性。就象在数据表

中某一个字段的值可以为NULL一样。


#FIXED value

表示包含该属性的元素实例必须指定所列出的值,比如一个属性名称为美女:美

女 CDATA #FIXED "我的老婆"表示如果在实例中没有列出这个属性的话,解析器依

然认为存在美女这个属性,它的值就是"我的老婆"。一般的应用是设计这个属性用

来说明这些文档都是由一个DTD来实例化产生的。


Default value

为属性提供一个默认的值。比如一个属性名称为美女:美女 CDATA "我的老婆"如果

在该属性的实例中没有包含这个属性的话,解析器就认为该属性的值就是"我的老婆"

,如果在该属性的实例中包含了这个属性并赋值了的话,就采用这个赋值。


  1. 符号(Notation)

Notation主要是用来表明文档中需要来自外部源的数据,而该数据XML本身是不能进行解析的,比如各种格式的二进制文件(比如图形文件、声音文件等),需要外部的应用程序进行处理。

符号(Notation)可以用来表示非XML 数据的格式。例如,我们可以声明符号来表示那些嵌入到<picture> 元素中的二进制图像数据是JPEG 格式还是GIF 格式等。符号可以描述嵌入到XML 实例中的数据,或者在外部文件中、通过未解析实体链接到实例中的数据,即符号还可以描述未解析实体的格式。也就是说其含义为不需要解析的外部内容(例如:二进制数据)的格式声明,以及用于处理这些内容的外部应用程序。

符号的声明有3 种方式:

– 方式1:

<!NOTATION notationName SYSTEM "URIreference">

– 方式2:

<!NOTATION notationName PUBLIC "PublicIdentifier" "URIreference">

– 方式3:

<!NOTATION notationName PUBLIC "PublicIdentifier">

其中“notationName”是符号的名称,它必须是NCName(No Colon Name,即没有冒号的名称)。

“URIreference”可以是任何值,因为它的用处最终由XML 处理程序来决定。

符号与XML数据

符号可以指定XML 文档内的二进制数据的格式。

– 首先要声明一个符号来表示该格式。

– 然后在XML 元素上声明一个NOTATION 类型的属性。

– 最后通过该属性就能指出元素的二进制内容是什么格式。

符号与未解析实体

符号不仅能表示XML 数据的格式,也可以用来表示未解析的通用实体的格式

– 首先声明相应的符号来表示相应的数据格式。

– 然后声明相应的未解析的一般实体。

– 最后在相应的XML 元素上声明一个ENTITY 或ENTITIES 类型的属性。

  • 通过该属性能得到该实体的内容,并在实体声明时指定了实体的数据格式

Notation主要是用来表明文档中需要来自外部源的数据,而该数据XML本身是不能进行解析的,比如各种格式的二进制文件(比如图形文件、声音文件等),需要外部的应用程序进行处理。

  Notation声明的语法格式如下:

  <!NOTATION NAME ExternalID>

  需要注意的是NAME必须由字母、数字、句点、破折号或冒号组成,并且第一个字符必须为字母或者是下划线。下面的例子表示GIF图象作为不解析的外部内容。

  <!NOTATION gif system "iexplore.exe">

  <!ENTITY logo SYSTEM "http://somewebsite/somecategory/something.gif" NDATA gif>

  <!-- 这里NDATA表示XML不解析该数据 -->

  <!ELEMENT PIC EMPTY>

  <!ATTLIST PIC

   loc ENTITY #REQUIRED

  >

  然后,在具体的实例化文档中包含下面一行代码:

  <PIC loc="&logo;" />

  根据DTD定义,loc属性值是一个不解析的实体。解析器可以根据DTD定义知道这一点,然后它就不对其进行解析,也不会象解析实体一样把它包括到XML文档里面。同时,XML解析器将通知iexplore.exe该引用的存在。


  1. DTD与命名空间

    1. DTD不像XML Schema 那样能直接支持命名空间。

    2. 因为命名空间的声明在XML 实例文档中可以认为是元素的特殊属性,所以使用DTD 来定义带命名空间的XML 词汇可以通过:

– 在XML 文档中的命名空间声明必须要在DTD 中进行相应的属性声明。

– 所有在DTD 中需要出现元素和属性名称的地方必须是合法名称(QName),除非它不属于任何命名空间。

– 在XML 的DOCTYPE 声明中,根元素的名称也必须是合法名称。

  1. 条件段(Conditional Section)

<![INCLUDE [

…any content…

]]>

或

<![IGNORE [

…any content…

]]>6

或者这么定义

<!ENTITY % English "INCLUDE">

<!ENTITY % Metric "IGNORE">

然后

<! [%English [

…English stuff here…

]]>

或

<! [%Metric [

…Metric stuff here…

]]>

INCLUDE:表示包含此实体

IGNORE:表示不包含此实体

  1. 连接(引用)

    1. 内部连接

内部DTD 就是把DTD 定义信息跟XML 文档本身放在同一个文档里。

内部DTD 的语法格式是:

<!DOCTYPE rootElement [

declarations

]>

    1. 外部连接

外部DTD 就是DTD 定义放在了另外一个独立的文件里,而且这个文件的扩展名一般为.dtd。当一个DTD 在一个外部文件里后,我们一样可以通过XML 文档的DOCTYPE 声明来把该DTD 文件链接进来,有两种链接方式:

– 系统链接方式:

使用系统链接方式需要在DOCTYPE声明中加入SYSTEM 属性:

<!DOCTYPE rootElement SYSTEM "URIreference">

SYSTEM关键字只用于个人或组织内部的DTD文件分享。如果要引用公认的DTD,就应该使用PUBLIC关键字来引用DTD。

使用系统链接需指定要引用的DTD 文件的URI,即如果该DTD 文件不在本地机器上,需要指定完整的地址信息,包括主机名等。

– 公共链接方式:

当使用PUBLIC 关键字进行链接时,需要一个公共标识名,即:

<!DOCTYPE rootElement PUBLIC "PublicIdentifier" "URIreference">

其中“PublicIdentifier”为公共标识名(有命名规定,见附录3)

使用外部DTD 可以使它方便高效地被多个XML文档所共享。

  1. 即外部又内部

如果DOCTYPE 声明想即包括内部子集,又要引用外部文件或外部子集,它可以使用以下语法:

<!DOCTYPE rootElement SYSTEM "URIreference"[

declarations

]>

或者

<!DOCTYPE rootElement PUBLIC "PublicIdentifier" "URIreference"[

declarations

]>

  1. 附录

附录 一

下面是一个完整的DTD例子。我把另一个菜谱加入文件内,并为DTD做了注释。可以注意到我在第二个菜谱中用到子条目。

<?xml version="1.0" encoding="GB2312"?>

<!DOCTYPE cust:客户名单SYSTEM "customer.dtd"> <!—文体声明 -->

<cust:客户名单xmlns:cust="http://www.sinovo.cn/dtd/customer.dtd">

<!-- 客户甲-->

<cust:客户cust:custId="CUST_1">

<cust:名称>IBM</cust:名称>

<cust:地址>北京</cust:地址>

<cust:电话>65391187</cust:电话>

<cust:fax>65391189</cust:fax>

<emp:联系人xmlns:emp="http://www.sinovo.cn/dtd/employee.dtd">

<emp:姓名>张三</emp:姓名>

<emp:电话>

<emp:固定电话emp:type="Office">12345678</emp:固定电话>

<emp:固定电话emp:type="Home">87654321</emp:固定电话>

<emp:移动电话>13901234567</emp:移动电话>

</emp:电话>

<emp:email>zhangsan@sample.com</emp:email>

</emp:联系人>

</cust:客户>

</cust:客户名单>


<?xml version="1.0" encoding="GB2312"?>

<!ELEMENT cust:客户名单(cust:客户+)>

<!– 定义命名空间属性xmlns:cust -->

<!ATTLIST cust:客户名单xmlns:cust CDATA #IMPLIED>

<!ELEMENT cust:客户(cust:名称,cust:地址,cust:电话,cust:fax,emp:联系人)>

<!ATTLIST cust:客户cust:custId ID #REQUIRED>

<!ELEMENT cust:名称(#PCDATA)>

<!ELEMENT cust:地址(#PCDATA)>

<!ELEMENT cust:电话(#PCDATA)>

<!ELEMENT cust:fax (#PCDATA)>

<!ENTITY % contractInfo SYSTEM "contact.dtd">

%contractInfo;


<?xml version="1.0" encoding="GB2312"?>

<!ELEMENT emp:联系人(emp:姓名,emp:电话,emp:email)>

<!– 定义命名空间属性xmlns:emp -->

<!ATTLIST emp:联系人xmlns:emp CDATA #IMPLIED>

<!ELEMENT emp:姓名(#PCDATA)>

<!ELEMENT emp:电话(emp:固定电话*,emp:移动电话)>

<!ELEMENT emp:固定电话(#PCDATA)>

<!ATTLIST emp:固定电话emp:type CDATA #REQUIRED>

<!ELEMENT emp:移动电话(#PCDATA)>

<!ELEMENT emp:email (#PCDATA)>

然有DTD,文档将被检查看是否符合DTD做出的限制。换句话说,我们要保证文档的有效性。为了达到这个目的,我们需要另一个工具:有效性分析器(Validator)。

附录 二

常用DTD List:

HTML 4.01 - Strict, Transitional, Frameset:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"

"http://www.w3.org/TR/html4/strict.dtd">

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"

"http://www.w3.org/TR/html4/frameset.dtd">

XHTML 1.0 - Strict, Transitional, Frameset:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

XHTML 1.1 - DTD:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"

"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

HTML 2.0 - DTD:

<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">HTML 3.2 - DTD:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

MathML 1.01 - DTD:

<!DOCTYPE math SYSTEM

"http://www.w3.org/Math/DTD/mathml1/mathml.dtd">

MathML 2.0 - DTD:

<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN"

"http://www.w3.org/TR/MathML2/dtd/mathml2.dtd">

XHTML + MathML + SVG - DTD:

<!DOCTYPE html PUBLIC

"-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"

"http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">

SVG 1.0 - DTD:

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"

"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">

SVG 1.1 Full - DTD:

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"

"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

SVG 1.1 Basic - DTD:

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN"

"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd">

SVG 1.1 Tiny - DTD:

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN"

"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">

XHTML + MathML + SVG Profile (XHTML as the host language) - DTD:

<!DOCTYPE html PUBLIC

"-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"

"http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">

XHTML + MathML + SVG Profile (Using SVG as the host) - DTD:

<!DOCTYPE svg:svg PUBLIC

"-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"

"http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">

附录 3

公共标识的命名规则

1) 公共标识的命名规则和XML 文件的命名规则稍有不同,具体说,公共标识名只能包含字母(非DBCS字符) 、数字、空格及下面的字符:

_ % $ # @ ( ) + : = / ! * ; ?

2)还有,公共标识名还必须符合一些标准的规定:

– ISO 组织制定的DTD 以“ISO”三个字母开头,被改进的非ISO 标准的DTD 以加号“+”开头,未被改进的非ISO 标准的DTD 以减号“-”开头。

– 无论是哪一种情况,开始部分后面都紧跟着两个斜扛“//”,然后是DTD 所有者的名称。

– 名称之后又是两个斜扛“//”,然后是该DTD 的描述信息。

– 最后,又是两个斜扛“//”,然后是语言种类。

附录 4

举一个例子用来说明属性类型IDREF/IDREFS的使用,见下面的DTD范例:

  <!ELEMENT FAMILY (PERSON+)>

  <!ELEMENT PERSON EMPTY>

  <ATTLIST PERSON

   relID ID #REQUIRED

   parentID IDREFS #IMPLIED

   name CDATA #REQUIRED

  >

  注意到这里的parentID的类型为IDREFS,这个表明该属性的值必须在文档中出现过。如果该属性的值没在文档中出现过的话,该文档就属于不规范文档,解析器就不会认为该文档是有效的。

  比如下面的文档就是一个不正确的文档。

  <FAMILY>

  <PERSON relID="P_1" name="Joe">

  <PERSON relID="P_2" name="NiEr">

  <PERSON relID="P_3" name="MoZi">

  < PERSON relID="P_4" parentID="P_1 P_5" name="Violet">

  </FAMILY>

  原因是parentID中出现了值"P_5",而这个值在没有在文档中出现过。

  举一个例子用来说明属性类型NMTOKENS的使用,见下面的DTD(ex02.dtd)范例:

  <!ELEMENT PERSON (NAME,FAVOURITY)>

  <!ELEMENT NAME (#PCDATA)>

  <!ATTLIST NAME

    USERID NMTOKENS #REQUIRED

  >

  <!ELEMENT FAVOURITY (#PCDATA)>

  <!ATTLIST FAVOURITY

   FAVOURDESC NMTOKENS #REQUIRED

  >

  下面的文档就是一个不正确的文档:

  <?xml version="1.0" encoding="GB2312" standalone="no" ?>

  <!DOCTYPE PERSON SYSTEM "ex02.dtd">

  <PERSON>

  <NAME USERID="JOBS22@#$_tt" />

  <FAVOURITY FAVOURDESC="FOOTBALL" />

  </PERSON>

因为在USERID这个属性值中包含了NMTOKENS所不允许的字符"@#$"。

附录5 glossary

DOCTYPE declaration

<!DOCTYPE …>

DTD Components

Elements declaration

<!ELEMENT…>

Attributes declaration

<!ATTLIST…>

Entities declaration

<!ENTITY…>

NOTATION declaration

<!NOTATION…>

Comments

<!-- whatever is legal -->


<?xml version="1.0" standalone="no"?>

standalone="no" 因該份XML文件已引用外部DTD,所以不再是獨立存在

1 DTD : Document Type Definition

22存在很多类型的DTD,在后文附有常用的DTD List

3 类似与C中的#define宏机制,但是更加简单,仅仅为字符串的替换

4 以字母、冒号或下划线开始,不能以字符串 “XML”开始

5 实体值是引号中的一个字符串或是对其他包含实体的值的文档的调用,对于外部的实体值,URL的关键字 SYSTEM或PUBLIC

6 此方法见的比较少


 

1

 
【信息科学与工程学】【制造工程】计算机科学与自动化——服务器制造中的学科知识01 由可数可加性:μ(A)=∑k=1∞​μ(Bk​)=limn→∞​∑k=1n​μ(Bk​)=limn→∞​μ(⋃k=1n​Bk​)=limn→∞​μ(An​)。:若limsupAn​=liminfAn​=A,则A中的元素恰是那些“最终总是属于An​”的元素,也是那些“属于无穷多个An​但不属于无穷多个Anc​”的元素。:通过构造一个不相交的序列{Bn​},其中B1​=A1​, Bn​=An​∖(⋃k=1n−1​Ak​)。则⋃n​Bn​=⋃n​An​,且Bn​⊂An​。我们称A为一个“集类”或“集合族”。 阅读详情

相关推荐

RTX 6000 Pro Blackwell 踩坑实录:Qwen3.8-NVFP4 生成 HTML 表格半路截断?元凶竟不是显存

本文复盘了在RTX 6000 Pro Blackwell 96GB显卡上部署Qwen3.8-27B-NVFP4模型时,生成HTML表格中途截断的问题。经排查,主因非显存或上下文限制,而是五类易被忽视因素:1)Dify最大回复长度过小导致token截断;2)NVFP4量化精度不足致结构化输出断裂;3)接口超时、停止词误触发与流式渲染异常;4)HTML标签未闭合引发前端渲染假象;5)极低概率的上下文超限。建议27B级模型优先采用FP8权重,兼顾精度与性能,避免为省显存牺牲生成质量。

2501_93651177的博客 51

工作中使用到的单词(软件开发)_第三版

====

sun0322 1万+

Delta-Sigma调制(DSM)技术

前言 数字信号处理和通信系统的性能很大程度上受到了模拟信号到数字信号转换接口——ADC的精度和分辨率的限制。而传统的线性脉冲编码调制(PCM)ADC受到了制造工艺的限制,无法达到很高的分辨率。但基于Delta-Sigma调制技术的ADC可以在现有工艺下实现高分辨率(大于16位),同时由于结构简单,所以易于实现。低成本高性能使得Delta-Sigma调制技术得到了广泛的应用。 Delta-Sigma型ADC的结构原理图如下图所示: 它最大的优势在于仅用1位ADC进行数据转换,同时其模拟电路部分结构简单不需要

阿星的博客 2万+

EPUB 电子书翻译的第一关:解析与重建的工程要点

EPUB虽看似“HTML打包”,实则结构复杂,处理需谨守工程规范。其三层结构(容器、元数据、内容)决定解析逻辑:须按spine顺序遍历,以heading切分逻辑章节,避免按文件名误判;保留内嵌资源引用,只修改文本节点,禁用破坏性清洗;重建时校验mimetype位置、spine顺序、资源可达性,并多阅读器验证。翻译场景中,文本抽取须按段落级逻辑块保留索引,确保双语回填精准。核心原则:结构是契约,文本是变量——尊重契约,方能稳定流水线。

wjlucky262的专栏 174

固定时间收敛的控制器设计(基础知识)

针对控制系统的有限时间收敛和固定时间收敛给出一些常用定理。

qq_40241332的博客 1万+

C# CAD2016 多边形顶点按方向重新排序

这样,通过以上步骤,我们找到了一个多边形的一个候选起始顶点(可能位于西北方向),并且已经获取了该多边形的边界框信息,这些信息对于后续判断顶点排列顺序及处理其他相关问题具有重要意义。完整地处理八个方向(东北、东南、西南、西北、北、南、东、西),我们可以创建一个方法来获取多边形相对于给定点的最近顶点及其对应的方向。对象(或类似的多边形表示方式),其中包含了多边形的顶点。//附送AI 图片无版权 随意用 龙年大吉大利。

转眼之间 一路有你 1355

Spring 框架AOP与 XML 基础

本文涵盖AOP配置文件方式与注解方式、JDBC模板技术、模拟转账开发、XML语法与约束、DOM4J与XPath等内容,并附核心易错点速查表。

既然你都点开这里了,那可以给我点个关注吗?可以吗?可以吗? 273

单片机按键识别篇---单击---双击----长按

  最近做一任务需要使用一个按键实现三种功能,分别是按键单击功能,按键双击功能和按键长按功能,可能之前没有接触过这类按键复用情况,顶多也只是简单识别单击和长按,没有想过双击以上按键功能,也是绞尽脑汁,想了半天,又上网看了些例程,算是对于按键的识别有点小小的了解,感觉这个功能挺实用,在此做个随笔。 一、思路   1.识别长按操作思路:我们使用系统定时器定时,然后让系统每过一段时间去扫描按键I/O...

weixin_30311605的博客 3660

JS XML验证及格式化处理

该代码提供XML验证、格式化及转换功能:isValidXML通过jQuery解析判断字符串是否为合法XML;formatXML对XML进行缩进美化,支持标签、文本、CDATA和注释;xmlToString将XML文档对象转为字符串;escapeHtml用于HTML转义。整体实现简洁,适用于前端XML处理场景。

程序就是世界 155

PMSM单电阻采样避坑指南:如何解决非观测区电流重构难题(附ST专利分析)

本文深入解析了PMSM单电阻采样技术中的非观测区电流重构难题,并详细介绍了ST专利方案及移相法的工程实践。通过优化PWM调制策略和系统级调试方法,有效解决了相电流检测精度问题,为电机控制领域的工程师提供了实用的技术指南。

weixin_33737774的博客 631

使用lxml操作 Word 的 OpenXML 底层

本文综合介绍了使用lxml操作Word底层OpenXML文档的基础知识,并给出了一个效率远超VBA的提取Word文档中的表格的HTML表结构的实例,演示了用lxml获取及修改部分Word文档组成部件的文本、属性的方法。

yivifu的专栏 397

Oracle EBS R12.2.X JSP部署、编译和配置相关操作。

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 背景 在某项目上,需要开发JSP相关程序,比如单点登陆、打印二维条码。当前把JSP部署编译以后,访问提示错误:Requested resource or page is not allowed in this site, 通过查SR发现Oracle EBS R12.2.X版本对客制化JSP进行权限控限,需要设置某些配置文件。 实例操作步骤 上传JSP文件 通常上传到$OA_HTML目录或其子目

陈显平的专栏-Oracle EBS 1910

Java工具篇之Maven:从pom.xml到测试通过的JAR

用一个可运行Java项目讲清Maven的POM、坐标、依赖、生命周期与插件。通过三条单元测试、故意失败和恢复构建,验证测试怎样守住打包入口,并给出依赖树、有效POM及构建排错方法。

code2cat的博客 443

13、核心网络模块:VyOS 设备配置实战

本文详细介绍了如何使用 Ansible 核心网络模块对 VyOS 虚拟设备进行自动化配置,涵盖环境搭建、变量设置、任务编写、playbook 运行及配置验证全过程。通过实际案例展示了 Ansible 在网络设备管理中的强大功能,包括多设备支持、模板化配置、备份回滚等优势,并提供了最佳实践建议与未来发展趋势分析,帮助读者提升网络运维效率。

linux6sysadmin的博客 114

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

1,270 Star 的 Rust 笔记应用 Quiet.md:百万字敲键 5ms、零 Electron、存储格式选了飞书 DocxXML

开源笔记应用 Quiet.md(1,270 Star)用 Rust + GPUI(Zed 同款框架)纯 GPU 绘制,无 WebView 无 Electron:百万字文档敲键 P95 仅 5.78ms,安装包 18MB;存储格式选飞书 DocxXML,一篇笔记一个 XML 文件,Git/iCloud 同步友好,默认零联网。本文拆解其性能方法论、存储设计与给桌面应用开发者的选型启示。

话梅糖の优快云 Blog 302

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

pandas 读取 XLSX 时出现 XML 解析错误

记录 pandas 读取 XLSX 时的 XML 解析错误,说明如何保留原文件、核对工作表及报错位置,并在副本上检查修复影响。

ailx10 170

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

WordPress 站点地图 sitemap.xml 404 或空白:先核 SEO 插件与固定链接,再查 CDN 与防火墙

WordPress 前台正常,但打开(或 SEO 插件给出的站点地图地址)却——这和昨日写过的 Cloudflare Flexible SSL /、以及近期的 Heartbeat / autoload、Woo 结账空白、memory exhausted、固定链接「全站伪静态 404」、WP-Cron、Redis、REST 401、媒体上传失败。这里首页、文章页往往都能打开,卡在:SEO 插件未真正启用或互斥、物理挡路、固定链接 rewrite 未刷新、CDN/WAF 对.xml拦截,或robots.txt。

20年技术经验|专注小程序+外贸独立站|已服务500家企业,分享创业中有趣的产品和技术经验。 307

GPT Image 2 出的 UI 图如何转成 HTML 和可编辑 Figma

AI 生成的 UI 图,本身只是起点。用 Codex 或 Claude Code 把它变成 HTML,就有了能演示的页面;用 html.to.design 把 HTML 导回 Figma,就有了能沉淀的设计源文件;用 Codia 直接把图转成 Figma,则适合只要设计稿、追求速度的场景。三条链路互相补充,组合起来就形成了"图、代码、设计稿"之间的闭环。同时也要清楚它的边界:单张位图缺少精确数值,像素级还原目前还做不到稳定;图里的文字和图标需要人工把关。

JEECG官方博客 204

开源项目推荐:2027 高考志愿填报指北|开源单页 HTML 高报资料工具书

高考志愿填报信息量大、维度多,考生与家长往往面临资料零散、信息不对称、优质内容收费门槛高等问题。《2027 高考志愿填报指北》是雪人老师开源的高报笔记资料汇编,将 683 篇、280.5 万字的原创笔记整合为单页 HTML 电子书,覆盖专业、院校、城市、填报攻略四大板块。支持左侧折叠导航、快速跳转、浏览器原生 A4 打印,可在线阅读也可本地保存使用,采用 CC BY-NC 4.0 协议开源,非商业场景可自由传播改编,是高考志愿填报阶段实用的免费参考工具书。关键词:高考志愿填报;高报资料;开源电子书;

Admans的专栏 276

保姆级 | CTF Lemon:禁用右键/F12 怎么破?查看源码 + HTML 注释拿 flag

这道题表面上“右键被禁用、F12 被禁用”,看起来没法看源码,但这些限制都只是网页里的 JavaScript 搞的鬼。本文会讲清楚它是怎么禁用的、为什么这种限制不可靠,以及如何一键绕过拿到 flag。本题完整链路:页面用 JS 拦截右键/F12 → 用Ctrl+U或 curl 绕过 → 在 HTML 末尾注释里找到 flag。禁用右键(contextmenu)和 F12(keydown)都是前端 JS,靠实现;前端限制运行在用户浏览器,可被绕过,不可作为安全手段;绕过首选Ctrl+U。

YY888888_的博客 360

Web端3D模型加载实战指南_Vue3_uni-app_HTML

很多同学一上来就问"uni-app 怎么加载 3D 模型",结果折腾三天发现方案根本不适用于自己的端。动手前先把下面这张表看完。结论:Web 端一律优先用 。 它是 Khronos 官方标准,被 three.js、model-viewer、微信小程序 XR-Frame 等所有主流方案原生支持,且是单文件,不涉及跨域、相对路径、资源丢失这些烦心事。免费模型资源站:Sketchfab、Poly Haven、Khronos glTF-Sample-Assets(官方示例模型,测试首选)。上线前必做的瘦身动作(一个

qq_19716091的博客 225

纯静态HTML项目文件打包成war包

纯静态HTML项目文件打包成war包

bjzhang75的博客 199

热榜上手|HyperFrames:写HTML出MP4

HeyGen 开源的 TypeScript 视频框架:把 HTML、CSS 动画直接渲染成确定性 MP4,专为 AI agent 批量出片设计,单周涨 5633 star。

mihuyang的博客 247

前端三剑客与 HTML 核心标签

前端是项目的门面。这篇文章把 HTML 的骨架作用、常用标签的专属属性、iframe 嵌套、锚点定位、表格与表单逐项拆开,最后落到「一个标签的属性能干什么」这个最实际的问题上。

2401_89953644的博客 237

用VBA调用Python脚本抽取Word文档表格HTML

本文通过使用VBA调用Python脚本抽取Word文档中的表格的等价HTML表结构代码,演示了VBA调用Python脚本以及获取Python节本输出的方法。

yivifu的专栏 171
上一篇: 浅谈嘉兴区域经济
下一篇: 消递归(recursion)的一种方式
Findback
博客等级 码龄20年 35粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值