XML 中的常见问题--续2
<b>什么是 XSLT? </b><P> XSLT(英文) ,或者用于转换的可扩展样式表语言,它是在 1999 年 11 月 6 日获得批准的 W3C 建议。从标记和编程两重意义上说,这种语言提供了将 XML 结构转换到其他 XML 结构、HTML 或者任何数量的其他文本格式(例如 SQL)的机制。虽然它可以用于创建 Web 页面的显示输出,但是 XSLT 的实际功能在于能够改变底层结构,而不是简单地改变这些结构的媒体表示,就像在层叠样式表 (CSS) 中一样。</P>
<P> <b>XSL、XQL、XSL 模式 和 XSLT 之间的区别是什么? </b></P>
<P> XSLT 源自 CSS 在对 XML 文档结构改动上的局限性,当时创建 XML 的原因更倾向于代替 HTML 而不是提供通用数据描述语言。因此可扩展样式表语言 (XSL) 成为构造格式化 XML 新方法的成果。</P>
<P> 但是,“W3C 样式工作”组的成员和早期 XML 采用者很快就发现,能够将 XML 从一种格式转换到另一个格式的语言,可以极大地简化生成的大量代码。Microsoft 向 W3C 提交了一个建议,最初名称为 XML 查询语言(或 XQL),它随之被 W3C 采纳为 XSL 模式语言。该语言的大多数功能最终都被纳入了 XSLT 规范中。 </P>
<P> 最终标准结合了为不同初始条件而修改的 XSLT 参数,创建代码功能块的命名模板,以及大量用于数值和字符串处理的增强功能。XSLT 还为在语言中添加内置功能提供方便,提供了 Microsoft 可在自己的实现中用来添加许多极其有用功能(包括访问 COM 对象和脚本)的产品。</P>
<P> <b>什么是 XPath? </b></P>
<P> XPath(英文) 是为 XML 定义的查询语言,它提供在文档中选择节点子集的简单语法。通过 XPath,通过指定类似于目录的路径(即名称)以及路径中的条件,可以检索元素集合。XPath 对 XSLT 和 XML DOM 都很重要,并与 XPointer 规范(允许根据统一资源定位符 [URL] 和 XPath 表达式的组合来选择文档片断)有联系。</P>
<P> <b>为什么 XSLT 对 XML 很重要? </b></P>
<P> XSLT 是将一种 XML 文档转换为另一种的语言。这意味着它提供了单源 XML 数据的机制,可以在 Web 页面中创建由用户动态更改的丰富视图,可以为目标通信过滤数据。XSLT 对于业务规则编码已经足够强大。它可以从数据生成图形(不仅仅是 Web 页面)。它甚至可以处理与其他服务器的通信 — 特别是和能够集成到 XSLT 中的脚本模块协作 — 以及在 XSLT 自身内部生成适当的消息。虽然它不可能代替桌面系统中的大多数交互(出于性能和使用方便性两方面分原因),但是在未来的几年中,XSLT 很有可能最终成为系统之间进行通信的主要“编程”语言。</P>
<P> <b>XSLT 和 CSS 之间的区别是什么?它们不是样式表吗? </b></P>
<P> 层叠样式表 (CSS) 的任务是对 HTML 元素指定一组显示属性。CSS 决定了页面的视觉外观,但是不会改变源文档的结构。</P>
<P> 另一方面,XSLT 也称为基于模板的语言,它允许将某种模式映射到源文档中,该源文档的输出是用 XML、HTML 或纯文本书写的。使用 XSLT,可以将 XML 文档的结构转换为不同的 XML 文档。例如,您可以更改 XML 文档的顺序、添加或删除元素、执行条件测试或者用元素的集合进行迭代。</P>
<P> XSLT 和 CSS 不是兼容标准。一种在 XML 中创建 Web 页面的有用技术,是用 XSLT 将 XML 转换为诸如列表或表的结构,然后将 CSS 应用于结果,控制这些结构在适当媒体中的显示。您甚至可以从 XSLT 创建 CSS。</P>
<P> <b>标准 </b></P>
<P> <b>Microsoft 如何与 XML 标准兼容? </b></P>
<P> 从 XML 语言开始产生起,Microsoft 就站在了 XML 的最前沿,而且很值得注意的是,W3C 在过去几年中所生成的大多数 XML 建议和工作草案,都包括来自至少一个(在某些情况下可能是数个)Microsoft 职员的输入和参与。Microsoft 已经多次被委以重任,与 W3C 标准组织一起,确保 XML 的开发能使所有用户受益,并且在许多不同领域的开发中都作出了重要贡献,包括 XML 规范、DOM、XSLT 和架构定义语言。Microsoft 承诺将与最新规范和标准保持一致。</P>
<b>如何加载有外国和特殊字符的文档? </b></P><P> 文档可以包含外国字符,例如: </P><DIV class=quote>foreign characters (úóí?) </DIV><P> 例如 ?磲 的外国字符必须在前面加上 escape 序列。外国字符可以是 UTF-8 编码或用不同编码指定,如下所示:</P><DIV class=quote> foreign characters (?磲) </DIV><P> 现在可以正确加载 XML 了。</P><P> 其他字符是保留在 XML 中的,并且需要以不同的方式处理。下面的 XML: </P><DIV class=quote>This & that</DIV><P> 产生如下错误:
此处不允许有空格。
行 0000001: This & that
位置 0000012: ----------^ </P><P> 此处 & 是 XML 句法结构的一部分,如果它仅仅放在 XML 数据源内部,那么不能解释为 &。您需要替换称为“实体”的特殊字符序列。</P><DIV class=quote> This & that</DIV><P> 下面的字符需要相应的实体:</P><DIV class=quote> < <
& &
> >
" "
' &apos; </DIV><P> 引号字符被用作标记中属性值的定界符,因此通常不能在属性值的内部使用。例如,下面的内容将返回错误:</P><P> 此处的单引号既用作属性定界符,又在属性值自身中。为了纠正这个问题,可以将属性定界符换成双引号:</P><P> 或者可以将单引号转义为实体 &apos; </P><P> 上述两种方式都将通过 XML 对象模型中的 getAttribute 方法返回属性值 John's Stuff。同样,对于双引号,您可以使用实体 "。</P><P> 也可以通过将文本放在 CDATA 节中来处理元素内容中的特殊字符。下面的内容是正确的:</P><P> 在本例子中,XML 对象模型将 CDATA 节点显示 xml 节点的子节点,它将返回字符串</P><P> This & that is just "text" content.
作为 nodeValue。</P><P> <b>如何在 Visual Studio 6.0 C++ 中使用 MSXML COM 组件? </b></P><P> 在 Visual C++ 6.0 中使用 MSXML COM 组件的最简便方式是使用 #import 指令:</P><DIV class=quote> #import "msxml.dll" named_guids no_namespace#import "msxml.dll" named_guids no_namespace</DIV><P> 它定义了所有 IXML* 接口和接口 ID,从而可以在应用程序中使用它们了。也可以从 INETSDK 获取 MSXML 类型库和头文件(英文),以及包含类 IIDs 的 uuid.lib。 </P><P> <b>如何在 XML 中使用 HTML 实体? </b></P><P> 下面的 XML 包含 HTML 实体:</P><P> Copyright ? 2000, Microsoft Inc, All rights reserved. </P><P> 它产生下列错误:</P><P> 引用未定义的实体 'copy'。
行: 1, 位置:23, 错误码:0xC00CE002
Copyright ? 2000, ...
----------------------^ </P><P align=right>作者:AngelGavin
来源:csdn.net</P><P align=center> </P> 这是因为 XML 只有五个内置实体。关于内置实体的详细信息,请参阅如何加载有外国和特殊字符的文档?。<P> 要使用 HTML 实体,需要用 DTD 定义它们。有关 DTD 的详细信息,请参阅 W3C XML 建议(英文)。要使用该 DTD,请将它直接包括在 DOCTYPE 标记中,如下所示:</P><P> Copyright ? 2000, Microsoft Inc, All rights reserved. </P><P> 要加载它,需要关闭 IXMLDOMDocument 接口的 validateOnParse 属性。请尝试将它粘贴到“Validator 测试页”中,关闭 DTD 验证,然后单击“验证”。请注意文档将加载,并且版权字符将显示在 validator 页面的末尾的 DOM 树中。</P><P> 如果已经完成了 DTD 验证,那么必须将作为参数实体的 HTML 实体包括在现有的 DTD 中,如下所示:</P><DIV class=quote> %HTMLENT;
%HTMLENT; </DIV><P> 它将定义所有 HTML 实体,以便在 XML 文档中使用它们。 </P><P> <b>在元素内容中如何处理空白字符? </b></P><P> XML DOM 有三种访问元素文本内容的方式:</P><P> 属性 行为 </P><P> nodeValue 按照原始的 XML 源中指定的那样,返回 TEXT、CDATA、COMMENT 和 PI 节点上的原始文本内容(包括空白字符)。对于 ELEMENT 节点和 DOCUMENT 本身,则返回空值。 </P><P> 数据 与 nodeValue 相同 </P><P> 文本 重复连接指定子树中的多个 TEXT 和 CDATA 节点并返回组合结果。</P><P> 注意: 空白字符包括新行、tab 和空格。 </P><P> nodeValue 属性通常返回原始文档中的内容,与文档如何加载和当前 xml:space 范围无关。 </P><P> 文本属性连接指定子树中的所有文本并扩展实体。这与文档如何加载、preserveWhiteSpace 开关的当前状态和当前 xml:space 范围有关,请看如下所示:</P><DIV class=quote> preserveWhiteSpace = true when the document is loaded
preserveWhiteSpace=true preserveWhiteSpace=true preserveWhiteSpace=false preserveWhiteSpace=false
xml:space=preserve xml:space=default xml:space=preserve xml:space=default
保留 保留 保留 保留并截断
preserveWhiteSpace = false when the document is loaded
preserveWhiteSpace=true preserveWhiteSpace=true preserveWhiteSpace=false preserveWhiteSpace=false
xml:space=preserve xml:space=default xml:space=preserve xml:space=default
半保留 半保留并截断 半保留 半保留并截断 </DIV><P> 此处的保留表示和原始 XML 文档中完全相同的原始文本内容,截断意味着前导和尾部空格已经删除,半保留意味着保留了“重要的空白字符”并规范化了“不重要的空白字符”。重要的空白字符是文本内容内部的空白字符。不重要的空白字符是标记之间的空白字符,请看如下所示:</P><DIV class=quote> \n
\t Jane\n
\tSmith \n </DIV><P> 在本示例中,红色是可以忽略的不重要的空白字符,而绿色是重要的空白字符,因为它是文本内容的一部分,因此有不可忽略的重要含义。所以在本例中,文本属性返回下列结果:</P><P> 状态 返回值
保留 "\n\t Jane\n\tSmith \n"
保留并截断 "Jane\n\tSmith"
半保留 " Jane Smith "
半保留并截断 "Jane Smith"</P> 请注意“半保留”将规范化不重要的空白字符,例如,新行和 tab 字符将退化为单个空格。如果更改 xml:space 属性和 preserveWhiteSpace 开关,那么文本属性将返回相应的不同值。<P> CDATA and xml:space="preserve" subtree boundaries
在下面的例子中,CDATA 节点或“保留”节点的内容将得到连接,原因是它们不参与不重要的空白字符规范化。例如:</P><DIV class=quote> \n
\t Jane \n
\t Smith ]>\n </DIV><P> 在这种情况下,CDATA 节点内部的空白字符不再与“不重要”空白字符“合并”,并且不会截断。因此“半保留并截断”情况将返回下列内容:</P><P> "Jane Smith "</P><P> 在此, 和 标记之间的不重要的空白字符将包括在内,与 CDATA 节点的内容无关。如果用下列内容代替 CDATA,那么将返回相同结果:</P><P> Smith
实体是特殊的 </P><P> 实体是作为 DTD 的一部分加载和分析的,并且显示在 DOCTYPE 节点下。它们不一定要有任何 xml:space 范围。例如:</P><DIV class=quote><P> Jane \n
\t\n
">
]>
&Jane; </P></DIV><P> 假定 preserveWhiteSpace=false(在 DOCTYPE 标记范围内),在分析实体时不重要的空白字符丢失。实体将不会有空白字符节点。树将类似于:</P><DIV class=quote> DOCTYPE foo
ENTITY: Jane
ELEMENT: employee
ELEMENT: name
TEXT: Jane
ELEMENT: title
TEXT>:Software Design Engineer
ELEMENT: foo
ATTRIBUTE: xml:space="preserve"
ENTITYREF: Jane</DIV><P> 请注意,在 DOCTYPE 内部 ENTITY 节点下显露的 DOM 树不包含任何 WHITESPACE 节点。这意味着 ENTITYREF 节点的子节点也没有 WHITESPACE 节点,即使实体引用在 xml:space="preserve" 的范围内也是这样。 </P><P> 给定文档中引用的每个 ENTITY 的实例通常都有相同的树。 </P><P> 如果实体必须绝对保留空白字符,那么它必须在自己内部指定自己的 xml:space 属性,或者文档 preserveWhiteSpace 开关必须设置为 true。</P><P> <b>如何处理属性中的空白字符? </b></P><P> 有几种方式可以访问属性值。IXMLDOMAttribute 接口有 nodeValue 属性,它等价于作为 Microsoft 扩展的 nodeValue 和 text 属性。这些属性返回: 属性 返回的文本 </P><P> attrNode.nodeValue
attrNode.value
getAttribute("name") 返回和原始文档中完全相同的内容(和扩展的实体)。
attrNode.nodeTypedValue Null
attrNode.text 除了前导和尾部的空白字符已经截断之外,其他与 nodeValue 相同。 </P><P> “XML 语言”规范为 XML 应用程序定义了下列行为: 属性类型 返回的文本
CDATA ID、IDREF、IDREFS、ENTITY、ENTITIES、NOTATION、枚举 </P><P> <b>半规范化 全规范化 </b></P><P> 在此半规范化代表将新行和 tab 字符转换为空格,但是多个空格不会退化为一个空格。</P>
页:
[1]
