目前看重的工具有ecplise或者pb。
ecplise看了将近一个礼拜,需要掌握的东西太多了,而手头的资料又太少 ,等待以后有机会再学了,对自己来说他确实很吸引人啊。
PB学起来倒是比较快,比较有成就感。
博客中国和这里都是用CSS来确定叶面格式,很巧的是自己又重新捡起去年就看过的一本书来温习。书名是XML实用培训教程。还有一本书几个SQL专家极力推荐的,是《XML宝典》,不过自己看了一下,是2002年出版的,里面还大规模的介绍过时的SAX等技术,想想日新月异的今天,还是等新的XML宝典出来再买吧。先把这本入门书啃透再说。。
开始做笔记
3.1 XML是不能为一个特定元素预定义显示属性的,因此需要一个与XML相分离的样式表,来描述如何显示XM L文档。两种方式,一种是级联式样式表CSS,一种是XSL。
3.1.1 CSS为任何常用的字处理软件支持,所有的样式信息不在文档内存储,而是放在称作样式单(Style sheet)的独立文件中,这样仅仅改变样式单就可以以多种不同的方式显示一个xml文件了。
几乎每个网页都是用css来控制网页的显示,css使用选择符作为格式的识别目标。
一般的css格式
选择符(属性名称:值;属性名称:值;...)
css的作用是给出网页的整体布局。
3.1.2 ccs基本样式表单的指令形式如下
....href="样式表名.css"
当浏览xml文档,浏览器自动搜索这个指令,并下载样式表,然后使用它来显示xml
但是在数据岛等场合忽略该指令。
一个xml可以包括多个样式表指令,ie首先搜寻type属性为text/xsl的指令,并且使用它找到第一个指令,然后再搜寻text/css指令,最后将他们曾迭起来,这种方法类似于html link元素的处理方法。
3.1.3
css可以为内部形式,也可以为外部形式
3.2 xsl
xsl是Extensible Stylesheet Language 的缩写,为可延伸的样式表语言。类似于CSS.CSS对于字体、颜色、大小、边框、背景等有着强大的功能,而XSL更切合XML。能对XML的数据中选择出需要的内容并予以显示。
3.2.3 模版规则
模版规则中涉及2个XSL元素,<XSL:TEMPLATE>、<xsl:apply-template>
模板式什么呢?可以把模板理解为xsl处理一个数据块队则,xsl模板现将xsl的设计细化成一个个模版块,最后将这些模版块组合成一个完整的xsl。这种方法使用户先从整体上考虑整个xsl的设计,然后将一些表现形式细分为不同的模块,具体设计模块的功能,最后将他们整理合并在一起。这样整体和局部的结合,先整体后局部符合条理化与规范化的要求。
1.<xsl:template>
语法是
<xsl:template match="节点内容" language="何种脚本语言"
属性match
用于定义此模板处于何种情况下,一般都以根目录开始,所以对根目录的访问语句是match="/".其他的情况可以用match="items/item..."形式表示
较好的方法是根据周围的内容指定锚。
利用 XSL 将 XML 树转换成字符串的方法
例如 使用 XPath 表达式
/html/body/center/table[6]/tr[2]/td[2]/table[2]/tr/td/table[6]
时代不同了,锚的位置也变了
2: /html/body[1]/center[1]/table[6]/tbody[1]/tr[1]/td[3]/table[6]/tbody[1]/tr[1]/td[2]/font[1]
标记为
//table[starts-with(normalize-space(.), 'Appar Temp')]
具体运用为
<xsl:template match="text()"></xsl:template>
<xsl:template match="table[starts-with(normalize-space(.),'Appar Temp')]">
<TEMPERATURE>
<xsl:value-of select="tr/td[2]/font"/>
</TEMPERATURE>
3.2.4元素和属性
<xsl:value-of select="tr/td[2]/font"/>
这里要掌握的是一般访问,最主要的元素<xsl:value-of>
语句的一般形式
<xsl:value-of select="元素或者属性"/>
或者 <xsl:value-of select="元素或者属性"></xsl:value-of >
访问属性值和元素不同,在属性名前面加上@
上面是一般访问,还可以重复访问,<xsl:for-each>
ps:
XPATH函数
Node set last(), position(), count(), id(), local-name(), namespace-uri(), name()
String string(), concat(), starts-with(), contains(), substring-before(), substring-after(),
substring(), string-length(),normalize-space(), translate()
Boolean boolean(), not(), true(), false(), lang()
Number number(), sum(), floor(), ceiling(), round()
XSLT 1.0 additions document(), key(), format-number(), current(), unparsed-entity-uri(), generate-id(), system-property()
功能
说明
starts-with(string string1,string string2)
如果字串1和字串2开头字元相等则传回true.
contains(string string1,string string2)
如果字串1中包含字串2则传回true.
substring(string string1,number offset,number length)
从字串1的offset值开始传回长度为length值的字串.
string-before(string string1,string string2)
传回字串1中从开始到字串2第一次出现之前的部分.
string-after(string string1,string string2)
传回字串1中从字串2第一次出现之後的部分.
string-length(string string1,string string2)
传回字串1的长度.
normalize-space(string string1)
将字串1前後的空白删除,并将字串中连续的空白以一个空白去代後传回.
translate(string string1,string string2,string string3)
将字串1中所有出现字串2的部分换成字串3後传回.
concat(string string1,string string2,…)
将所有字串相连接後传回.
format-number(string string1,string string2,string string3)
将数字1以字串2中所设定格式传回,而字串3则是local的设定,可不传回.
再看csdn上面一片文章作为最后的补充
现在有一个XML文件,里面有一个字段为日期时间型的,比如为UpdateDateTimes
这时候我想只提取里面的日期和当前的日期的差值小于十天的来显示,这时候XSLT文档要怎么写呢?
回复人:chinahuman(铁匠) ( ) 信誉:111
业务需要,导出了一个XML数据文件,要把它格式化成为一个按日期来分组显示的文件。格式化显示XML文件,最适用的就是XSLT来做为XML的显示模板。查遍了MSDN,发现需要用XPATH的函数来对里面的数据进行判断,根据需要来处理是否让这一组数据显示。所以在里面加入了<xsl:if test="……">……</xsl:if>这样标记来做为一次过滤。因为XPATH里面并没有提供日期的处理函数,并且这个日期的判断比较复杂,所以我就自定义了一个函数来处理,为止,我引入了一个自己的命名空间 xmlns:user="http://mycompany.com/mynamespace",然后在这个空间里面定义自己的函数。好的,以下就是实现过程。
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://mycompany.com/mynamespace"><!--定义自己的命名空间,为下面的自己定义函数提供支持 -->
<msxsl:script language="VBScript" implements-prefix="user"><!-- 引入命名空间,定义自已的函数 -->
<![CDATA[
function CheckDate(nodelist)<!-- 自定义函数-->
……
end function
]]>
</msxsl:script>
<xsl:template match="/">
<HTML>
</head>
<BODY>
<TABLE id= "table1" border="1" style= "border-collapse:collapse" width="650">
<xsl:for-each select="Updates/Update">
<xsl:if test="user:CheckDate(string(DateTime))=1"><!-- 根据返回的结果来判断显示还是不显示 -->
<TR>
<TD width="100">文夹名</TD>
<TD width="550"><xsl:value-of select="FileName" /></TD>
</TR>
…………………………………………………………
</xsl:if>
</xsl:for-each>
</TABLE>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
在代码里面可以看到我先调用了string来转换了XML中DateTime节点的数据类型,因为XML节点中的数据类型可以说是一种变体类型,没有具体的类型,而在这里的脚本函数,即使原来是弱类型的,这时候也会变成强类型,只要数据类型不一致操作就会出错,变体类型的,在里面就没有办法处理,所以先转化成为string,然后在里面再转化成为日期,再做进一步的处理。
同时,发现在XSLT中定义操作的脚本函数时,要用
<![CDATA[
function CheckDate(nodelist)
{
……
}
]]>
这样的形式把函数包围起来,不然会提示找不到函数。