您所在的位置: 程序员家园 -> 家园博客 ->
 
在哪里摔倒
就在哪里自己爬起来

用户登录

查  找

最新评论

最新留言

常用网站

网易邮箱 GMAIL  

百度搜索 MSDN

霏凡软件 BT精品

影视帝国 射 手 网

电驴下载 全 库 网

友情连接

茄菲的窝 冰冰博客

枫叶飘零 玫  瑰

ACEN 云 豹 子

统  计



Dict.CN 在线词典, 英语学习, 在线翻译
[XSL学习]用XSL格式化XML文件后输出
狼子 发表于 2008-9-16 12:03:00 阅读全文 | 回复(0) | 引用通告 | 编辑

好像觉得很简单,就是,有好多好多问题,就是知道有问题,是什么问题我说不出来,就是,觉得哪里不对头,想测试的东西很多很多。。。

使用的书本是《精通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

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ViewPhonebook.aspx.cs" Inherits="phonebook_ViewPhonebook" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>在asp.net中读取xml文件,使用XSL格式化后输出</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Literal ID="Literal1" runat="server"></asp:Literal>
    </div>
    </form>
</body>
</html>

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文件基本是一样子的

真的只剩下第三步,数据库的问题吗?答案真的存在吗?

发表评论:

    昵称:
    密码:
    主页:
    标题:
Powered by Oblog.