当前位置: 首页
前端开发
XML入门教程:实体-XML/XSLT

XML入门教程:实体-XML/XSLT

热心网友 时间:2026-04-27
转载

XML中的实体声明:超越基础的进阶理解

一说起XML的实体,很多人脑子里先蹦出来的可能就是那几个基础的预定义实体,比如 < 代表小于号。这没错,但XML的实体系统远比你想象的更强大、更灵活。今天,我们就来深入聊聊那些在复杂DTD和大型文档中扮演关键角色的实体——不仅仅是文本替换那么简单。

未析实体:当XML遇到非XML数据

我们都知道,并非所有数据都是XML格式的。比如一张JPEG图片,或者一段MPEG视频。XML该如何在文档中“引用”这些内容呢?答案就是“未析实体”。它更像是一个指向外部非XML资源的“快捷方式”。

在DTD中,你可以这样定义一个未析实体:

注意看最后的 NDATA a vi。这里的 a vi 并非随意书写,它必须是一个在 NOTATION 中预先声明过的MIME媒体类型标识符。NDATA的作用就是明确告诉处理器:“嘿,这个实体指向的数据不是XML,它的类型是a vi。”

不过,有一说一,直接在XML文档中嵌入这类未析实体在实践上比较复杂,也不算很规范,所以除非有特殊需求,一般建议尽量避免使用。

参数实体:DTD内部的“宏”与模块化利器

如果说通用实体是给文档内容用的“变量”,那么参数实体就是专门服务于DTD本身的“宏定义”。它在大型、模块化的DTD设计中不可或缺。

它的定义语法和通用实体很像,只是中间多了一个百分号 %

使用时,也需要带上百分号:%person;。处理器会直接用字符串 name,address,postcode 来替换它。这有什么用呢?最直接的,它能避免在DTD中反复输入一长串相同的元素列表,提高可维护性。

但参数实体更强大的地方在于实现DTD的模块化。想象一下,像DocBook这样的庞大DTD,长度可能超过一万行,全部塞在一个文件里简直是维护者的噩梦。聪明的做法是把它按功能拆分成多个文件。

这时,参数实体就派上用场了。你可以在主DTD文件中这样写:


%names;

第一行定义了一个参数实体 %names;,它引用了外部的 names.dtd 文件。第二行通过引用这个参数实体,实际上就把整个外部DTD子集的内容“包含”了进来。这种结构让管理和维护大型DTD变得清晰、可行。

条件化处理:用INCLUDE与IGNORE实现灵活开关

你有没有想过,DTD里的某些声明能不能像代码一样,根据需要“开启”或“关闭”?XML确实提供了这种机制,那就是 INCLUDEIGNORE 节。

IGNORE 块内的声明会被处理器忽略,效果类似注释:


]]>

当然,你也可以用 达到相同目的。INCLUDE 则恰恰相反,它明确表示其内的声明有效:


]]>

单独看,这个 INCLUDE 似乎有点多余,有没有它声明都有效。但妙处在于,当它们和参数实体结合时,就能产生奇妙的化学反应。

我们可以先定义一个参数实体作为“开关”:

然后,在声明处使用这个参数实体,而非直接使用关键字:


]]>

这样一来,元素 note 的声明是否生效,就完全由参数实体 %note_allowed; 的值决定了。只要在DTD别处将 %note_allowed; 重定义为 IGNORE,对应的声明就会瞬间“失效”。这种模式为DTD提供了强大的条件化包含和功能定制能力。

说到底,XML的这些高级实体特性,其核心思想是相同的:抽象与复用。无论是引用一段外部文本、一个非XML资源,还是组织复杂的DTD结构,目的都是让文档和它的模式定义更加清晰、灵活且易于管理。掌握它们,才算真正读懂了XML设计哲学中关于“可扩展”的那一部分。


本文由本站(https://www.jb51.net)整理发布!转载请注明出处,谢谢!

来源:https://www.jb51.net/xml/12435.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Layui弹出层监听子页面键盘快捷键实现方法

Layui弹出层监听子页面键盘快捷键实现方法

子页面键盘事件监听需在DOM加载完成后绑定,父页无法直接监听子页按键,必须由子页自身监听后通过parent或postMessage通知父页。典型写法为子页调用父页已定义的关闭函数。需注意焦点状态、输入法及layui版本兼容性等陷阱。

时间:2026-07-06 07:02
Layui表单提交时携带当前页面Meta信息的实现方法

Layui表单提交时携带当前页面Meta信息的实现方法

Layui表单提交不会自动携带页面Meta信息,需在form on( submit )回调中手动读取meta内容并拼接到表单数据,注意后端字段映射及特殊字符编码,多meta时按需选取。

时间:2026-07-06 07:00
HTML5拖拽事件流状态转移监控调试

HTML5拖拽事件流状态转移监控调试

HTML5拖拽事件流易因漏监听或未调用preventDefault而中断。需掌握dragstart设置数据、dragover接受放置、drop触发条件等关键点。通过统一日志捕获事件上下文、识别常见状态丢失场景并配合可视化面板,可清晰定位拖拽过程断点。

时间:2026-07-06 07:00
uni-app实现小红书商品详情图卡片切换

uni-app实现小红书商品详情图卡片切换

通过手写touch事件与transform控制五张卡片,动态计算translateX、scale、opacity及z-index模拟层叠滑动效果。滑动距离超过80rpx触发切换,否则复位。图片仅渲染当前及前后两张,有效优化加载性能与渲染效率。

时间:2026-07-06 07:00
图像旋转倾斜与扭曲的Canvas像素矩阵变换

图像旋转倾斜与扭曲的Canvas像素矩阵变换

Canvas图像变形本质是操作坐标系,图像被动跟随。旋转需先平移原点至目标中心再旋转后复位;倾斜通过仿射变换矩阵实现;扭曲无原生API,可用分块模拟或转用WebGL。每次变换前保存状态,完成后恢复,避免坐标系偏移。

时间:2026-07-06 07:00
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜