« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
| 公告 |
暂无公告... |
Blog信息 |
blog名称:VeryTag 日志总数:15 评论数量:8 留言数量:0 访问次数:84249 建立时间:2005年1月22日 |

| |
针对不可访问 Web 页的文本选择  电脑与网络
清风细雨 发表于 2005/2/16 11:36:37 |
发布日期: 12/21/2004 | 更新日期: 12/21/2004
Microsoft Corporation
摘要:描述如何使用 XML 和 XSLT 来提供同一 Web 页的多个视图。当一些用户需要不太复杂的或纯文本的 Web 页视图时,或者当其他用户想要更复杂或更高带宽的版本时,这种方法是很有用的。要用一组数据做到这一点,本文中所包含的代码示例展示如何确定要显示的视图、创建 XSLT 参数列表、加载 XML 和相应的 XSLT,以及如何执行转换。
本页内容
500)this.width=500'>
简介
500)this.width=500'>
可选文本技术
简介
不同用户可能需要相同 Web 页的不同版本。有些用户需要不太复杂的或纯文本的 Web 页视图,而其他用户可能需要更复杂或更高带宽的版本,对于这些情况,XML 和 XSLT 能有效提供同一 Web 页的多个视图。
能够适应两类用户需求的传统方法是维护两组包含相同数据的不同页面 — 一组是丰富视图,另一组是纯文本视图。这种方法明显的弊端是,只要公用内容更新,两组页面就都 必须更新。
本文中描述的技术提供一组既带有丰富的、复杂的视图(包括 DHTML、图形和复杂的表),又带有纯文本视图(没有 DHTML、图形、表或格式设置)的数据。由于该组数据不是重复的,因此更新站点只需更改一组数据页。这意味着我们可以使用以 XML 编写的一个源,并提供两个不同的、用户可选的 XSLT,以便为用户提供他们所选择的 Web 页视图。
注 有残疾的用户将获益于能够访问不带有格式设置和布局的站点的所有数据和功能。对于 Web 站点提供者也有显而易见的好处,其获益程度取决于当前体系结构上的工作负荷、站点内容更新的频率,以及站点的大小。
可选文本技术
Microsoft Enable Web site 使用该技术为用户提供两种版本:
•
带有图形和复杂表的格式化的、高带宽的版本(图 1)
•
线性的、纯文本的版本(图 2)。
500)this.width=500'>
图 1. 格式化的、图形丰富的视图
500)this.width=500'>
图 2. 线性的、基于文本的视图
用户可以选择他们想要浏览的版本。选定的版本的上下文在用户在 Web 站点内的整个会话期间或在他们选择更改上下文之前得到维护。
所需视图(目前只有文本或格式化的)是通过 HTTP 查询字符串中的一个值对来指定的。该方法实现为使用户能够对任一视图设置书签,并随后维护该上下文或状态。具体说来,对于这个实现,变量“v”可以有值“t”(text) 或“f”(formatted)。当找不到任何值或输入了一个无效值时,格式化的版本用作默认版本。
下面的代码示例展示如何:
•
确定要显示哪个视图
•
构建 XSLT 参数列表
•
加载 XML 和适当的 XSLT
•
执行转换
当加载一个页面时,我们用示例 1 中提供的代码确定要显示哪个视图。
代码示例 1. 检测显示方法<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e)
{
// get version
version = GetVersion(Request.QueryString["v"]);
// Load the XML document to transform.
Transform(Server.MapPath("default.xml"),Server.MapPath("/enable/incl
udes/" + version));
}
private string GetVersion(string qs)
{
if ((qs != "t") && (qs != "f"))
{
qs = "f";
}
return "enablefilter_ASPX_" + qs + ".xsl";
}
下一步,我们添加其他参数,以便构建版权声明、上次修改的数据以及该页的电子邮件联系数据,如示例 2 中所示。
代码示例 2. 站点信息代码private void Transform(string sXmlPath, string sXslPath)
{
try
{
FileInfo fi = new FileInfo(sXmlPath);
DateTime modified = fi.LastWriteTime;
DateTime copyrightYear = DateTime.Now;
XsltArgumentList args = new XsltArgumentList();
args.AddParam("dateModified","",modified.ToLongDateString());
args.AddParam("filePath","",Request.Url);
args.AddParam("copyrightYear","",copyrightYear.Year);
最后,示例 3 中提供的代码基于显示格式确定执行转换。
代码示例 3. 转换页面显示//load the Xml doc
XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.Load(sXmlPath);
//load the Xsl doc
XslTransform myXslTrans = new XslTransform();
myXslTrans.Load(sXslPath);
//do the actual transform of Xml
myXslTrans.Transform(myXmlDoc,args, Response.OutputStream);
}
catch(Exception e)
{
string msgError = "Exception: ";
Response.Write(msgError + e.Message);
}
}
static string version = "";
</script>
显示结果
本节包括来自一个 XML 源文档的示例、两个执行两个转换的 XSLT,以及两组结果(一个是富内容版本,另一个是纯文本版本)。
代码示例 4. 源 XML<table border="5" cellpadding="5" cellspacing="5" bordercolor="#ffffff"
bgcolor="#ff9900" width="75">
<tr>
<td width="70">
<img border="0" src="/enable/images/photos/man.jpg"
width="70" height="70" alt="Man with laptop"/>
</td>
</tr>
<tr>
<td width="70">
<img src="images/photos/hand.jpg" width="70" height="70"
border="0" alt="Hand on keyboard"/>
</td>
</tr>
<tr>
<td width="70" align="middle">
<img src="images/photos/braille_fingers.gif" width="65"
height="91" valign="absmiddle" alt="Fingers feeling Braille text"
border="0"/>
</td>
</tr>
</table>
如果用户已经选择了格式化的视图,就会应用示例 5 中提供的 XSLT 代码。
代码示例 5. XSLT 格式化代码<xsl:template match="table | TABLE | Table">
<table>
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</table>
</xsl:template>
<xsl:template match="tr | TR">
<tr>
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</tr>
</xsl:template>
<xsl:template match="th | TH">
<th>
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</th>
</xsl:template>
<xsl:template match="td | TD">
<td>
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</td>
</xsl:template>
<xsl:template match="img | IMG | Img">
<img>
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</img>
</xsl:template>
在这种情况下,转换产生示例 6 中提供的 HTML。
代码示例 6. 得到的格式化显示<table border="5" cellpadding="5" cellspacing="5" bordercolor="#ffffff"
bgcolor="#ff9900" width="75">
<tr><td width="70"><img border="0" src="/enable/images/photos/man.jpg"
width="70" height="70" alt="Man with laptop"></td></tr>
<tr><td width="70"><img src="images/photos/hand.jpg" width="70"
height="70" border="0" alt="Hand on keyboard"></td></tr>
<tr><td width="70" align="middle"><img
src="images/photos/braille_fingers.gif" width="65" height="91"
valign="absmiddle" alt="Fingers feeling Braille text"
border="0"></td></tr>
</table>
另一方面,如果用户已经选择了页面的纯文本视图,就会应用该 XSLT 代码,如示例 7 中所示。
代码示例 7. XSLT 纯文本代码<xsl:template match="table | TABLE | Table">
<div>
<xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match="tr | TR">
<div>
<xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match="th | TH">
<div>
<xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match="td | TD">
<div>
<xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match="img | IMG | Img">
<xsl:if test="not(ancestor::banner) and not(ancestor::BANNER) and
not(ancestor::Banner)">
<xsl:for-each select="@*">
<xsl:if test="((name()='alt') or (name()='ALT') or
(name()='Alt')) and (normalize-space(.)!='')">
[image: <xsl:value-of select="." />]
</xsl:if>
</xsl:for-each>
<xsl:apply-templates />
</xsl:if>
</xsl:template>
示例 8 产生一个简单得多的数据视图。
代码示例 8. 得到的纯文本显示<div>
<div>
<div>
[image: Man with laptop]
</div>
</div>
<div>
<div>
[image: Hand on keyboard]
</div>
</div>
<div>
<div>
[image: Fingers feeling Braille text]
</div>
</div>
正如您能看到的,表已由 DIV 替换,图像和格式设置已移除,而且每个图像的 ALT 属性替换了该图像。
上面所描述的技术提供了一组既带有丰富视图又带有纯文本视图的数据。由于数据不是重复的,因此更新站点只需更新一组数据页面。
转到原英文页面 |
|
|