正 文

一步一步学 XHTML


www.7dspace.com  更新日期:2005-11-5 4:50:46  七度空间


实践中的一些问题

不要对 XHTML 1.1 使用 text/html

Internet 媒体类型(IMT),也称为 MIME 类型,是为了和程序通信以便正确解释某些资源而设计的。众所周知,用于 HTML 文档的 IMT 是 text/html。不要对 XHTML 使用该 IMT 有几方面的原因,但归根结底在于 XHTML 1.1 文档不同于 HTML 文档(通过本教程您无疑确信这一点),如果不明白这一点就会陷入 quirks 模式和混乱。

关于 XHTML 使用什么 IMT 的讨论漫长而纠缠不清,但最后确定为 application/xhtml+xml。应该使用这个 IMT,但是必须做一些细微调整(请参阅 参考资料)来适应那些尚未完全支持它的 Web 浏览器。

除非运行 Web 服务器,否则不需要直接设置媒体类型,但是这种实用性的建议可以有微妙的影响。首先,对 XHTML 文件应考虑使用 .xml 或 .xhtml 文件扩展名而不使用 .html 扩展名。很多程序尝试通过文件扩展名猜测 IMT,对使用 .html 文件扩展名的文档认为其 IMT 为 text/html。如果使用 link 元素表示文档间的关系,一定要记住正确的 IMT,尤其是使用 type 属性时。

使用 W3C XHTML 验证程序

正确编写 XHTML 会遇到大量的规则和很多细微之处。如果从 XHTML 开始进行 Web 设计,与有效使用 HTML 的规则相比并没有更多的神秘之处和复杂性。但是如果熟悉 HTML(多数人都是如此),必须随时警惕陷入坏的习惯。最好的办法是使用验证程序检查您的 XHTML 页面。

最知名的验证程序是 W3C 的在线工具(请参阅 参考资料)。W3C 实际上为他们的很多规范提供了在线验证程序,包括几乎所有版本的 HTML 和 XHTML。这些程序已经结合成一个简单的表单,在其中指定 URL 或者上传文件。验证程序按照指明用何种规范验证的文档类型声明检查文件。如果页面无效,可以再次尝试,并允许指定 HTML 或 XHTML 版本、编码或其他参数。这样更便于确定引发一系列验证问题的根本症结。

当然,本教程中的所有 XHTML 例子都经过了该验证程序的验证。

为字符编码使用 XML 声明

目前多数 Web 浏览器都把查看 HTTP 头作为确定网页字符编码的主要方式。当然应该继续配置 Web 服务器或类似的系统继续提供该信息。还要在文档本身的 XML 声明中表示该信息,当然,XML 声明中指定的编码一定要和 HTTP 头中指定的一致。

在 HTML 文档中,还有一种方法覆盖字符编码信息,就是在文档头的元数据中(使用 meta 元素和 http-equiv 属性)。下面给出了一个包含此声明的例子。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

XHTML 中不再需要使用这种形式,而且 W3C 认为不应该再这样做。

使用 XSLT 提供到 HTML 的转换

我建议您从过去的 HTML 转向 XHTML 1.1。现在多数浏览器只要稍作调整都能处理 XHTML,而且随着版本升级对 XHTML 的支持越来越好。但无论如何,有时候可能还需要用传统的 HTML 呈现 XHTML 内容。如果出现这种情况,您非常高兴决定从 XHTML 入手。一般来说,从 HTML 转化到 XHTML 非常困难,但反过来却非常容易,这是因为 XHTML 比 HTML 更加规范和结构化。从 XHTML 转化到 HTML 最简单的办法可能是通过 XSLT。

因为 XHTML 1.1 以 XHTML 1.0 Strict 为基础,后者又以 HTML 4.01 Strict 为基础,这些格式之间的多数元素和属性都是相同的。这意味着仅仅通过在 XHTML 文档中呈现相同的元素,但使用 HTML 约定,您就已经完成了大部分转换。XSLT 提供了 HTML output 方法,可以生成 HTML 结果(默认版本为 4.0,但可以指定不同的版本),还有所谓的恒等转换技术把输入元素、属性和文本复制到输出中。可以使用这种转换作为从 XHTML 到 HTML 的基础。下面的清单(下载文件 中的 xhtml2html.xsl)以恒等转换为基础,同时又去掉了 XHTML 名称空间元素,将 xml:lang 属性改为 lang、id 属性改为 id 和 name 对。多数情况下只需要这些内容模型变动。

清单 16. 恒等转换和变换(xhtml2html.xsl)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"


  <xsl:output method="html" version="4.01" encoding="iso-8859-1"
              doctype-public="-//W3C//DTD HTML 4.01//EN"
              doctype-system="http://www.w3.org/TR/html4/strict.dtd"/>

  <xsl:template match="*" priority="1">
    <xsl:element name="{name()}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@xml:lang">
    <xsl:attribute name="lang">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="@id">
    <xsl:attribute name="id">
      <xsl:value-of select="."/>
    </xsl:attribute>
    <xsl:attribute name="name">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

要使用它必须完全理解该 XSLT。把它和要转换的 XHTML 文档作为源文档传递给选择的 XSLT 处理程序。(记住,多数现代 Web 浏览器都支持 XSLT。)结果是完全可用的 HTML。

将 XHTML 嵌入其他词汇表

除非包括文档类型声明和顶层的 html 元素,否则 XHTML 文档就不是完整、合法的,但是如果允许嵌入外部名称空间的元素,仍然可以在其他 XML 词汇表中重用 XHTML 片段。这种情况下,可以把任何 XHTML 块元素如 div、table 或 ol 插入其他声明有 XHTML 名称空间的 XML 词汇表。(嵌入的时候,最好使用前缀,以便明确这些元素不是宿主词汇表的一部分。)清单 17 是完全合法的 XSLT 文档,开头使用内嵌 XHTML 提供了一些文档信息。

清单 17. 内嵌 XHTML 的 XSLT 文档

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"


  <html:div xmlns:html="http://www.w3.org/1999/xhtml" xml:lang="en">
   This is the XSLT identity transform, described in
   <html:a href="http://www.w3.org/TR/xslt#copying">section 7.5</html:a>
   of the XSLT 1.0 specification.</html:div>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

6页,页码:[1] [2] [3] [4] [5] [6] 

上一篇:如何修改TTL值来防止入侵
下一篇:用.NET Remoting来开发分布式应用初步
作者:Uche Ogbuji  来源:developerWorks 中国 ( 责任编辑:7dspace )
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐