好像觉得很简单,就是,有好多好多问题,就是知道有问题,是什么问题我说不出来,就是,觉得哪里不对头,想测试的东西很多很多。。。
使用的书本是《精通ASP.NET 2.0 + XML + CSS网络开发混合编程》和《ASP.NET 2.0 XML高级编程第3版》,现在第二本还没开始看,想着写着高级编程,应该先看基础方法吧?
现在知道的只有两个,第一个最简单,这个是好久以前就知道的,直接使用XSL格式化XML文件,在ie里浏览时,浏览的是XML文件,第二个是在asp.net里读取XML文件后,使用XSL格式化,再输出,在ie里浏览时,浏览的是aspx文件
我想要知道的是第三步,如果使用的是普通数据库,ACCESS、MS SQL或者别的,怎么把数据按XSL文件中定义的显示出来呢?不可能要我每读取一次数据库就生成一个XML文件的,没有这样子的大笨蛋,方法肯定有,我还没学到。。。
就是,第一本书上已经是第五章结束了啊,第六章已经开始讲实例了,一个留言本,讲的很详细,从数据库设计开始,到代码,这些我都不想看,我只想看怎么动态设置样式
觉得这一次学习和以前不同,嗯,是心里不同,以前我很能看书,这一次不是,我什么都不想看,拼命跳,是因为css本来就是很熟悉的东西,xml又已经接触很久的原因吗?我的脑袋里一直在晃“我只想看。。。”“我只想知道。。。”,就是,我想看的东西和我想知道的东西,如果不静下来看,厚厚一本书,我找不到答案在哪个章节,不喜欢这个书,最少,他不可以像字典一样子查,或者,是我这一次的学习方法不对,转高级编程吗?
我只想知道,怎么在asp.net里,不需要动代码,连母版也不动,直接使用动态样式把整个界面换掉,换的整个网站和原来的看不出来是同一个网站,这个,可以做到吗?我在找答案,我不知道是不是有答案,我想,这个可能就是我拼命跳的原因,我害怕没有答案。。。
第一步:浏览的是XML文件
phonebook.xml,红色那一句定义XSL样式
<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="phonebook.xsl"?>
<phonebook>
<member>
<name>zzz</name>
<telphone>31245698</telphone>
<qq>12658934</qq>
<msn>zzz@hotmail.com</msn>
<cellphone>12365492</cellphone>
<work>solider</work>
<address>china</address>
<email>zzz@163.com</email>
</member>
<member>
<name>xxx</name>
<telphone>312222</telphone>
<qq>12365478</qq>
<msn>xxx@hotmail.com</msn>
<cellphone>111111</cellphone>
<work>teacher</work>
<address>english</address>
<email>xxx@163.com</email>
</member>
<member>
<name>yyy</name>
<telphone>3121113</telphone>
<qq>1654782</qq>
<msn>yyy@hotmail.com</msn>
<cellphone>222222</cellphone>
<work>coder</work>
<address>chinaese</address>
<email>yyy@163.com</email>
</member>
<test>
<myText>测试格式化输出结束</myText>
</test>
</phonebook>
phonebook.xsl,xsl:template是定义一个模块,书上很详细的概念,我的脑袋里很模糊,我不知道我是不是真的理解了书上的一堆东西,红色部分和最后的黑色部分都是我修改的
红色部分完成的输出整个页面
黑色部分我加入是为了测试一些我脑袋里的东西,就是,我描述不出来,不知道是不是在想一个完整的页面里,会有好多个数据块,就像最新博客和最新评论一样子,两个数据块
蓝色那一部分是输出每一个member节点,或者说是每一个记录
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>直接用xsl格式化输入xml</title>
</head>
<body>
<table align="center" width="90%" border="2">
<tbody>
<tr bgcolor="#CCFF99">
<th>姓名</th><th>电话</th><th>QQ</th><th>MSN</th><th>手机</th>
<th>工作单位</th><th>地址</th><th>Email</th>
</tr>
<xsl:apply-templates select="/phonebook/member"></xsl:apply-templates>
</tbody>
</table>
<xsl:apply-templates select="/phonebook/test"></xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="member">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="telphone"/></td>
<td><xsl:value-of select="qq"/></td>
<td><xsl:value-of select="msn"/></td>
<td><xsl:value-of select="cellphone"/></td>
<td><xsl:value-of select="work"/></td>
<td><xsl:value-of select="address"/></td>
<td><xsl:value-of select="email"/></td>
</tr>
</xsl:template>
<xsl:template match="test">
<p style="text-align:center;"><xsl:value-of select="myText"/></p>
</xsl:template>
</xsl:stylesheet>
在浏览器里,直接查看XML文件,就可以按XSL中的html代码定义的格式输出三行记录了
从这里可以看出,如果我不想要这种显示方式,我可以只修改这个文件就可以把显示方式完全改变的,那是不是说明,我想要找的答案是存在的呢?
第二种方式,浏览的是aspx页面
phonebookForAspx.xml
<?xml version="1.0" standalone="yes"?>
<phonebook>
<member>
<name>zzz</name>
<telphone>31245698</telphone>
<qq>12658934</qq>
<msn>zzz@hotmail.com</msn>
<cellphone>12365492</cellphone>
<work>solider</work>
<address>china</address>
<email>zzz@163.com</email>
</member>
<member>
<name>xxx</name>
<telphone>312222</telphone>
<qq>12365478</qq>
<msn>xxx@hotmail.com</msn>
<cellphone>111111</cellphone>
<work>teacher</work>
<address>english</address>
<email>xxx@163.com</email>
</member>
<member>
<name>yyy</name>
<telphone>3121113</telphone>
<qq>1654782</qq>
<msn>yyy@hotmail.com</msn>
<cellphone>222222</cellphone>
<work>coder</work>
<address>chinaese</address>
<email>yyy@163.com</email>
</member>
</phonebook>
phonebookForAspx.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<table align="center" width="90%" border="2">
<tbody>
<tr bgcolor="#CCFF99">
<th>姓名</th>
<th>电话</th>
<th>QQ</th>
<th>MSN</th>
<th>手机</th>
<th>工作单位</th>
<th>地址</th>
<th>Email</th>
</tr>
<xsl:apply-templates select="/phonebook/member"></xsl:apply-templates>
</tbody>
</table>
</xsl:template>
<xsl:template match="member">
<tr>
<td>
<xsl:value-of select="name"/>
</td>
<td>
<xsl:value-of select="telphone"/>
</td>
<td>
<xsl:value-of select="qq"/>
</td>
<td>
<xsl:value-of select="msn"/>
</td>
<td>
<xsl:value-of select="cellphone"/>
</td>
<td>
<xsl:value-of select="work"/>
</td>
<td>
<xsl:value-of select="address"/>
</td>
<td>
<xsl:value-of select="email"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
ViewPhonebook.aspx
ViewPhonebook.aspx.cs
using System;
using System.Xml;
using System.Xml.Xsl;
using System.IO;
public partial class phonebook_ViewPhonebook : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//创建一个XmlDocument对象,对载入存储信息的XML文件
XmlDocument xDoc = new XmlDocument();
xDoc.Load(Server.MapPath("phonebook.xml"));
//创建一个XslCompiledTransform对象
XslCompiledTransform xslt= new XslCompiledTransform();
xslt.Load(Server.MapPath("phonebookForAspx.xsl"));
//选择所有节点名是“phonebook”的节点
string xmlQuery = "//phonebook";
XmlNodeList nodeList = xDoc.DocumentElement.SelectNodes(xmlQuery);
//使用XSL文件转换XML文件,结果输出到流
MemoryStream ms = new MemoryStream();
xslt.Transform(xDoc, null, ms);
//刚刚读入文件时,在流中的位置是最后
//Response.Write("<p>流的长度:" + ms.Length.ToString() + "</p>");
//Response.Write("<p>当前流中的位置:" + ms.Position.ToString() + "</p>");
//设置当前流中的位置是开头,后面可以从开头读起
ms.Seek(0, SeekOrigin.Begin);
//显示结果,从流的当前位置到末尾读取流
StreamReader sr = new StreamReader(ms);
Literal1.Text = sr.ReadToEnd();
}
}
这第二种方法,要搞懂的就是这个cs文件,这里面用到的方法不多,有一些以前也用过
这样处理后浏览的aspx文件,和直接浏览xml文件时界面是一样子的,因为他们的XSL文件基本是一样子的
真的只剩下第三步,数据库的问题吗?答案真的存在吗?