免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3197 | 回复: 0
打印 上一主题 下一主题

XML的应用-网站的制作(一)利用xsl解析XML [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-07-07 16:03 |只看该作者 |倒序浏览
  一晃差不多有一年的时间没有接触java,其间依稀做了一段时间的delphi,做了大半年ss7上的应用,忙忙碌碌,亦无所心得。前段时间上CU上看了一下以前自己发的几篇文章,居然十分陌生起来,想去年的这个时候突发了奇想写个XML应用的系列,本意一是和大家共享一下学习的心得,二来涂鸦之笔总算有个地方保存,查来也方便。不料,中途移志,宏愿没了继承。不禁喟叹!
  2004年7月,天气骤然热了许多,没完没了的热和期待同样的难熬,想还是利用空闲的时空完成早些时候的愿望,也算是对即将结束的一段生活的交待。
第一章  准备工作:
工具:xml spy  大家在网上查查,以下例子均在xmlspy 2004版本上开发。
第二章 编写XML(扩展标记语言)
编写XML有两种方法:
一、手工书写
如果你对XML很熟悉的情况下,完全可以按设计好的思路手工书写XML文件,当然如果从规范的角度建议使用dtd进行规范,后面将详细介绍dtd的用法。
例:一个典型的xml文件
<?xml version="1.0" encoding="UTF-8"?>;
<?xml-stylesheet type="text/xsl" href="xsl/base/index.xsl"?>;
<myArea>;
        <variableSet baseID="rightMenu">;
                <variable fieldName="index">;right/UserList.xml</variable>;
                <variable fieldName="linkname">;权限管理</variable>;
                <variable fieldName="right">;right</variable>;
        </variableSet>;
        <variableSet baseID="rightMenu">;
                <variable fieldName="index">;multcast/multcast.xml</variable>;
                <variable fieldName="linkname">;联通广播</variable>;
                <variable fieldName="right">;multcast</variable>;
        </variableSet>;
</myArea>;
二、利用xmlspy工具编写xml
通过XMLSPY工具编写XML大致分两个骤
A、DTD定义(Document Type Definition):文档样式定义
利用DTD定义主要目的有二:
一是定义XML文档的标记,以加强标记内部参数一致性。
二是使XML语法分析器能正确解析XML文档,避免因手工书写的XML容易造成错误的缺点。
下例为一个典型的DTD定义文件:(mytest.dtd)
<?xml version="1.0" encoding="GB2312"?>;  ――指定字符编码
<!ELEMENT mytest  (id, name, price)>;    ――定义XML父无素mytest  ,三个子无素id,name,price
<!ATTLIST mytest   type CDATA #REQUIRED>; ――为父元素mytest  定义一个type的属性
<!ELEMENT id (#PCDATA)>;                ――规定子元素id,是不再包含子元素的元素。
<!ELEMENT name (#PCDATA)>;             ――规定子元素name,是不再包含子元素的元素。
<!ELEMENT price (#PCDATA)>;              ――规定子元素brief,是不再包含子元素的元素。
一>; 在XMLSPY中建立dtd的四步曲:(见附图一)

说明:第三步:<!ATTLIST movies type CDATA #REQUIRED>;
具体制作步骤可以参考:xml spy实例教程
http://www.yesky.com/SoftChannel/72342376223342592/20030919/1729909.shtml
总结:这部分主要了解什么是dtd?它的作用是什么?如何定义一个dtd?
B、利用dtd定义好的规范生成xml文件
先看一个利用dtd定义好的XML文件:(mytest.xml)
<?xml version="1.0" encoding="UTF-8"?>;
<!DOCTYPE mytest SYSTEM "H:\javalong\xsl\mytest.dtd">; ――XML文件中此处定义了引用的dtd文件
<?xml-stylesheet type="text/xsl" href="H:\javalong\xsl\mytest.xsl"?>; --指定解析的xsl文件
<mytest type="ss">;
        <id>;000000001</id>;
        <name>;钢笔</name>;
        <price>;20.00</price>;
</mytest>;
通过前面的介绍我们知道并不是所有的xml文档都需要利用dtd定义规范生成(当然无须dtd文件,你必需手工书写XML文档)。
该XML文档生成步骤仍然可参考xml spy实例教程
http://www.yesky.com/SoftChannel/72342376223342592/20030919/1729909.shtml

第三章 编写xsl文档
XSL(eXtensible Stylesheet Language):一种将xml文档转换为其它格式文档的语言。通常的应用是利用xsl将xml转换为html,在工程项目应用中实现MVC开发模式。
 为帮助大家获得感性的认识,我们先按以下步骤写一个xsl文件来解析xml,开发步骤:
一、准备好静态的html文件
静态页面例:mytest.htm(见附图二)


二、直接修改html文件为xsl文件
修改后的mytest.xsl文件:就我本人而言提倡直接在htm文件基础上直接修改,当然也可利用xmlspy进行辑编修改。

<?xml version="1.0" encoding="GB2312"?>;
<!-- edited with XMLSPY v2004 rel. 2 U (http://www.xmlspy.com) by zte (zte) -->;
<xsl:stylesheet version="1.0" xmlnssl="http://www.w3.org/1999/XSL/Transform" >;
<xsl:template match="/" name="mainTemplate1">;
<title>;无标题文档</title>;
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>;
<META content="text/html; charset=gb2312" http-equiv="Content-Type"/>;
<LINK href="css/table.css" rel="stylesheet" type="text/css"/>;

<body bgcolor="#FFFFFF" text="#000000">;
<table width="39%" border="0" cellspacing="0" bgcolor="#FF9900" class="table3">;
  <xsl:for-each select="mytest">;
  <tr>;
    <td width="18%" align="center" class="td1">;id</td>;
    <td width="82%" class="td1">;<xsl:value-of select="id">;</xsl:value-of>;</td>;
  </tr>;
  <tr>;
    <td width="18%" align="center" class="td1">;name</td>;
    <td width="82%" class="td1">;<xsl:value-of select="name">;</xsl:value-of>;</td>;
  </tr>;
  <tr>;
    <td width="18%" align="center" class="td1">;price</td>;
    <td width="82%" class="td1">;<xsl:value-of select="price">;</xsl:value-of>;</td>;
  </tr>;
  </xsl:for-each>;
</table>;
</body>;
</xsl:template>;
</xsl:stylesheet>;

几点说明:
1、<?xml version="1.0" encoding="GB2312"?>;
<!-- edited with XMLSPY v2004 rel. 2 U (http://www.xmlspy.com) by zte (zte) -->;
<xsl:stylesheet version="1.0" xmlnssl="http://www.w3.org/1999/XSL/Transform" >;增加的这部分说明xsl文档本身也是一个xml文件。要指定字符编码,解析文件
2、基本上所有的原html文件都包含在
<xsl:template match="/" name="mainTemplate1">;
 原html文件
</xsl:template>;
这里xsl:template是xsl中指定模板的语法,模块的概念是针对xml节点而言,我们可以对xml每一级节点作不同的处理,每一种处理都可以构成一个模板。后面的段落有更详细的描述。
3、仔细看看这些代码马上明白了,除了指定以上两点外,就是用
 <xsl:for-each select="mytest">;
  ….
<xsl:value-of select="price">;</xsl:value-of>;
….
</xsl:for-each>;
来替代原来的静态值
总结:xsl文档写法就这么简单,了解这个例子同时我可以体会MVC项目分解的一些概念,页面的制作完全可以和控制处理分开。这点后续的篇章要作专门的研究。
三、多模板的应用(附)
 经过上两步,一个简单的xsl文档已经完成,第二步我提到多模板的应用,下面的例子中将已完成的xsl再扩充一下,来点动态的东东:
 先看增加了模板后的mytest.xsl文件:
 <?xml version="1.0" encoding="GB2312"?>;
<!-- edited with XMLSPY v2004 rel. 2 U (http://www.xmlspy.com) by zte (zte) -->;
<xsl:stylesheet version="1.0" xmlnssl="http://www.w3.org/1999/XSL/Transform" >;
<xsl:template match="/" name="mainTemplate">;
        <script language="JavaScript">;
                <xsl:comment>;<![CDATA[
                 function   saveOpen()
                 {
                alert("sdfsdf";
            }
                ]]>;</xsl:comment>;
        </script>;
</xsl:template>;

<xsl:template match="/" name="mainTemplate1">;
        <xsl:call-template name="mainTemplate">;</xsl:call-template>;
<title>;无标题文档</title>;
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>;
<META content="text/html; charset=gb2312" http-equiv="Content-Type"/>;
<LINK href="css/table.css" rel="stylesheet" type="text/css"/>;

<body bgcolor="#FFFFFF" text="#000000">;
<table width="39%" border="0" cellspacing="0" bgcolor="#FF9900" class="table3">;
  <xsl:for-each select="mytest">;
  <tr>;
    <td width="18%" align="center" class="td1">;id</td>;
    <td width="82%" class="td1">;<xsl:value-of select="id">;</xsl:value-of>;</td>;
  </tr>;
  <tr>;
    <td width="18%" align="center" class="td1">;name</td>;
    <td width="82%" class="td1" onMouseOver="style.cursor='hand';" onclick="saveOpen();">;<xsl:value-of select="name">;</xsl:value-of>;</td>;
  </tr>;
  <tr>;
    <td width="18%" align="center" class="td1">;price</td>;
    <td width="82%" class="td1">;<xsl:value-of select="price">;</xsl:value-of>;</td>;
  </tr>;
  </xsl:for-each>;
</table>;
</body>;

</xsl:template>;
</xsl:stylesheet>;

说明:和上例的mytest.xsl相比较,这个文档里增加了两个代码段
一是:<xsl:template match="/" name="mainTemplate">;
        <script language="JavaScript">;
                <xsl:comment>;<![CDATA[
                 function   saveOpen()
                 {
                alert("sdfsdf";
            }
                ]]>;</xsl:comment>;
        </script>;
</xsl:template>; 
该代码段表示为对应xml的根节点定义一个名为mainTemplate的模板,该模板其实没有对节点值作任何处理,只是在模板内通过<xsl:comment>;语法生成一个注释节点,该节点又是通过
<![CDATA[
文本内容……
]]>;
输出一段文本内容。另外细心读者会发现这个文档里定义的两个模板都用于匹配“/”根节点,会不会产生冲突,这和xsl解析顺弃有关,一般来节点处理匹配会对应最后一个模板,这个概念听起来有些模糊,简单理解就是:如果对同一节点定义不同的处理模板,最后一个板模才是有效的。这里因为只输出了文本内容未对节点内容作处理,而不会产生任务冲突。
2、如果把其它定义好的模板看作是c代码是函数,那么<xsl:call-template name="mainTemplate">;</xsl:call-template>;就是调用函数的语法,正因为上一点的所描述第二个模板才是真实有效的处理,所以你只有将第一个模板调用后,第一个模板mainTemplate输出的内容才会出现在第二个模板内。
总结:通过这段应用,可以灵活对xsl文档作任意拼拆活动。如何运用当然是读者发挥的问题了。
四、演示
先检查一下你的XML文档是否指定了解析的xsl文件,如:
<?xml version="1.0" encoding="UTF-8"?>;
<!DOCTYPE mytest SYSTEM "H:\javalong\xsl\mytest.dtd">; ――XML文件中此处定义了引用的dtd文件
<?xml-stylesheet type="text/xsl" href="H:\javalong\xsl\mytest.xsl"?>; --指定解析的xsl文件
<mytest type="ss">;
        <id>;000000001</id>;
        <name>;钢笔</name>;
        <price>;20.00</price>;
</mytest>;
将你辛辛苦苦做的mytest.xml、mytest.xsl放在同一目录下(示例的目录为H:\javalong\xsl),
用IE5.5以上的版本打开你的mytest.xml文件,最后的结果:(见附图三)

             图示 xml显示后单击钢笔后的结果

1.gif (20.57 KB, 下载次数: 42)

附图一

附图一

2.gif (19.26 KB, 下载次数: 33)

2.gif
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP