风中情子 发表于 2005-2-25 23:01

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>

风中情子 发表于 2005-2-25 23:01

<b>XML 和 World Wide Web Consortium (W3C) 之间的关系是什么? </b><P>  W3C 有一活跃的 XML 工作组。Microsoft 从 1996 年 6 月起就是该组织的共同发起者之一,从那时起许多业界企业都开始加入,包括 Netscape Communications Corp.、IBM 和 Oracle。有关 XML 标准过程的详细信息,请访问 W3C Web 站点(英文)。</P><P>  <b>XML 和 W3C 的地位关系如何? </b></P><P>  XML 1.0 是在 1998 年 12 月被正式批准的,现在仍是个稳定的标准。有关当前 XML 规范的详细信息以及 W3C 内部的提交和审阅过程,请参见 W3C Web 站点(英文)。</P><P>  <b>DOM 在 W3C 中的地位如何? </b></P><P>  DOM Level 1 的 W3C 文档状态为“推荐”。这说明 W3C 目前正在提议将它作为 World Wide Web 上的标准。有关 DOM 和在 W3C 内部提交和审阅过程的详细信息,请参见 DOM 规范(英文)。</P><P>  <b>工具支持 </b></P><P>  <b>SQL Server 和 ADO 支持 XML 吗? </b></P><P>  Microsoft ActiveX 数据对象 (ADO) 技术,提供许多将数据库记录集(数据记录集合)转换为 XML 格式的方法,以及从给定结构中获取 XML 并将其转换回 ADO 所支持数据库(包括 SQL Server 和 Oracle 数据库)的工具。此外,通过 MSXML2 和 MSXML3 中的 XML 数据源对象,还可以将任意 XML 直接加载到 ADO 中以生成记录集。</P><P>  SQL Server 2000 还允许通过 URL 直接设置和检索 XML,方式和调用 Web 页面非常相似。这是处理数据的强大机制,因为它基本上意味着可以将 SQL Server 数据直接集成到 XML 过滤器和 Web 页面,基本上凡是有 XML 文档的地方都可以集成 SQL Server 数据。此外,还可以设置自定义模板,来控制如何从 SQL Server 数据中产生 XML,使数据库成为生成 XHTML 页面的强大工具。</P><P>  最后,诸如 BizTalk Server 这样的应用程序还允许在任意数量的不同数据源(从 XML 文档到数据库到 Excel 和 Word 文档)之间进行映射、为 Web 体系结构创建复杂数据管道以及根据 XML 数据库需求构造有效的架构。</P><P>  <b>目前有 Microsoft 工具可以帮助我快速沿用 XML 吗? </b></P><P>  Microsoft BizTalk Server 2000 是用于数据交换的、基于 XML 的服务器,它提供启用电子商务业务社会的基本结构和工具。BizTalk Server 的基础是基于规则的业务文档路由、转换和跟踪基本结构。该基本结构允许公司通过在组织边界之内或之间的应用程序中间交换业务文档,例如购买定单和发票,来集成、管理和自动化业务过程。有关详细信息,请参见Microsoft BizTalk Server 2000(英文) 。</P><P>  <b>什么是 SOAP? </b></P><P>  SOAP 是简单对象访问协议,是创建大范围分布式、复杂计算环境的工具,该计算环境可使用现有的 Internet 基本结构运行在 Internet 上。SOAP 可以使应用程序用许许多多方法在 Internet 上互相直接通信。有关 SOAP 的详细信息,请参见 SOAP 规范(英文)。</P><P>  XML 如何适用于 Microsoft Windows? Distributed InterNet Applications (Windows DNA) 策略来构造三层并具有 Web 功能的应用程序? </P><P>  XML 正在快速成为将结构化数据从中间层传送到桌面的工具。基于 XML 的数据可以通过中间层代理与多种后端(数据库)源集成。架构(参见“XML 数据”一节)可以改进该过程,并且开发人员可以更精确地描述和交换数据。</P><P>  <b>问题和解决方案 </b></P><P>  <b>为什么在调用了 Load() 方法后,我的文档对象仍然为空? </b></P>

风中情子 发表于 2005-2-25 23:02

默认情况下操作是异步加载的。这意味着如果提供 http URL 地址,那么 load() 方法将直接返回,并且文档对象仍然为空,因为数据还没有从服务器返回。为了纠正这个问题,请在代码中添加下面的行:  <DIV class=quote>xmldoc.async = false;</DIV><P>  同时,如果是从独立的 C++ 应用程序加载 http XML 文档,那么必须查询消息队列才能继续加载。 </P><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 &amp; that</DIV><P>  产生如下错误:
  此处不允许有空格。
  行 0000001: This &amp; that
  位置  0000012: ----------^ </P><P>  此处 &amp; 是 XML 句法结构的一部分,如果它仅仅放在 XML 数据源内部,那么不能解释为 &amp;。您需要替换称为“实体”的特殊字符序列。</P><DIV class=quote>  This &amp; that</DIV><P>  下面的字符需要相应的实体:</P><DIV class=quote>   &lt; &lt;
  &amp; &amp;
  &gt; &gt;
  " "
  ' &amp;apos; </DIV><P>  引号字符被用作标记中属性值的定界符,因此通常不能在属性值的内部使用。例如,下面的内容将返回错误:</P><P>  此处的单引号既用作属性定界符,又在属性值自身中。为了纠正这个问题,可以将属性定界符换成双引号:</P><P>  或者可以将单引号转义为实体 &amp;apos; </P><P>  上述两种方式都将通过 XML 对象模型中的 getAttribute 方法返回属性值 John's Stuff。同样,对于双引号,您可以使用实体  "。</P><P>  也可以通过将文本放在 CDATA 节中来处理元素内容中的特殊字符。下面的内容是正确的:</P><P>  在本例子中,XML 对象模型将 CDATA 节点显示 xml 节点的子节点,它将返回字符串</P><P>  This &amp; 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>

风中情子 发表于 2005-2-25 23:02

这是因为 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>

风中情子 发表于 2005-2-25 23:03

请注意“半保留”将规范化不重要的空白字符,例如,新行和 tab 字符将退化为单个空格。如果更改 xml:space 属性和 preserveWhiteSpace 开关,那么文本属性将返回相应的不同值。<P>  CDATA and xml:space="preserve" subtree boundaries
  在下面的例子中,CDATA 节点或“保留”节点的内容将得到连接,原因是它们不参与不重要的空白字符规范化。例如:</P><DIV class=quote>   \n
  \t Jane \n
  \t     Smith     ]&gt;\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
  "&gt;
  ]&gt;
  &amp;Jane; </P></DIV><P>  假定 preserveWhiteSpace=false(在 DOCTYPE 标记范围内),在分析实体时不重要的空白字符丢失。实体将不会有空白字符节点。树将类似于:</P><DIV class=quote>   DOCTYPE foo
  ENTITY: Jane
  ELEMENT: employee
  ELEMENT: name
  TEXT: Jane
  ELEMENT: title
  TEXT&gt;: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]

编程论坛