查看原文
其他

XML文档篇:认识DTD(一)

The following article is from 职业译员玩转翻译技术 Author 可爱的冬梅

新的一周从学习本地化的文档格式开始叭~

隔了好久的源文档解析,现在继续叭~继续跟大家分享XML文档~

今天分享DTD。

再来强调一遍我写源文档解析系列的初衷:

不是为了让大家做一个程序猿(媛),而是想让大家学会判断:

  • “这个源文档的格式到底有没有问题?能不能翻译?”

  • “如果能翻译,怎么翻译!”

OK,正文来了~


前面关于XML文档,我们前面通过两篇文章介绍了XML是什么:

再来复习XML长什么样子:

图1 XML文本截图

在这里,

  • 第一行的<?xml version="1.0" encoding="utf-8"?>是声明语句。

  • 从第二行开始,<sample>就是根元素了,根元素之间还有子元素<document>

  • 元素必须要有完整标签对<document></document>或者独立标记要完整标记:<button/>

  • 元素可能有属性:value就是button的属性;

  • 标签对之间的文本是我要翻译的内容标签属性值也要判断到底要不要翻译;

但是有时候,我们也会收到这样的文件包:文件包里既有xml文档,又有一个dtd文档。

图2 翻译包截图

如果打开其中一个XML文档,是长这样的:

图3 含有DTD的原文截图

咦,细心的同学会发现:似乎和图1的XML不一样哦~

这个文档多了第二行:

<!DOCTYPE PartPage PUBLIC "-//Interleaf//DTD partpage//EN" "partpage.dtd">

——其实,这是DOCTYPE 声明的内容,用来告诉你:“这是这个文档类型是一个PartPage,引用的是外部的partpage.dtd文档”。

咦,细心的同学更会发现:这个第二行的最后"partpage.dtd"不就是文件包中的后缀名为*.dtd的partpage.dtd文档嘛!

是的!如果你打开这份*.dtd文档(其实这就是一个ASCII的文本文件)——也就是包含 DTD 的 "partpage.dtd" 文件,长这样:

图4 DTD声明

这就是含有DTD的XML文档!那,DTD是什么鬼?

01 定义

DTD 是英文Document Type Definition的首字母缩写,中文意思为“文档类型定义”。

通过DTD我们可以验证XML是“合法”,也就是说:验证你的XML文档结构是否拥有正确语法,或者你可以理为是否符合要求

如果你不想知道这是什么,也可以直接往下划,直接看如何翻译含有DTD的XML,找到方法论。

那么问题来了:

  • 正确语法是什么?或者说:要求是什么?

02 DTD构成

首先,在原XML中已经声明了:

<!DOCTYPE PartPage PUBLIC "-//Interleaf//DTD partpage//EN" "partpage.dtd">

你可以理解为自我介绍:“Hi 我引入partpage文档;”

图5 DOCTYPE声明

我们看一下DTD的这个构成:

图6 DTD文档

2.1 元素

在 DTD 中,元素通过ELEMENT来进行声明语法如下:

<!ELEMENT 元素名称 (元素内容)>

所以我们看第2行,说明了:

根元素PartPage元素应该包含哪几个子元素,这里有VendorInfoPartInfoDescriptionService等。

所以你会发现,在图7右侧的正文XML中就是按照这几个元素及关系在定义的

图7 PartPage元素

再比如图8 第7行就定义了:父元素<VendorInfo>应该包含NameContact两个子元素。

图8 VendorInfo元素

那图7和图8 左侧的dtd文档的第二行中,子元素名右上角的星号(*)、加号(+)号等等是什么意思呢?

图9 星号或加号等正则

类似我们前面讲的正则的符号表示,详见:正则篇(一):认识正则表达式

  • 星号(*)表示该元素出现零次或多次

  • 理解了星号,加号就很容易理解了:加号(+)表示该元素至少出现一次,也就是一次或多次。

所以,在上图9中,右侧的XML文件VendorInfoPartInfoDescriptionService元素,但是没有<GeneralProcs>或者<Operation>等元素

但是我们再图10,在右侧的XML中就<GeneralProcs>元素,但是却没有Service元素。

图10 PartPage的子元素

2.2 属性

在 DTD 中,属性通过 ATTLIST 声明来进行声明。语法如下:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

比如这里的第100行:

图11 DTD属性声明

  • Item元素包含了 priority 属性

  • <priority>属性类型是CDATA。关于CDATA,参见:翻译包含HTML样式的XML文档 (CDATA篇)

  • 该元素默认值#IMPLIED,表示priority 属性不是必需的。所以第53行的Item有priority属性,但是像69行、74行、79行就没有priority属性。

更多属性类型和默认值你可以去网络上搜索啦~

2.3 实体

前面我们讲过XML的实体,详见:翻译包含HTML样式的XML文档(实体篇)

在 DTD 中,实体通过 ENTITY 来进行声明:

<!ENTITY 实体名称 "实体的值">,或者<!ENTITY 实体名称 SYSTEM "URI/URL">

因为这个文档中没有,所以我不介绍了,大家需要去网络上自查啦~


如果你已经懂了DTD是什么,特别好~我们下篇继续讲DTD怎么翻译~

当然,emmmm听不懂。没关系,真的没关系,其实定义和构成也不是很重要~

(说实话我也看得不是很懂,写这篇文档之前我也是查各种资料、问我各种搞开发的朋友们~感谢感谢!)

但是我们是搞翻译的嘛!又不是搞编程的!我只要知道文档怎么翻译就好了!

我真的努力讲惹,如果我讲不明白,那我真的尽力了~你可以从网上找找其它关于DTD的资料~

所以,我们下一篇文章讲方法论。

好啦今天内容先到这里,再见啦~

继续滑动看下一个
语言服务行业
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存