<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>xyin2005的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=xyin2005</link>
<description>xyin2005的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[[收藏]XSL --- 在服务器端的实现 -- 作者：diy930]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5176</link>
<author>xyin2005</author>
<pubDate>2005/4/21 16:43:36</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=8&amp;ID=8899&amp;replyID=19122&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=diy930" target=_blank>diy930</A><BR>以下为原文：<BR><BR><B>XSL --- 在服务器端的实现</B><BR><BR>1.兼容所有的浏览器 
<P></P>
<P>在上面一章我们介绍了可以通过<I>javascript</I>调用浏览器的XML parser(解析软件)来转换XML文档。但是这个方案依然有个问题：如果浏览器没有XML <BR>parser插件怎么办？(注：IE5内自带XML parser) </P>
<P>为了使我们的XML数据能被所有的浏览器正确显示，我们不得不在服务器端将XML转换成纯HTML代码，再输出给浏览器。 </P>
<P>这也是使用XSL的另一个好处。在服务器端将一种格式转换为另一种格式也是XSL的设计目标之一。 </P>
<P>同样，转换工作也将成为未来服务器段的主要工作。 </P>
<P></P>
<P>2.一个具体实例 </P>
<P>下面是我们上面提到的一个XML文档(cd_catalog.xml)例子的部分代码： </P>
<P>&lt;?xml version="1.0" encoding="ISO8859-1" ?&gt; </P>
<P>&lt;CATALOG&gt; </P>
<P>&lt;CD&gt; </P>
<P>&lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt; </P>
<P>&lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt; </P>
<P>&lt;COUNTRY&gt;USA&lt;/COUNTRY&gt; </P>
<P>&lt;COMPANY&gt;Columbia&lt;/COMPANY&gt; </P>
<P>&lt;PRICE&gt;10.90&lt;/PRICE&gt; </P>
<P>&lt;YEAR&gt;1985&lt;/YEAR&gt; </P>
<P>&lt;/CD&gt; </P>
<P>. </P>
<P>. </P>
<P>. </P>
<P></P>
<P>下面是完整的XSL文件(cd_catalog.xsl)： </P>
<P></P>
<P>&lt;?xml version='1.0'?&gt; </P>
<P>&lt;xsl:stylesheet xmlns:xsl="<A class=contentlink href='http://www.w3.org/TR/WD-xsl">' target=_blank>http://www.w3.org/TR/WD-xsl"&gt;</A> </P>
<P>&lt;xsl:template match="/"&gt; </P>
<P>&lt;html&gt; </P>
<P>&lt;body&gt; </P>
<P>&lt;table border="2" bgcolor="yellow"&gt; </P>
<P>&lt;tr&gt; </P>
<P>&lt;th&gt;Title&lt;/th&gt; </P>
<P>&lt;th&gt;Artist&lt;/th&gt; </P>
<P>&lt;/tr&gt; </P>
<P>&lt;xsl:for-each select="CATALOG/CD"&gt; </P>
<P>&lt;tr&gt; </P>
<P>&lt;td&gt;&lt;xsl:<I>value</I>-of select="TITLE"/&gt;&lt;/td&gt; </P>
<P>&lt;td&gt;&lt;xsl:<I>value</I>-of select="ARTIST"/&gt;&lt;/td&gt; </P>
<P>&lt;/tr&gt; </P>
<P>&lt;/xsl:for-each&gt; </P>
<P>&lt;/table&gt; </P>
<P>&lt;/body&gt; </P>
<P>&lt;/html&gt; </P>
<P>&lt;/xsl:template&gt; </P>
<P>&lt;/xsl:stylesheet&gt; </P>
<P></P>
<P>下面是在服务器端转换XML文件为HTML文件的原代码： </P>
<P></P>
<P>&lt;% </P>
<P>'Load the XML </P>
<P>set xml = Server.CreateObject("Microsoft.XMLDOM") </P>
<P>xml.async = false </P>
<P>xml.load(Server.MapPath("cd_catalog.xml")) </P>
<P></P>
<P>'Load the XSL </P>
<P>set xsl = Server.CreateObject("Microsoft.XMLDOM") </P>
<P>xsl.async = false </P>
<P>xsl.load(Server.MapPath("cd_catalog.xsl")) </P>
<P></P>
<P>Response.Write(xml.transformNode(xsl)) </P>
<P>%&gt; </P>
<P></P>
<P>注意：我们这里的例子采用的是ASP文件，用VBScript编写的。如果您不了解ASP或者VBScript，建议阅读有关书籍。(当然，也可以采用其他的语言编写服务器端程序) </P>
<P></P>
<P>第一段代码建立一个Microsoft Parser(XMLDOM)解析的对象，并将XML文档读入内存；第二段代码建立另外一个对象并导入XSL文档；最后一行代码将XML文档用XSL文档转换，并将结果输出到HTML文件中。 <BR><BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=8&amp;ID=8899&amp;replyID=19122&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏] -- 作者：cuimingda]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5174</link>
<author>xyin2005</author>
<pubDate>2005/4/21 15:14:40</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=8&amp;ID=16826&amp;replyID=45100&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=cuimingda" target=_blank>cuimingda</A><BR>以下为原文：<BR><BR><B></B><BR><BR>长见识，嘿嘿，这个可是真是第一次看见。<BR>{Homepage}<BR>&lt;xsl:<I>value</I>-of select="Homepage"/&gt;<BR>两个在任何时候都是等价的吧？
<P></P>
<P>你上边的代码和我原来的效果有点小差别，我帮你完善一下：<BR>
<TABLE class=tableborder1 style="WIDTH: 100%" cellSpacing=1 cellPadding=5>
<TBODY>
<TR>
<TD class=white width="100%"><B>mystyle.xsl</B><BR>&lt;?xml version="1.0" encoding="GB2312"?&gt;<BR>&lt;xsl:stylesheet version="1.0" xmlns:xsl="<A class=contentlink href='http://www.w3.org/1999/XSL/Transform">' target=_blank>http://www.w3.org/1999/XSL/Transform"&gt;</A><BR>&lt;xsl:template match="Books/Book"&gt;<BR>&lt;a href="{Homepage}"&gt;<BR>&lt;img src="{Photo}"/&gt;<BR>&lt;/a&gt;<BR>&lt;/xsl:template&gt;<BR>&lt;/xsl:stylesheet&gt; <BR></TD></TR></TBODY></TABLE><BR></P>
<P><BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=8&amp;ID=16826&amp;replyID=45100&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏]XSL语法介绍 -- 作者：hsower]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5173</link>
<author>xyin2005</author>
<pubDate>2005/4/21 14:35:39</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=8&amp;ID=8379&amp;replyID=17044&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=hsower" target=_blank>hsower</A><BR>以下为原文：<BR><BR><B>XSL语法介绍</B><BR><BR>首先注意到的是，XSL文件本身即是一份 XML文件，所以在XSL文件的开头，一样有和XML文件相同的声明。W3C这个XML的标准机构为XSL定义了很多标记（元素），XSL文件就是这些标记和HTML标记的组合。在XSL文件中，必须有如下一行的代码： 
<P></P>
<P>　　＜xsl:stylesheet xmlns:xsl="<A class=contentlink href='http://www.w3.org/TR/WD-xsl"' target=_blank>http://www.w3.org/TR/WD-xsl"</A>＞ </P>
<P>　　这里，xsl:stylesheet是XSL文件的根元素，在根元素中包含了所有的排版样式，样式表就是由这些排版样式组合成的；xmlns:xsl="<A class=contentlink href='http://www.w3.org/TR/WD-xsl"' target=_blank>http://www.w3.org/TR/WD-xsl"</A>这一句主要用来说明该XSL样式表是使用W3C所制定的XSL，设定值就是XSL规范所在的URL地址。 </P>
<P>　　实际上，这里"<A class=contentlink href='http://www.w3.org/TR/WD-xsl"' target=_blank>http://www.w3.org/TR/WD-xsl"</A>就是一个名字空间（namespace），我们在上面关于XML Schema语法介绍的时候已经进行过介绍。这是一个标准的名字空间。"stylesheet"，"template"，"for-each"等等关键字都是这个名字空间所定义的。 </P>
<P>　　当然在xsl:stylesheet还可以设定其他的属性，其他的属性有： </P>
<P>　　　1． default-space：决定是否保留XML文件中的空白，仅当值为"default"时保留。 </P>
<P>　　　2． indent-result：决定是否保留XSL文件中的空白，值为"yes"时保留。 </P>
<P>　　　3． language：设定在XSL文件中使用的脚本语言。 </P>
<P>　　然后，我们在上面的代码中看到有如下的代码： </P>
<P>　　＜xsl:template match="/"＞ <BR>　　　 ……… <BR>　　＜/xsl:template＞ </P>
<P>　　这里实际上是表示了XSL解析器对XML文档的处理过程，它从根节点（由match="/"决定，这里"/"就表示根节点）开始，对XML文档进行遍历，并根据具体的代码从XML文档中取出相关的内容。这里关于属性match的取值是一个比较复杂的问题。它实际上表示的含义是从XML文档中取出一个特定的节点集合（XML文档可以被看成一个树的结构，这个在后面关于XML解析器分析中有详细的介绍）。这里，我们通过几个简单的例子来说明属性match的取值。 </P>
<P>　　比如下面一行代码： </P>
<P>　　＜xsl:template match="/"＞ </P>
<P>　　这行代码的意思是告诉XSL解析程序，当前需要处理的节点是根节点下的内容（用"/"来表示根节点），其实这里的match值内容的编写是要符合XPath的语意。关于XPath我们在后面的章节中会进行详细的介绍。 </P>
<P>　　再举一个例子： </P>
<P>　　＜xsl:template match="shoppingcart/item"＞ </P>
<P>　　这行代码要匹配的是shoppingcart元素下的item元素。而不管shoppingcart在XML文档结构树下的哪一个位置。比如XML文档的其中一段是这样的。 </P>
<P>　　＜shoppingcart＞ <BR>　　＜item＞ <BR>　　＜itemNo＞3333＜/itemNo＞ <BR>　　＜itemName＞屠龙刀＜/itemName＞ <BR>　　＜/item＞ <BR>　　＜item＞ <BR>　　＜itemNo＞4444＜/itemNo＞ <BR>　　＜itemName＞离别钩＜/itemName＞ <BR>　　＜/item＞ <BR>　　＜/shoppingcart＞ </P>
<P>　　那么它匹配的内容就是 <BR>　　　＜item＞ <BR>　　　＜itemNo＞3333＜/itemNo＞ <BR>　　　＜itemName＞屠龙刀＜/itemName＞ <BR>　　　＜/item＞ <BR>　　　＜item＞ <BR>　　　＜itemNo＞4444＜/itemNo＞ <BR>　　　＜itemName＞离别钩＜/itemName＞ <BR>　　　＜/item＞ </P>
<P>　　而下面这个例子： </P>
<P>　　＜xsl:template match="/shoppingcart/item"＞ </P>
<P>表示只匹配XML文档根节点下的shoppingcart这个节点下的所有item元素。也就是说如果shoppingcart不是直接在根节点下的，它就不符合这个匹配条件。 </P>
<P>　　再看一个例子： </P>
<P>　　＜xsl:template match="price[@unit='USD']"＞ </P>
<P>这个例子说明要匹配的是这样的节点：一个带unit属性的元素price，而且unit的值必须为"USD"。比如一段XML代码是这样的。 </P>
<P>　　＜price＞ <BR>　　　＜unit＞USD＜/unit＞ <BR>　　　＜amount＞100＜/amount＞ <BR>　　＜/price＞ <BR>　　＜price＞ <BR>　　　＜unit＞RMB＜/unit＞ <BR>　　　＜amount＞300＜/amount＞ <BR>　　＜/price＞ </P>
<P>　　那么它匹配的内容就是： </P>
<P>　　＜price＞ <BR>　　　＜unit＞USD＜/unit＞ <BR>　　　＜amount＞100＜/amount＞ <BR>　　＜/price＞ </P>
<P>　　实际上，存在许多各种符号用来表示匹配规则，我们在XPath语法介绍中会详细涉及到。现在知道这么一个大概的概念就可以了。 </P>
<P>　　我们用＜xsl:template match="具体匹配表达式"＞这条语句找到了一些节点集合以后，我们就要从这个集合中找到特定的元素或者元素属性的值，那么采用什么语句呢？就是用xsl:<I>value</I>-of select = ""这样的语句来寻找特定的内容。 </P>
<P>　　比如下面的例子中＜xsl:<I>value</I>-of select="名称"/＞这行代码就是表示定位XML文档中的名称元素的内容。在指定集合中可能存在多个名字元素，如果我们需要把它们一一列举出来进行处理的话，就需要用到语句xsl:for-each select = ""，注意这里涉及到一个作用范围的概念，也就是说xsl:for-each select = ""这条语句是在一个指定的集合空间中执行的。比如上面例子中如下的代码 </P>
<P>　　这里的＜xsl:for-each select="词语"＞是在＜xsl:template match="网络用语集合"＞所指定的集合空间里面寻找元素"词语"的。 </P>
<P>　　同时，我们需要注意的是上面的代码中，出现了一条语句 </P>
<P>　　　＜xsl:apply-templates select="网络用语集合" /＞ </P>
<P>　　它表示什么意思呢，它实际上相当于C++中的一个过程调用，当XSL解析器执行到该语句的时候，它就会在代码中寻找以＜?xml:namespace prefix = xsl /＞＜xsl:template match="网络用语集合"＞开头的代码，所以在上面的例子程序中，以下的代码可以看成是过程的实现。 </P>
<P>　　 <BR>　　把看成是一个过程调用，把＜xsl:template match="网络用语集合"＞ </P>
<P>　　……. <BR>　　＜/xsl:template＞ </P>
<P>　　看成是过程的实现，有助于我们对XSL解析器执行过程的理解。这里match="网络用语集合"可以理解为是传递给过程的参数，它表示过程实现体的集合范围是该match所匹配的节点集合空间（"网络用语集合"）。 </P>
<P>　　如果我们要对表格中的元素进行排序该什么办呢？比如说，在上面的例子中，我们需要按照名称进行排序。很简单对，改写为如下的形式即可： </P>
<P>　　＜xsl:for-each select="词语" order-by="+名称"＞，其中"+"表示按降序排列；"-"表示按升序排列。"order-by"是XSL语法中的关键字。 </P>
<P>　　如果我们只想在列表中取出某几行该怎么操作呢？比如我们只想取出名称为"恐龙"的行，见下面的代码： </P>
<P>　　这里有一个新的句法为：＜xsl:template match="网络用语集合"＞ <BR>　　＜table Border="1"＞ <BR>　　　＜xsl:for-each select="词语" order-by="-名称"＞ <BR>　　　＜xsl:if test=".[名称='恐龙']"＞ <BR>　　　＜tr＞ <BR>　　　　＜td＞＜xsl:<I>value</I>-of select="名称"/＞＜/td＞ <BR>　　　　＜td＞＜xsl:<I>value</I>-of select="含义"/＞＜/td＞ <BR>　　　＜/xsl:if＞ <BR>　　　＜/xsl:for-each＞ <BR>　　＜/table＞ <BR>　　＜/xsl:template＞ </P>
<P>　　 </P>
<P>　　它表示如果".[名称='恐龙']"为真（TRUE）的话，就执行该段里面的语句，要是为假（FALSE）的话就不执行。它和C++中的if语句的概念基本是一样的。 </P>
<P>　　前面我们用＜xsl:<I>value</I>-of select=""/＞取出的都是一个元素的值，但是我们要取出元素某一个属性的值该怎么做呢？采用下面的形式： </P>
<P>　　＜xsl:<I>value</I>-of select="元素名称/@属性名称"/＞ </P>
<P>　　比如一段XML代码是这样的： </P>
<P>　　＜王朔 网址="<A class=contentlink href="http://www.wangshuo.com/" target=_blank contentlink>www.wangshuo.com</A>"＞知名作家加著名评论家王朔先生的地方＜/王朔＞ </P>
<P>　　我们可以用＜xsl:<I>value</I>-of select="王朔/@网址"/＞来得到值"<A class=contentlink href="http://www.wangshuo.com/" target=_blank contentlink>www.wangshuo.com</A>"。 </P>
<P>　　以上包括了XSL的大多数基本的语法，更加详细和完整的介绍需要参看W3C相关的最新的文档，可以<A class=contentlink href="http://www.w3c.org/TR" target=_blank contentlink>WWW.W3C.ORG/TR</A>下找到。 </P>
<P>　　根据上面的分析，我们可以看到XSL实际上采用的是一种转换的思想，它最终将XML文档转换为另一种可用于输出的文档，而CSS则没有任何转换动作，在整个过程中没有任何新码产生。 另外，在XSL中90%的样式规定在CSS中都有定义，但仍然有一些效果是CSS无法描述的，必须使用XSL不可。这些功能包括文本的置换、根据文本内容决定显示方式、文档内容排序等，都是XSL所独有的。再者，XSL遵从XML的语法，而CSS的语法自成体系。 </P>
<P>　　选择样式单还要考虑不同浏览器对样式单的支持程度。目前IE5与Netscape的最新版本都支持CSS，但支持的程度都有限。至今为止，IE5尚不能完全支持CSS1，即便是支持的部分也存在很多错误，对于CSS2也只提供部分支持。Netscape在对CSS的支持上已经优于IE5，它采用新一代的Raptor/Gecko引擎技术，已经能够完全支持CSS1，但对CSS2的支持计划尚不明朗。而对XSLT而言，只有IE5支持，Netscape5并不支持。 <BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=8&amp;ID=8379&amp;replyID=17044&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏]新手学习XSL的好东西 -- 作者：孤独]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5163</link>
<author>xyin2005</author>
<pubDate>2005/4/21 10:44:44</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=8&amp;ID=6411&amp;replyID=10182&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=孤独" target=_blank>孤独</A><BR>以下为原文：<BR><BR><B>新手学习XSL的好东西</B><BR><BR><A class=contentlink href="http://home.zdjw.gov.cn/schools/zdsyzx/gudu/xml/Article_show.htm?Article_id=16" target=_blank>http://home.zdjw.gov.cn/schools/zdsyzx/gudu/xml/Article_show.htm?Article_id=16</A><BR>有链接的页面还得看上面:)<BR>学XSL（一） (二） （三） （四） （五） （六） （七） （八） （返回） 
<P></P>
<P>2000-05-03· 禹希初·CPCW</P>
<P>第一个XML文档</P>
<P>　　随着Internet的发展，越来越多的信息进入互联网，信息的交换、检索、保存及再利用等迫切的需求使HTML这种最常用的标记语言已越来越捉襟见肘。HTML将数据内容与表现融为一体，可修改性、数据可检索性差，而XML借鉴了HTML与数据库、程序语言的优点，将内容与表现分开，不仅使检索更为方便，更主要的是用户之间数据的交换更加方便，可重用性更强。</P>
<P>　　XML是一种元标记语言，没有许多固定的标记，为WEB开发人员提供了更大的灵活性。当我们使用HTML时，标记只是简单的表示内容的显示形式，而与表示的内容没有任何关联，为文档的进一步处理带来极大的不便。比如要表示个人简历，用HTML的表示方式如下： </P>
<P>&lt; HTML &gt;</P>
<P>&lt; BODY &gt;</P>
<P>&lt; TABLE border=1 cellspacing=0 &gt;</P>
<P>&lt; TH &gt;姓名&lt; TD &gt;禹希初&lt; TH &gt;性别&lt; TD &gt;男&lt; TH &gt;生日&lt; TD &gt;1977.5</P>
<P>&lt; TR &gt;</P>
<P>&lt; TH &gt;技能&lt; TD colspan=5 &gt;数据库设计与维护、WEB开发</P>
<P>&lt; /TABLE &gt;</P>
<P>&lt; /BODY &gt;</P>
<P>&lt; /HTML &gt;</P>
<P>　　在这里，我们无法从标记TH、TD得知其内容表示什么，如果用XML，相应的文档（文件名：个人简历.xml）就可写成如下形式： </P>
<P>&lt; ?xml version="1.0" encoding="GB2312"? &gt;</P>
<P>&lt; resume &gt;</P>
<P>&lt; name &gt;禹希初&lt; /name &gt;</P>
<P>&lt; sex &gt;男&lt; /sex &gt;</P>
<P>&lt; birthday &gt;1977.5&lt; /birthday &gt;</P>
<P>&lt; skill &gt;数据库设计与维护、WEB开发&lt; /skill &gt;</P>
<P>&lt; /resume &gt;</P>
<P>说明：</P>
<P>　　version──规定了XML文档的版本，此处只能是1.0；</P>
<P>　　encoding── 此处规定了XML文档的编码类型，此处取值为“GB2312”，也就是“简体中文”。</P>
<P>　　对比两例，使用XML我们可以做到自定义标记，用标记表明内容的含义。这样在Internet上交流资料时，为用计算机处理文档提供了极大的方便，同时我们阅读源文件时也不会被一大堆格式弄得晕头转向。</P>
<P>　　然而，由于XML并没有为标记规定显示方式，如果我们在游览器中查看以上两个文档（建议使用IE5.0或更新版本），我们将看到xml文档并没有以诸如表格的方式来显示。难道我们就不能像HTML一样显示文档吗？回答是否定的。以个人简历为例，需要另建一个格式文件说明各个标记的显示方式，其内容如下（假设文件名为resume.css）： </P>
<P>resume{ display: block;}</P>
<P>name{ display: block; font-size:120%;}</P>
<P>sex{ display:block; text-indent:2em}</P>
<P>birthday{ display:block; text-indent:2em}</P>
<P>skill{ display:block; text-indent:2em}</P>
<P>说明：</P>
<P>　　以上均为CSS样式，建议读者参考有关资料熟悉CSS，在以后学习中必须用到，此处由于篇幅关系不作介绍。建立文件resume.css后，在个人简历.xml文件的第一行后添加以下文字： </P>
<P>&lt; ?xml:stylesheet type="text/css" href="resume.css"? &gt;</P>
<P>说明：</P>
<P>　　此处表示引用一个外部CSS样式文件，其中type规定样式类型（可取值为text/css或text/xsl），href规定文件路径。</P>
<P>　　保存文件，再以IE5.0打开文件。怎么样？格式有些不一样吧。好象还不令人满意，文档内容是清晰了，但显示效果比HTML编写的文档就差得多了，XML编写的文档就只能以这种方式显示吗？！</P>
<P>提示：</P>
<P>　　1. 为了更好的理解与掌握XML，建议大家熟悉HTML 4.0与CSS 2.0语法；掌握<I>javascript</I>、VBscript中至少一种；编程经验、对数据库理论与SQL的了解均能使大家在学习XML时获益。</P>
<P>　　2. XML文档中标记必须成对出现，如果是空标记也必须有前加“/”的同名标记结束，或使用此种文式&lt; xml_mark/ &gt;表示空标记。</P>
<P>　　3. XML以及下周将要介绍的XSL文档，属性值必须用双引号（"）或单引号（'）括起来。</P>
<P>　　4. XML文档必须是好结构的（XSL文档也是XML文档中一种），也就是说标记必须有结束标记、标记可以嵌套但不可交叉，如 </P>
<P>&lt; outer &gt;&lt; inner &gt;&lt; /inner &gt;&lt; inner/ &gt;&lt; /outer &gt;</P>
<P>是合法的，而下面的形式 </P>
<P>&lt; outer &gt;&lt; inner &gt;&lt; /outer &gt;&lt; /inner &gt;</P>
<P>则是错误的。如果XML文档在浏览时出错，多半是违反了上面提到的规则。</P>
<P>跟我学XSL（二）（返回标题）</P>
<P>2000-05-04· 禹希初·CPCW</P>
<P>XSL入门</P>
<P>　　上期我们讲到用CSS（层叠样式表）来格式化XML文档，其效果并不很令人满意。实际上CSS用来格式化HTML标记比较合适些，只是因为它简单才在上例中采用。</P>
<P>　　XML在更多的时候只是一种数据文件，怎样将它变为我们日常所看到的HTML格式那样的文件呢？如果我们将XML文件比作结构化的原料的话，那么XSL就好比“筛子“与“模子“，筛子选取自己需要的原料，这些原料再通过模子形成最终的产品：HTML。</P>
<P>　　这个模子大致是这样：我们先设计好表现的页面，再将其中需要从XML中获取数据来填充内容的部分“挖掉“，然后用XSL语句从XML中筛出相关的数据来填充。一言以譬之：这XSL实际上就是HTML的一个“壳子“，XML数据利用这个“壳“来生成“传统“的HTML。</P>
<P>　　XML在展开时是一个树形结构，我们将树形结构中自定义标记称为节点，节点之间存在父子、兄弟关系，我们要访问其中的结点从根结点就要以”／”来层层进入。</P>
<P>　　在XSL这个壳中，我们要从原料库？？XML里提取相关的数据，就要用到XSL提供的模式化查询语言。所谓模式化查询语言，就是通过相关的模式匹配规则表达式从XML里提取数据的特定语句，即我们上所说的“筛子“。</P>
<P>参考微软的”XSL开发者指南”，我们大致可将模式语言分为三种： </P>
<P>选择模式 </P>
<P>&lt; xsl:for-each &gt;、&lt; xsl:<I>value</I>-of &gt;,和 &lt; xsl:apply-templates &gt;</P>
<P>测试模式 </P>
<P>&lt; xsl:if &gt; 和&lt; xsl:when &gt;</P>
<P>匹配模式 </P>
<P>&lt; xsl:template &gt; </P>
<P>我们现在就分别对之进行介绍。</P>
<P>一、 选择模式</P>
<P>　　选择模式语句将数据从XML中提取出来，是一种简单获得数据的方法，这几个标记都有一个select属性，选取XML中特定的结点名的数据。 </P>
<P>1、&lt; xsl:for-each &gt;</P>
<P>如在XML中有这样的数据:</P>
<P>&lt; author &gt;</P>
<P>&lt; name &gt;小禹&lt; /name &gt;</P>
<P>&lt; name &gt;春华&lt; /name &gt;</P>
<P>&lt; name &gt;秋实&lt; /name &gt;</P>
<P>&lt; /author &gt;</P>
<P>　　我们要读取这三个作者名字，是一个一个地按”author/name”方法来读取吗，可有多个这样的name呀？如果有一种程序性的语句来循环读取有多好啊！</P>
<P>　　想得很对，XSL提供了这样的具有程序语言性质的语句&lt; XSL:for-each &gt;</P>
<P>　　用它读取这三个作者名字的方法如下:</P>
<P>&lt; xsl:for-each select=”author/name” &gt;</P>
<P>…….</P>
<P>&lt; ./xsl:for-each &gt;</P>
<P>select，顾名思义：选取，它可以选定XML中特定唯一的标记，也可以选择某一类相同的标记，我们称之为结点集。 </P>
<P>语法： </P>
<P>&lt; xsl:for-each select="pattern" order-by="sort-criteria-list"&gt;</P>
<P>属性： </P>
<P>1. select</P>
<P>　　根据XSL样式查询考察上下文以决定哪类结点集（满足select条件）使用此样式描述。作为一种简化的表示就是，如果你想对文档中的某一种标记的内容的显示方式进行格式化，就可以将让select等于此元素的标记名。例如欲对标记xml_mark进行格式化，即可用如下方式表示： </P>
<P>&lt; xsl:for-each select="xml_mark" &gt;</P>
<P>&lt; !--样式定义-- &gt;</P>
<P>&lt; /xsl:for-each &gt;</P>
<P>2. order-by</P>
<P>　　以分号（;）分隔、作为排序标准的列表。在列表元素前添加加号（+）表示按此标记的内容以升序排序，添加减号（-）表示逆序排序。作为一种简化的表示就是，排序标准列表就是由select规定的标记的子标记的序列，每个标记之间以（;）分隔。 </P>
<P>2、&lt; xsl:<I>value</I>-of &gt;</P>
<P>&lt; xsl:for-each &gt;模式只是选取节点，并没有取出节点的值，好比猴子只是爬到了树的某个枝干上，那么就用&lt; xsl:<I>value</I>-of &gt;来摘“胜利果实“吧！ </P>
<P>语法： </P>
<P>&lt; xsl:<I>value</I>-of select="pattern" &gt;提取节点的值 </P>
<P>属性： </P>
<P>select用来与当前上下文匹配的XSL式样。简单的讲，如果要在XSL文档某处插入某个XML标记（假定是xml_mark标记）的内容，可用如下方式表示： </P>
<P>&lt; xsl:<I>value</I>-of select="xml_mark" &gt;&lt; /xsl:<I>value</I>-of &gt;</P>
<P>或 </P>
<P>&lt; xsl:<I>value</I>-of select="xml_mark"/ &gt;</P>
<P>示例：</P>
<P>　　此处仍以上期的个人简历的作为例子，我们需要对文件（个人简历.xml）作一定修改，确切的说是将其中的第二行 </P>
<P>&lt; ?xml:stylesheet type="text/css" href="resume.css"? &gt;</P>
<P>修改为 </P>
<P>&lt; ?xml:stylesheet type="text/xsl" href="resume.xsl"? &gt;</P>
<P>然后建立一个新文件：resume.xsl，其内容如下： </P>
<P>&lt; ?xml version="1.0" encoding="GB2312"? &gt;</P>
<P>&lt; HTML xmlns:xsl="<A class=contentlink href='http://www.w3.org/TR/WD-xsl"' target=_blank>http://www.w3.org/TR/WD-xsl"</A> &gt;</P>
<P>&lt; HEAD &gt;</P>
<P>&lt; TITLE &gt;个人简历&lt; /TITLE &gt;</P>
<P>&lt; /HEAD &gt;&lt; BODY &gt; </P>
<P>&lt; xsl:for-each select="resume" &gt;</P>
<P>&lt; P/ &gt;</P>
<P>&lt; TABLE border="1" cellspacing="0" &gt;</P>
<P>&lt; CAPTION style="font-size: 150%; font-weight: bold" &gt;</P>
<P>个人简历 </P>
<P>&lt; /CAPTION &gt;</P>
<P>&lt; TR &gt;</P>
<P>&lt; TH &gt;姓名&lt; /TH &gt;&lt; TD &gt;&lt; xsl:<I>value</I>-of select="name"/ &gt;&lt; /TD &gt;</P>
<P>&lt; TH &gt;性别&lt; /TH &gt;&lt; TD &gt;&lt; xsl:<I>value</I>-of select="sex"/ &gt;&lt; /TD &gt;</P>
<P>&lt; TH &gt;生日&lt; /TH &gt;&lt; TD &gt;&lt; xsl:<I>value</I>-of select="birthday"/ &gt;&lt; /TD &gt;</P>
<P>&lt; /TR &gt;</P>
<P>&lt; TR &gt;</P>
<P>&lt; TH &gt;技能&lt; /TH &gt;&lt; TD colspan="5" &gt;&lt; xsl:<I>value</I>-of select="skill"/ &gt;&lt; /TD &gt;</P>
<P>&lt; /TR &gt;</P>
<P>&lt; /TABLE &gt;</P>
<P>&lt; /xsl:for-each &gt;</P>
<P>&lt; /BODY &gt;</P>
<P>&lt; /HTML &gt;</P>
<P>　　完成这些以后再来让我们看一下辛勤劳动的成果，怎么样？效果不错吧。更酷还在后头呢。现在我们对文件（个人简历.xml）作进一步的修改： </P>
<P>1. 在标记&lt; resume &gt;前添加一个新标记&lt; document &gt;； </P>
<P>2. 将标记对&lt; resume &gt;&lt; /resume &gt;之间的内容（包括这一对标记）复制并粘贴在其后，并在最后用&lt; document &gt;结束。 </P>
<P>3. 以Notepad.exe打开文件resume.xsl，在标记&lt; HTML &gt;之后添加文字：&lt; xsl:for-each select="document" &gt;；在标记&lt; /HTML &gt;之前添加文字：&lt; /xsl:for-each &gt;，保存文件。</P>
<P>4. 在浏览器中打开文件（个人简历.xml）。看到了什么？两份个人简历！</P>
<P>　　就这样，利用XML我们可以编写内容与样式完成分离的文档！当然，XSL文件比一般的HTML文件要复杂一些，然而一旦完成则可用于格式化所有同类的XML文档。</P>
<P>注：如果拷贝代码，请将空格删除 </P>
<P>跟我学XSL（三） （返回标题） </P>
<P>2000-05-05· 禹希初·CPCW</P>
<P>XSL模板与匹配模式</P>
<P>　　经过前几日的学习，我们学习了XHTML文档的编写和以及三个XSL元素，已能编写相当灵活的XSL文档，今天将学习的是XSL模板的编写。我们都知道，短的文档、程序十分好读，但当规模增大后，其复杂性也以更快的速度增加。</P>
<P>　　前面我们学了&lt; xsl:for-each &gt;、&lt; xsl:<I>value</I>-of &gt;等，可以用它们对XML数据实现简单的格式化输出，但如果遇到比较复杂的XML格式输出，将XSL按照要求依次写下来的话，一是设计困难，可扩展性差，不利于人员之间的分工协作；另则，可修改性很差，可能会出现牵一发而动全军的情况，不利于维护。程序中模块化设计逐步细化的方法在这里得到了应用！ </P>
<P>　　XSL模板将XSL的设计细化成一个个模板（块），最后再将这些模板（块）组合成一个完整的XSL；好比船与集装箱，我们不是将所有的货物一件件地堆起来，而是装在各自的集装箱中，然后再在船上将这些集装箱堆放起来。这种方法可以使你先从整体上考虑整个XSL的设计，然后将一些表现形式细化成不同的模块，再具体设计这些模块，最后将它们整合在一起，这样，将宏观与微观结合起来，符合人们条理化、规范化要求。</P>
<P>装集装箱？？书写模板（块）：&lt; xsl:template &gt;</P>
<P>&lt; xsl:template &gt;</P>
<P>语法： </P>
<P>&lt; xsl:template match="node-context" language="language-name" &gt;</P>
<P>属性： </P>
<P>match ── 确定什么样的情况下执行此模板。作为一种简化的说明，在此处使用标记的名字；其中最上层模板必须将match设为“/”</P>
<P>language ── 确定在此模板中执行什么脚本语言，其取值与HTML中的SCRIPT标记的LANGUAGE属性的取值相同，缺省值是Jscript</P>
<P>&lt; xsl:template &gt;用match属性从XML选取满足条件的节点，征对这些特定的节点形成一个特定输出形式的模板。</P>
<P>吊集装箱上船-？？调用模板（块）：&lt; xsl:apply-templates &gt;</P>
<P>&lt; xsl:apply-templates &gt;</P>
<P>语法： </P>
<P>&lt; xsl:apply-templates select="pattern" order-by="sort-criteria-list" &gt;</P>
<P>属性： </P>
<P>select ── 确定在此上下文环境中应执行什么模板，即选取用&lt; xsl:template &gt;标记建立的模板（块）。 </P>
<P>order-by ── 以分号（;）分隔的排序标准，通常是子标记的序列</P>
<P>示例：</P>
<P>　　以个人简历为例，为便于处理我们希望“技能”中每一项都用标记对&lt; skill &gt;&lt; /skill &gt;括起来，有多少项技能就有多少个这种标记对，经过修改后的个人简历XML文档内容如下： </P>
<P>&lt; ?xml version="1.0" encoding="GB2312"? &gt;</P>
<P>&lt; ?xml:stylesheet type="text/xsl" href="resume_template.xsl"? &gt;</P>
<P>&lt; document &gt;</P>
<P>&lt; resume &gt;</P>
<P>&lt; name &gt;禹希初&lt; /name &gt;</P>
<P>&lt; sex &gt;男&lt; /sex &gt;</P>
<P>&lt; birthday &gt;1977.5&lt; /birthday &gt;</P>
<P>&lt; skill &gt;数据库设计与维护&lt; /skill &gt;</P>
<P>&lt; skill &gt;WEB开发&lt; /skill &gt;</P>
<P>&lt; /resume &gt;</P>
<P>&lt; /document &gt;</P>
<P>　　然后，建立一个新XSL文件resume_template.xsl，采用模板的形式，其内容如下： </P>
<P>&lt; ?xml version="1.0" encoding="GB2312"? &gt;</P>
<P>&lt; xsl:stylesheet xmlns:xsl="<A class=contentlink href='http://www.w3.org/TR/WD-xsl"' target=_blank>http://www.w3.org/TR/WD-xsl"</A> &gt;</P>
<P>&lt; !--根模板-- &gt;</P>
<P>&lt; xsl:template match="/" &gt;</P>
<P>&lt; HTML &gt;&lt; HEAD &gt;&lt; TITLE &gt;个人简历&lt; /TITLE &gt;&lt; /HEAD &gt;</P>
<P>&lt; BODY &gt;</P>
<P>&lt; xsl:apply-templates select="document/resume"/ &gt;</P>
<P>&lt; /BODY &gt;</P>
<P>&lt; /HTML &gt;</P>
<P>&lt; /xsl:template &gt;</P>
<P>&lt; !--简历模板-- &gt;</P>
<P>&lt; xsl:template match="resume" &gt;</P>
<P>&lt; TABLE border="1" cellspacing="0" &gt;</P>
<P>&lt; CAPTION &gt;个人简历（ </P>
<P>&lt; xsl:eval &gt;formatIndex(childNumber(this), "I")&lt; /xsl:eval &gt;</P>
<P>）&lt; /CAPTION &gt;</P>
<P>&lt; xsl:apply-templates select="name" / &gt;</P>
<P>&lt; xsl:apply-templates select="sex" / &gt;</P>
<P>&lt; xsl:apply-templates select="birthday" / &gt;</P>
<P>&lt; TR/ &gt;</P>
<P>&lt; TD &gt;技能&lt; /TD &gt;&lt; TD COLSPAN="5" &gt;</P>
<P>&lt; TABLE cellspacing="0" &gt;</P>
<P>&lt; xsl:apply-templates select="skill"/ &gt;</P>
<P>&lt; /TABLE &gt;</P>
<P>&lt; /TD &gt;</P>
<P>&lt; /TABLE &gt;</P>
<P>&lt; BR/ &gt;</P>
<P>&lt; /xsl:template &gt;</P>
<P>&lt; !--姓名模板-- &gt;</P>
<P>&lt; xsl:template match="name" &gt;&lt; TD &gt;姓名&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:<I>value</I>-of/ &gt;&lt; /TD &gt;</P>
<P>&lt; /xsl:template &gt;</P>
<P>&lt; !--性别模板-- &gt;</P>
<P>&lt; xsl:template match="sex" &gt;&lt; TD &gt;性别&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:<I>value</I>-of/ &gt;&lt; /TD &gt;</P>
<P>&lt; /xsl:template &gt;</P>
<P>&lt; !--生日模板-- &gt;</P>
<P>&lt; xsl:template match="birthday" &gt;&lt; TD &gt;生日&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:<I>value</I>-of/ &gt;&lt; /TD &gt;</P>
<P>&lt; /xsl:template &gt;</P>
<P>&lt; !--技能模板-- &gt;</P>
<P>&lt; xsl:template match="skill" &gt;</P>
<P>&lt; TR &gt;&lt; TD &gt;&lt; xsl:<I>value</I>-of/ &gt;&lt; /TD &gt;&lt; /TR &gt;</P>
<P>&lt; /xsl:template &gt;</P>
<P>&lt; /xsl:stylesheet &gt;</P>
<P>　　保存文件，打开文件（个人简历.xml），效果令人满意吧。其实要做到同样的效果，用前面三周介绍的方法也可做，但你得把它作为一整体考虑。</P>
<P>　　在上面的XSL文件中，我们将性别、生日、技能等数据项分别用模板来单独写，再用&lt; xsl:apply-template &gt;来调用，这样，即使你日后要对这些模板作相应的修改与扩充也很方便，不致于出现互相干扰、混杂不清的情况。这种从上至下、逐层细化的设计方法，极大地减少工作复杂程度，也大大减少了差错的产生，可以实现多人的协作设计。</P>
<P>注意：</P>
<P>　　如果XML文档中不同标记有同名的子标记，在为其编写模板时，应把父标记作为其前缀，格式为（parent_mark/child_mark）。</P>
<P>　　模板文件必须有一个根模板，其属性match是“/”。</P>
<P>注：如果拷贝源代码，请将空格删除 </P>
<P>跟我学XSL（四） （返回标题） </P>
<P>2000-05-06· 禹希初·CPCW</P>
<P>测试模式 </P>
<P>　　XML技术的优势之一就在于数据输出的可选择性，即选择需要的数据输出。前面我们所讲到的选择模式语句:&lt;xsl:for-each&gt;、&lt;xsl:<I>value</I>-of&gt;及&lt;xsl:apply-template&gt;只是简单的选取通过”/”符号层层到达的节点，如果我们对XML数据不需要全部输出，而只需要其中的满足某条件的部分数据，“萝卜青菜、各取所需“，那么条件判断&lt;xsl:if&gt;与多条件判断&lt;xsl:choose&gt;及&lt;xsl:when&gt;则迎合了这种需要，如果你对程序设计熟悉的话，会觉得它们似曾相识。 </P>
<P>XSL中的IF，首先，介绍XSL元素&lt;xsl:if&gt;的语法结构： </P>
<P>&lt;xsl:if&gt; </P>
<P>语法： </P>
<P>&lt;xsl:if expr="script-expression" language="language-name" test="pattern"&gt; </P>
<P>属性： </P>
<P>　　expr ──脚本语言表达式，计算结果为“真”或“假”；如果结果为“真”，且通过test，则在输出中显示其中内容（可省略此项属性）。 </P>
<P>　　language ──expr属性中表达式的脚本语言类型，其取值与HTML标记SCRIPT的LANGUAGE属性的取值相同，缺省为“JScript”test ──源数据测试条件。 </P>
<P>示例： </P>
<P>此处以一份报表为例，文件名为report.xml，其内容如下： </P>
<P>&lt;?xml version="1.0" encoding="GB2312"?&gt; </P>
<P>&lt;?xml:stylesheet type="text/xsl" href="report.xsl"?&gt; </P>
<P>&lt;document&gt; </P>
<P>&lt;report&gt; </P>
<P>&lt;class&gt; </P>
<P>甲班 </P>
<P>&lt;/class&gt;&lt;q1&gt;50&lt;/q1&gt;&lt;q2&gt;70&lt;/q2&gt; </P>
<P>&lt;q3&gt;30&lt;/q3&gt;&lt;q4&gt;10&lt;/q4&gt;&lt;/report&gt; </P>
<P>&lt;report&gt;&lt;class&gt; </P>
<P>乙班 </P>
<P>&lt;/class&gt;&lt;q1&gt;20&lt;/q1&gt;&lt;q2&gt;30&lt;/q2&gt; </P>
<P>&lt;q3&gt;40&lt;/q3&gt;&lt;q4&gt;50&lt;/q4&gt;&lt;/report&gt; </P>
<P>&lt;report&gt;&lt;class&gt; </P>
<P>丙班 </P>
<P>&lt;/class&gt;&lt;q1&gt;70&lt;/q1&gt;&lt;q2&gt;40&lt;/q2&gt; </P>
<P>&lt;q3&gt;20&lt;/q3&gt;&lt;q4&gt;10&lt;/q4&gt;&lt;/report&gt; </P>
<P>&lt;/document&gt; </P>
<P>　　我们采用XSL模板结合今天所学的&lt;xsl:if&gt;，为其编写一个XSL文档，要求季度产量小于等于20的用红色表示，文件名为report.xsl，内容如下： </P>
<P>&lt;?xml version="1.0" encoding="GB2312"?&gt; </P>
<P>&lt;xsl:stylesheet xmlns:xsl="<A class=contentlink href='http://www.w3.org/TR/WD-xsl">' target=_blank>http://www.w3.org/TR/WD-xsl"&gt;</A> </P>
<P>&lt;xsl:template match="/"&gt; </P>
<P>&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;1999年生产统计&lt;/TITLE&gt;&lt;/HEAD&gt; </P>
<P>&lt;BODY&gt;&lt;xsl:apply-templates select="document ;"/&gt;&lt;/BODY&gt; </P>
<P>&lt;/HTML&gt; </P>
<P>&lt;/xsl:template&gt; </P>
<P>&lt;xsl:template match="document"&gt; </P>
<P>&lt;H3&gt;1999年生产统计&lt;/H3&gt; </P>
<P>&lt;TABLE　border="1" cellspacing="0"&gt; </P>
<P>&lt;TH&gt;班组&lt;/TH&gt;&lt;TH&gt; </P>
<P>一季度 </P>
<P>&lt;/TH&gt;&lt;TH&gt; </P>
<P>二季度 </P>
<P>&lt;/TH&gt; </P>
<P>&lt;TH&gt; </P>
<P>三季度 </P>
<P>&lt;/TH&gt;&lt;TH&gt; </P>
<P>四季度 </P>
<P>&lt;/TH&gt; </P>
<P>&lt;xsl:apply-templates select="report"/&gt; </P>
<P>&lt;/TABLE&gt; </P>
<P>&lt;/xsl:template&gt; </P>
<P>&lt;xsl:template match="report"&gt; </P>
<P>&lt;TR&gt; </P>
<P>&lt;TD&gt;&lt;xsl:<I>value</I>-of select="class"/&gt;&lt;/TD&gt; </P>
<P>&lt;TD&gt;&lt;xsl:apply-templates select="q1"/&gt;&lt;/TD&gt; </P>
<P>&lt;TD&gt;&lt;xsl:apply-templates select="q2"/&gt;&lt;/TD&gt; </P>
<P>&lt;TD&gt;&lt;xsl:apply-templates select="q3"/&gt;&lt;/TD&gt; </P>
<P>&lt;TD&gt;&lt;xsl:apply-templates select="q4"/&gt;&lt;/TD&gt; </P>
<P>&lt;/TR&gt; </P>
<P>&lt;/xsl:template&gt; </P>
<P>&lt;xsl:template match="q1|q2|q3|q4"&gt; </P>
<P>&lt;!--此处测试产量，如小于等于20则添加一STYLE属性color，其值为red（红色）--&gt; </P>
<P>&lt;xsl:if test=".[<I>value</I>() $le$ 20]"&gt; </P>
<P>&lt;xsl:attribute name="style"&gt;color:red&lt;/xsl:attribute&gt; </P>
<P>&lt;/xsl:if&gt; </P>
<P>&lt;xsl:<I>value</I>-of/&gt; </P>
<P>&lt;/xsl:template&gt; </P>
<P>&lt;/xsl:stylesheet&gt; </P>
<P>说明： </P>
<P>q1|q2|q3|q4 ──标记q1、q2、q3、q3均用此模板确定输出 </P>
<P>$le$ ──是关系运算符中的“小于等于”，其它关系有小于（$lt$）、大于（$gt$）、大于等于（$ge$）、等于（$eq$）、不等于（$ne$）等 </P>
<P>. ──表示引用当前标记 </P>
<P>[ ] ──表示筛选，只有满足筛选条件的标记才能被选取 </P>
<P><I>value</I>() ──XSL函数，其他常用XSL函数有text()、end()、index()等。 </P>
<P>　　下期，我们将学习XSL的另外三个元素，可对同一数据进行多次测试，根据不同条件产生相应输出。 </P>
<P>跟我学XSL（五） （返回标题） </P>
<P>2000-05-07· 禹希初·CPCW</P>
<P>XSL中的choose</P>
<P>　　上期我们学习了XSL元素&lt; xsl:if &gt;，已能通过测试XML数据的值来决定不同的输出形式（不知你尝试过没有，实际上&lt; xsl:for-each &gt;也可部分实现&lt; xsl:if &gt;的功能），但有时，我们希望对同一数据同时测试多个条件，根据不同条件输出相应结果。当然，我们可以用if，假如我们只有if可用的话。幸好我们有一个更好的选择，那就是用&lt; xsl:choose &gt;。下面介绍相关元素的语法： </P>
<P>&lt; xsl:choose &gt;</P>
<P>语法：&lt; xsl:choose &gt;</P>
<P>属性：无，表示一个多选测试的开始 </P>
<P>&lt; xsl:when &gt;</P>
<P>语法： </P>
<P>&lt; xsl:when expr="script-expression" language="language-name" test="pattern" &gt;</P>
<P>属性： </P>
<P>expr ── 脚本语言表达式，计算结果为“真”或“假”；如果结果为“真”，且通过test，则在输出中显示其中内容（可省略此项属性）。 </P>
<P>language ── expr属性中表达式的脚本语言类型，其取值与HTML标记SCRIPT的LANGUAGE属性的取值相同，缺省为“JScript”。 </P>
<P>test ── 源数据测试条件。 </P>
<P>&lt; xsl:otherwise &gt;</P>
<P>语法：&lt; xsl:otherwise &gt;</P>
<P>属性：无，在一个多选测试中，如果没有不满足&lt; xsl:when &gt;规定的条件，如果在最后有此标记，则输出此标记中的内容。</P>
<P>示例：</P>
<P>　　此处以学生成绩单为例，要求按成绩的高低给出优秀（ &gt;85）、一般（70~85）、起格（60~69）、不及格（&lt; 60），而不是显示分数。其中成绩单的XML文档(文件名：grade.xml)如下： </P>
<P>&lt; ?xml version="1.0" encoding="GB2312"? &gt;</P>
<P>&lt; ?xml:stylesheet type="text/xsl" href="grade.xsl"? &gt;</P>
<P>&lt; document &gt;</P>
<P>&lt; grade &gt;</P>
<P>&lt; name &gt;大胖&lt; /name &gt;&lt; english &gt;80&lt; /english &gt;</P>
<P>&lt; math &gt;90&lt; /math &gt;&lt; chymest &gt;90&lt; /chymest &gt;</P>
<P>&lt; /grade &gt;</P>
<P>&lt; grade &gt;</P>
<P>&lt; name &gt;小花&lt; /name &gt;&lt; english &gt;98&lt; /english &gt;</P>
<P>&lt; math &gt;70&lt; /math &gt;&lt; chymest &gt;85&lt; /chymest &gt;</P>
<P>&lt; /grade &gt;</P>
<P>&lt; /document &gt;</P>
<P>　　为实现按分数分等级显示，其XSL文档（文件名：grade.xsl）内容如下： </P>
<P>&lt; ?xml version="1.0" encoding="GB2312"? &gt;</P>
<P>&lt; xsl:stylesheet xmlns:xsl="<A class=contentlink href='http://www.w3.org/TR/WD-xsl"' target=_blank>http://www.w3.org/TR/WD-xsl"</A> &gt;</P>
<P>&lt; xsl:template match="/" &gt;</P>
<P>&lt; HTML &gt;</P>
<P>&lt; HEAD &gt;&lt; TITLE &gt;成绩单&lt; /TITLE &gt;&lt; /HEAD &gt;</P>
<P>&lt; BODY &gt;&lt; xsl:apply-templates select="document"/ &gt;&lt; /BODY &gt;</P>
<P>&lt; /HTML &gt;</P>
<P>&lt; /xsl:template &gt;</P>
<P>&lt; xsl:template match="document" &gt;</P>
<P>&lt; TABLE border="1" cellspacing="0" &gt;</P>
<P>&lt; TH &gt;姓名&lt; /TH &gt; &lt; TH &gt;英语&lt; /TH &gt;&lt; TH &gt;数学&lt; /TH &gt;&lt; TH &gt;化学&lt; /TH &gt;</P>
<P>&lt; xsl:apply-templates select="grade"/ &gt;</P>
<P>&lt; /TABLE &gt;</P>
<P>&lt; /xsl:template &gt;</P>
<P>&lt; xsl:template match="grade" &gt;</P>
<P>&lt; TR &gt;</P>
<P>&lt; TD &gt;&lt; xsl:apply-templates select="name"/ &gt;&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:apply-templates select="english"/ &gt;&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:apply-templates select="math"/ &gt;&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:apply-templates select="chymest"/ &gt;&lt; /TD &gt;</P>
<P>&lt; /TR &gt;</P>
<P>&lt; /xsl:template &gt;</P>
<P>&lt; xsl:template match="name" &gt;&lt; xsl:<I>value</I>-of/ &gt;&lt; /xsl:template &gt;</P>
<P>&lt; xsl:template match="english|math|chymest" &gt;</P>
<P>&lt; xsl:choose &gt;</P>
<P>&lt; xsl:when test=".[<I>value</I>() $gt$ 85]" &gt;优秀&lt; /xsl:when &gt;</P>
<P>&lt; xsl:when test=".[<I>value</I>() $gt$ 70]" &gt;一般&lt; /xsl:when &gt;</P>
<P>&lt; xsl:when test=".[<I>value</I>() $gt$ 60]" &gt;起格&lt; /xsl:when &gt;</P>
<P>&lt; xsl:otherwise &gt;不起格&lt; /xsl:otherwise &gt;</P>
<P>&lt; /xsl:choose &gt;</P>
<P>&lt; /xsl:template &gt;</P>
<P>&lt; /xsl:stylesheet &gt;</P>
<P>说明：</P>
<P>　　在&lt; xsl:choose &gt;选择中，从第一个&lt; xsl:when &gt;开始，逐个测试，直到满足一个测试条件就将其中的内容输出，不再测试后面的条件；如果不满足任何一个条件，则输出&lt; xsl:otherwise &gt;中的内容。</P>
<P>　　标记对&lt; xsl:when &gt;&lt; /xsl:when &gt;与&lt; xsl:otherwise &gt;&lt; /xsl:otherwise &gt;中可嵌套&lt; xsl:if &gt;或&lt; xsl:choose &gt;。</P>
<P>注：如果拷贝源代码，请将空格删除</P>
<P>跟我学XSL（六） （返回标题） </P>
<P>2000-05-08· 禹希初·CPCW</P>
<P>运算符、关系与逻辑运算符，特殊字符等</P>
<P>　　今天我们学习XSL的各种运算符，满足编写更大灵活性的XSL样式的要求。</P>
<P>表一、运算符与特殊字符</P>
<P>运算符 描述 </P>
<P>/ 选择子元素，返回左侧元素的直接子元素；如果“/”位于最左侧表示选择根结点的直接子元素 </P>
<P>// 递归下降，不论深度，搜索指定的元素；如果位于最左侧表示从根结点出发递归下降搜索指定元素 </P>
<P>. 表示当前元素 </P>
<P>* 通配符，选择任意元素，不考虑名字 </P>
<P>@ 取得属性值，作为属性名的前缀 </P>
<P>@* 通配符，选择任意属性，不考虑名字 </P>
<P>: 名字作用范围分隔符，将名字作用范围前缀与元素或属性名分隔开来 </P>
<P>!* 在相关节点上应用指定方法 </P>
<P>( )* 分组，明确指定优先顺序 </P>
<P>[ ] 应用过滤样式 </P>
<P>[ ]* 下标运算符，用于在集合中指示元素 </P>
<P>表二、逻辑运算符</P>
<P>比较运算符 可选方式 描述 </P>
<P>and $and$或 逻辑与 </P>
<P>or $or$或|| 逻辑或 </P>
<P>not() $not$ 逻辑非 </P>
<P>表三、关系运算符 </P>
<P>= $eq$ 相等 </P>
<P>= $ieq$ 相等（不区分大小写） </P>
<P>!= $ne$ 不等 </P>
<P>$ine$ 不等（不区分大小写） </P>
<P>&lt; $lt$ 小于 </P>
<P>$ilt$ 小于（不区分大小写） </P>
<P>&lt; = $le$ 小于等于 </P>
<P>$ile$ 小于等于（不区分大小写） </P>
<P>&gt; $gt$ 大于 </P>
<P>$igt$ 大于（不区分大小写） </P>
<P>&gt;= $ge$ 大于等于 </P>
<P>$ige$ 大于等于（不区分大小写） </P>
<P>$all$ 集合运算符，如果集合中所有项目均满足条件则返回“真” </P>
<P>$any$ 集合运算符，如果集合中任意项目满足条件则返回“真” </P>
<P>| 集合运算符，返回两个集合的联合 </P>
<P>示例一：</P>
<P>　　从个人简历中寻找具有具有“WEB开发”技能的人的姓名与E-Mail。假设文档结构如下所示： </P>
<P>&lt; document &gt;</P>
<P>&lt; resume &gt;</P>
<P>&lt; name &gt;name&lt; /name &gt;</P>
<P>&lt; sex &gt;sex&lt; /sex &gt;</P>
<P>&lt; birthday &gt;birthday&lt; /birthday &gt;</P>
<P>&lt; skill &gt;skill1&lt; /skill &gt;</P>
<P>&lt; skill &gt;skill2&lt; /skill2 &gt;</P>
<P>… </P>
<P>&lt; skill &gt;skilln&lt; /skill &gt;</P>
<P>&lt; /resume &gt;</P>
<P>&lt; resume &gt;</P>
<P>… </P>
<P>&lt; /resume &gt;</P>
<P>… </P>
<P>&lt; /document &gt;</P>
<P>　　为从以上结构的个人简历中寻找出所有具有“WEB开发”技能的人的姓名与E-Mail的XSL文档结构如下： </P>
<P>&lt; TABLE border="1" cellspacing="0" &gt;</P>
<P>&lt; TH &gt;姓名&lt; /TH &gt;&lt; TH &gt;E-Mail&lt; /TH &gt;</P>
<P>&lt; xsl:for-each select="resume [ $any$ skill='WEB开发' ]" &gt;</P>
<P>&lt; TR &gt;&lt; TD &gt;&lt; xsl:<I>value</I>-of select="name"/ &gt;&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:<I>value</I>-of select="E-Mail"/ &gt;&lt; /TD &gt;</P>
<P>&lt; /TR &gt;</P>
<P>&lt; /xsl:for-each &gt;</P>
<P>&lt; /TABLE &gt;</P>
<P>说明： </P>
<P>1.[ ] ───表示选择条件，只有满足条件的个人简历才被显示； </P>
<P>2.$any$ ──由于每个人有多种技能，故加$any$作为前缀，以使每个人所有技能都能被比较； </P>
<P>3.skill='WEB开发' ──筛选条件</P>
<P>示例二、</P>
<P>　　仍上面的XML文档为例，如果欲选择1977/1/1之前出生的人的姓名、技能与E-Mail，相应的XSL文档结构如下（假定生日格式为yyyy/mm/dd）： </P>
<P>&lt; TABLE border="1" cellspacing="0" &gt;</P>
<P>&lt; TH &gt;姓名&lt; /TH &gt;&lt; TH &gt;技能&lt; /TH &gt;&lt; TH &gt;E-Mail&lt; /TH &gt;</P>
<P>&lt; xsl:for-each select="resume [ birthday $lt$ '1977/1/1' ]" &gt;</P>
<P>&lt; TR &gt;</P>
<P>&lt; TD &gt;&lt; xsl:<I>value</I>-of select="name"/ &gt;&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:<I>value</I>-of select="skill [0]"/ &gt;</P>
<P>&lt; xsl:for-each select="skill [index() &gt;0]" &gt;、 </P>
<P>&lt; xsl:<I>value</I>-of select="."/ &gt;</P>
<P>&lt; /xsl:for-each &gt;</P>
<P>&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:<I>value</I>-of select="E-Mail"/ &gt;&lt; /TD &gt;</P>
<P>&lt; /TR &gt;</P>
<P>&lt; /xsl:for-each &gt;</P>
<P>&lt; /TABLE &gt;</P>
<P>说明： </P>
<P>1. birthday $lt$ '1977/1/1' ── 搜索条件，在此处使用“&lt; ”会错误，故使用“$lt$”表示小于。 </P>
<P>2. skill [0] ─── 表示选择skill的第一项 </P>
<P>3. skill [index() &gt;0]───表示选择skill的第二项以后（包括第二项）的项目 </P>
<P>4. xsl:<I>value</I>-of select="." ─── 表示选择当前标记的值</P>
<P>　　相信大家应该注意到，在前面以及本次的例子中出现了一些函数，如index()、formatIndex()、childNumber()，也许大家还不完全明了其中的含义吧？敬请关注下一课。</P>
<P>注：如果拷贝源代码，请将空格删除 </P>
<P>跟我学XSL（七） （返回标题） </P>
<P>2000-05-09· 禹希初·CPCW</P>
<P>XSL函数一</P>
<P>　　本期学习XSL样式方法，即可用于XSL元素&lt; xsl:for-each &gt;、&lt; xsl:<I>value</I>-of &gt;、&lt; xsl:template &gt;的select属性、&lt; xsl:apply-templates &gt;的match属性、&lt; xsl:if &gt;、&lt; xsl:when &gt;的test属性中，对元素的范围进行筛选，从而提供更大的灵活性。</P>
<P>　　XML与DHTML（动态HTML）一样，这些节点都是一个个对象，而且这些对象都是有层次的，从根节点开始构成一颗层次清淅的树状结构，这就形成了文档对象模型DOM，通过对象的属性、方法来达到访问控制XML节点的目的。</P>
<P>　　我们这里不打算就XML的DOM逐一详细阐述，因为这完全可以写成一个篇幅较多的教程，我们先就一些常见的方法作一些讨论，以期对DOM的对象方法有一个大致的了解。</P>
<P>　　注：从本期开始，所有示例不再提供完整源代码，如有不明白之处，请仔细阅读前面七期、并动手练手。</P>
<P>一、end()</P>
<P>含义：返回集合中最后一个元素。</P>
<P>示例：输出最后一份简历</P>
<P>假定XML文件格式为：</P>
<P>……&lt; resume &gt;…&lt; /resume &gt;……&lt; resume &gt;…&lt; /resume &gt;……</P>
<P>相应XSL文件内容为： </P>
<P>&lt; xsl:for-each select="resume[end()]" &gt;……&lt; /xsl:for-each &gt;</P>
<P>或 </P>
<P>&lt; xsl:templates match="resume[end()]" &gt;……&lt; /xsl:templates &gt;</P>
<P>或 </P>
<P>&lt; xsl:apply-template select="resume[end()]" &gt;……&lt; /xsl:apply-template &gt;</P>
<P>二、index()</P>
<P>含义：返回该元素在集合中的位置，返回值是一整数，其中第一个元素返回0</P>
<P>示例：返回前面三份简历 </P>
<P>resume[index() $le$ 3]</P>
<P>注意：index()是与父元素相关的，请看下例： </P>
<P>&lt; x &gt;</P>
<P>&lt; y/ &gt;</P>
<P>&lt; y/ &gt;</P>
<P>&lt; /x &gt;</P>
<P>&lt; x &gt;</P>
<P>&lt; y/ &gt;</P>
<P>&lt; y/ &gt;</P>
<P>&lt; /x &gt;</P>
<P>返回所有&lt; x &gt;中的第一个&lt; y &gt;</P>
<P>x/y[index()=0] 或x/y[0]</P>
<P>三、nodeName()</P>
<P>含义：返回元素的名字，即标记名</P>
<P>示例：选择任意元素，假如其名字（即标记名）等于“name”</P>
<P>*[nodeName()='name'] 或 *[name]</P>
<P>四、number()</P>
<P>含义：将值转换为数值形式，如果不是数值则返回空，要求参数</P>
<P>示例：年龄(age)小于30岁的人的简历(resume)</P>
<P>resume[number(age) $lt$ 30] 或resume[age $lt$ 30]</P>
<P>五、nodeType()</P>
<P>含义：返回结点类型，结果为是数值。以下是返回值列表：</P>
<P>结点类型 结点类型值 结点的字符形式描述 </P>
<P>Element 1 'element' </P>
<P>Element Attribute 2 'attribute' </P>
<P>Markup-Delimited Region of Text 3 'text' </P>
<P>Processing Instruction 7 'processing_instruction' </P>
<P>Comment 8 'comment' </P>
<P>Document Entity 9 'document' </P>
<P>六、<I>value</I>()</P>
<P>含义：返回元素或属性的值</P>
<P>示例：<I>value</I>()是元素或属性的缺省方法，以下表示是等价 </P>
<P>name!<I>value</I>()="NAME"与name="NAME"</P>
<P>@attr="attribute_<I>value</I>"与@attr="attribute_<I>value</I>"</P>
<P>注：@是属性前缀，@attr表示是属性attr</P>
<P>七、attribute()</P>
<P>含义：返回所有属性结点的集合，等价于“@*”</P>
<P>示例：寻找所有的resume元素，满足条件至少有一个属性的值为“ABC”</P>
<P>resume[$any$ attribute()='ABC']或resume[$any$ @*='ABC']</P>
<P>寻找所有的resume元素，满足条件至少有一个子元素有一个属性的值为“ABC”</P>
<P>resume[$any$ */attribute()='ABC']或resume[$any$ */@*='ABC']</P>
<P>八、comment()</P>
<P>含义：返回所有注释结点 </P>
<P>示例：例如 </P>
<P>resume[$any$ comment()='禹希初的简历']</P>
<P>表示寻找含有注释语句 </P>
<P>&lt; !--禹希初的简历-- &gt;</P>
<P>的元素&lt; resume &gt;</P>
<P>九、cdata()</P>
<P>含义：返回所有CDATA类型的结点的集合</P>
<P>示例：例如 </P>
<P>resume[$any$ cdata()='禹希初的简历']</P>
<P>表示寻找含有下述语句（必须是直接子结点） </P>
<P>&lt; ![CDATA[禹希初的简历]] &gt;</P>
<P>的元素&lt; resume &gt;</P>
<P>十、node()</P>
<P>含义：返回当前上下文环境中除根结点和属性结点以外的所有结点的集合，等价于</P>
<P>“* | pi() | comment() | text()”</P>
<P>示例：寻找所有元素resume，其最后一个结点的名字为"skill"</P>
<P>resume[node()[end()]!nodeName()='skill']</P>
<P>寻找所有resume元素的第一个结点：resume/node()[0]</P>
<P>十一、textnode()</P>
<P>含义：返回所有文本类型的结点的集合</P>
<P>示例：寻找每一个p元素的第二个文本结点 </P>
<P>p/textnode(1)或p!textnode(1)</P>
<P>十二、text()</P>
<P>含义：返回所有表示文本字符串的结点的集合，等价于"cdata()|textnode()"；</P>
<P>　　本期的内容就介绍至此，另有一个函数date()在本人的机器上一试就发生错误使浏览器自动关闭，还有一个函数pi()本人尚未找到适当的应用方法，就不介绍了，下期将讲述如何XSL中使用脚本。</P>
<P>跟我学XSL（八） （返回标题） </P>
<P>2000-05-10· 禹希初·CPCW</P>
<P>脚本与XSL的结合及应用</P>
<P>有时，我们可能会希望XML文档输出时能对其中内容加上一些统计信息或者如编号什么，利用前面的知识就不太容易实现了。今天将介绍两个新元素&lt; xsl:eval &gt;与&lt; xsl:script &gt;，使我们能轻松处理这个难题。 </P>
<P>&lt; xsl:eval &gt;</P>
<P>含义： </P>
<P>计算脚本表达式，输出一个文本字符串 </P>
<P>语法： </P>
<P>&lt; xsl:eval language="language-name" &gt;</P>
<P>属性： </P>
<P>language ── 规定所用脚本语言的名字，可用的属性有“<I>javascript</I>”、“JScript”、“VBScript”、“VBS”等，缺省为“JScript”。 </P>
<P>&lt; xsl:script &gt;</P>
<P>含义： </P>
<P>声明全局变量或定义函数。 </P>
<P>语法： </P>
<P>&lt; xsl:script language="language-name" &gt;</P>
<P>属性：</P>
<P>同&lt; xsl:eval &gt;</P>
<P>示例：</P>
<P>　　不知大家对于第四期《跟我学XML》中的例子是否还有印象？其中的XML文档并没有对简历编号，但输出中却加上了大写的罗马数字序号。今天将再举一稍为复杂一些的例子：</P>
<P>　　假如我们编写一份年终生产统计表，其中需要小计一项，常规的作法是事先将其算出来，现在不必了，我们可以只给出单项统计，显示时再统计小计一项。请找出《跟我学XML》的第五期，XML文件不必修改，对XSL文件的修改如下： </P>
<P>…… </P>
<P>&lt; xsl:template match="document" &gt;</P>
<P>…… </P>
<P>&lt; xsl:apply-templates select="report"/ &gt;</P>
<P>&lt; TR &gt;&lt; TD &gt;小计&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:eval &gt;total(this,"q1")&lt; /xsl:eval &gt;&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:eval &gt;total(this,"q2")&lt; /xsl:eval &gt;&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:eval &gt;total(this,"q3")&lt; /xsl:eval &gt;&lt; /TD &gt;</P>
<P>&lt; TD &gt;&lt; xsl:eval &gt;total(this,"q4")&lt; /xsl:eval &gt;&lt; /TD &gt;</P>
<P>&lt; /TR &gt;</P>
<P>&lt; /TABLE &gt;</P>
<P>&lt; xsl:script &gt;</P>
<P>function total(node,q){</P>
<P>temp=0; </P>
<P>mark='/document/report/'+q;</P>
<P>v=node.selectNodes(mark);</P>
<P>for(t=v.nextNode();t;t=v.nextNode()){</P>
<P>temp+=Number(t.text);</P>
<P>}</P>
<P>return temp; //小计值 </P>
<P>} </P>
<P>&lt; /xsl:script &gt;</P>
<P>&lt; /xsl:template &gt;</P>
<P>说明：</P>
<P>　　黑体部分为添加部分，注意添加部分分为两部分，&lt; xsl:script &gt;&lt; /xsl:script &gt;必须置于&lt; /TABLE &gt;之后，切记。 </P>
<P>selectNodes() ── 是XMLDOMObject的一个方法，返回文档中所有满足条件的结点的集合，条件与&lt; xsl:for-each &gt;和select属性的取值采用同样的写法，可以加筛选、下标等限制，如：</P>
<P>寻找一季度产量大于等于50的班组 </P>
<P>/document/report/q1[<I>value</I>() $ge$ 50]</P>
<P>以上写法还有一个更简单的写法 </P>
<P>//q1[<I>value</I>() $ge$ 50]</P>
<P>//表示从根结点出发遍历所有结点，寻找满足条件的结点，如果文档内有同名但意义不同的结点则不能用此种方法，非不得已不建议使用。以此为例，如果希望统计年总产量，则可以下述字符串寻找结点（建议使用最后一种，此种描述将精确找到需要汇总的数据） </P>
<P>//*[<I>value</I>() $gt$ 0]</P>
<P>或 </P>
<P>//(q1|q2|q3|q4)</P>
<P>或 </P>
<P>/document/report/(q1|q2|q3|q4)</P>
<P>nextNode() ── 返回结点集中的下一个结点 </P>
<P>Number() ── 将提供的参数转换为数值</P>
<P>　　下期介绍XSL函数2，用于&lt; xsl:script &gt;及&lt; xsl:eval &gt;中，以及&lt; xsl:if &gt;和&lt; xsl:when &gt;的expr属性。建议读者熟悉<I>javascript</I>、JScript、VBScript中至少一种，否你能用XSL完成的工作将十分有限。由于篇幅关系，此处不作详细介绍。 </P>
<P>注：如果拷贝源代码，请将空格删除 </P>
<P>XLink介绍 </P>
<P>2000-03-02· 蔡依纯 译·中文XML</P>
<P>　　如果在这个世界上每部电脑中的每个资料块都能够被识别、定址及连结，那将是多么令人振奋的事呢!Xink就是说明如何在网络上做到这点的规格文件。</P>
<P>　　HTML的连结</P>
<P>　　由於WWW的风行，大部分的人都熟悉超文字连结的基本观念，亦即是“一个连结具有两个端点及一个方向，两个端点我们通常称为Anchor。这个连结可以从一个起点连到任何一个网路资源的目标点，这些连结可能是一张图片，一卷影片，一段声音，一个程式，一篇HTML的文件，或其中的元素等等”。</P>
<P>　　假如你常使用浏览器，你一定会知道，当你在连结上按滑鼠的右键时，就会出现一个选单，而其中一个选择是“在新视窗开启”。</P>
<P>　　在HTML中，对於这些连结都是用一个「Anchor」的标志所做成。</P>
<P>　　如果你是撰写HTML的高手，你一定知道在head标志里有个特别的标志叫做link，它提供了多种的连结功能：比方像是连结到样式表（新的浏览器会提供使用者多一点选择，让其自行选择使用哪一个样式表），或是连结到有音乐的地方（当下载完毕後可自动地播放），抑或是连结到另一个网页（可使浏览器预先载入该网页，以省去等待的时间）等。</P>
<P>　　以上所描述的都是连结的功能，事实上，有很多其他的超文字连结功能是HTML没有办法做到的，即使如早期（1960年末至1970年初期）的超文字连结系统所提供的连结功能，HTML亦没办法做到。然而，HTML之所以会成功，是因为它使用最简单的方式去使用超连结，而且使用者并不　要特别的编辑器（Editor）便可制作网页。</P>
<P>　　多用途的连结！</P>
<P>　　有时当我们看到「连结」时，我们发现其实它看起并不像是连结，但事实上，为什么呢？许多的事物包括电子化地址、识别字、位址或是查询等，都可以有连结这个动作。当你想到两个资料间有“relationship”、“role”、“pointer”或是“has a”等关联性时，在XML（eXtensibleMarkupLanguage）中我们可以用「连结」的方法来加以标示。</P>
<P>　　读者们应有一个观念，在HTML4.0规格中，所定义的超文字连结标准，并不是就是连结的所有特性，所以在这里我们将对连结做更清楚的定义：</P>
<P>　　1.一个连结可以有一个、二个甚至是很多个ends，而每一个end都可以是指标，事实上连结本身可以很明确地指定是外部（externally）连结，因而连接到每一个end。</P>
<P>　　2.一个连结并不　一定要有方向，但它也可以有很多或是没有方向，除此之外，连结的方向不　要一定得从“context”到“part”才行。</P>
<P>　　3.连结的end可以是某一范围，不一定是要连结到整个resource或某一地方。</P>
<P>　　4.连结点的表现方式乃视连结资料的角色而定，「撷取」和「取代」只是可能性的行为之一。是故，使用者设定连结为撷取资料并取代画面只是连结功能的表现之一。</P>
<P>　　XML连结对我们有什么用呢？简言之，像是资料模型化、资料交换、超文字连结或是任何不同关系的资料型态上，都可以派上用场。</P>
<P>　　XLinks有一重要功能就是建立「topicmaps」，这是一种依据metadata连结到种种不同网路资源的方式。Topicmaps允许不同的资料有外在的注解（External Annotation）。因此，我们可以说Topicmaps是有结构性的metadata，而依据各特性关联主题，可以连结到不同的网路资源。</P>
<P>　　XLinks</P>
<P>XLink定义了几种常用的连结型态：Simple、Extended、Group和Document。 </P>
<P>1.Simple的用法比较接近在HTML内a标志的用法（如下HTML的写法所示）。 </P>
<P>2.Extended的用法包含arc和locator的元素，并允许各种种类的扩充连结。 </P>
<P>3.Group和document的用法，是让群组连结到一些特别的文件。</P>
<P>以下我们将说明Simple的语法，有两种方法可以知道一个连结是否是Xlink： </P>
<P>1.直接使用simple字眼； </P>
<P>2.以xlink：type表示。</P>
<P>让我们来看看下面Simple的例子： </P>
<P>1.以HTML的写法如下： </P>
<P>2.以Xlink的写法：</P>
<P>　　同样一个连结，另一种Xlink也可以写成：</P>
<P>　　xmlns：xlink属性是一个名称　域（Namespaces）宣告的例子，而所谓的名称　域，是方便使用者同时使用数个文件型别宣告（Document TypeDeclaration）之机制，至於这样的做法，我们相信在未来之HTML版本中，也会朝这一方向努力。</P>
<P>　　也许我们觉得很奇怪，为什么这些arcs会接在一起，而形成extendedlink呢？有些人可能比较喜欢（图二）的写法，因为这种连结并没有“from”和“to”，只有href的地址。</P>
<P>　　在locator的定义中包含两个原性：href和role。href属性包含URL，role属性则包含了如何去使用连结的关键字。</P>
<P>　　Xlink扩展了URIs的使用，其中actuate和show对於Xlink来说是非常重要的属性，原因如下：</P>
<P>　　1.actuate的属性可以说明Link是自动地或人工地(user-command)追踪。</P>
<P>　　2.show的属性说明另一端的连结是　要显示一个新（new）的视窗,或是取代（replace）成目前的视窗，或是　要剖析的（若该连结连结到XML文件）。</P>
<P>　　对于HTML的高手来说，上述href属性的用法较不平常，这是因为含有查询条件的正确URL，而它的主要目的是查询文件。</P>
<P>　　这一种URL使用了一个很特别的语法，就是在URL之前放问号（？）来查询，许多指向资料库的连结都用这个技巧。</P>
<P>　　W3C正在发展中的Xpointer是一种特殊的查询，也是Xlink推展的一部份。Xpointer的语法是?xptr=加上XML PathExpression【像是id（phone2）】。从上面的例子中看来，id指到唯一识别字phone2。（这个跟xlink:arc的from和to的用意一样）。 </P>
<P>XMLPathExpression可让我们以不同种类的标准来选择某一元素树状结构式（Elementtreeofstructure data）特殊分枝。</P>
<P></P>
<P><BR>
<DIV align=right><FONT color=#000066>[此贴子已经被作者于2004-4-7 18:24:33编辑过]</FONT></DIV><BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=8&amp;ID=6411&amp;replyID=10182&amp;skin=1" target=_blank>参与讨论本主题</A><BR>]]></description>
</item><item>
<title><![CDATA[[收藏] -- 作者：teiki]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5162</link>
<author>xyin2005</author>
<pubDate>2005/4/21 10:02:24</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12923&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=teiki" target=_blank>teiki</A><BR>以下为原文：<BR><BR><B></B><BR><BR>跟我学XML Schema(6):如何定义可选项的子元素？
<P></P>
<P>假如上面的订书数据中，可以用书名或者书号任一一种订购，则实例文档可能如下：</P>
<P>order2.xml<BR>-----------------<BR>&lt;order&gt;<BR>&lt;orderItem&gt;<BR>&lt;!--书名订购--&gt;<BR>&lt;name&gt;Accounting Book&lt;/name&gt;<BR>&lt;/orderItem&gt;<BR>&lt;orderItem&gt;<BR>&lt;!--书号订购--&gt;<BR>&lt;id&gt;7-5058-3496-7&lt;/id&gt;<BR>&lt;/orderItem&gt;<BR>&lt;/order&gt;</P>
<P>这时书写Schema文档还需要使用choice元素。</P>
<P>order2.xsd<BR>-------------------------<BR>1:&lt;?xml version="1.0"?&gt;<BR>2:&lt;xsd:schema xmlns:xsd="<A class=contentlink href='http://www.w3.org/2001/XMLSchema">' target=_blank>http://www.w3.org/2001/XMLSchema"&gt;</A><BR>3:<BR>4: &lt;xsd:element name="order"&gt;<BR>5: &lt;xsd:complexType&gt;<BR>6: &lt;xsd:sequence&gt;<BR>7: &lt;xsd:element ref="orderItem" maxOccurs="10" /&gt;<BR>8: &lt;/xsd:sequence&gt;<BR>9: &lt;/xsd:complexType&gt;<BR>10: &lt;/xsd:element&gt;<BR>11:<BR>12: &lt;xsd:element name="orderItem"&gt;<BR>13: &lt;xsd:complexType&gt;<BR>14: &lt;xsd:choice&gt;<BR>15: &lt;xsd:element name="name" type="xsd:string"/&gt;<BR>16: &lt;xsd:element name="id" type="xsd:string"/&gt;<BR>17: &lt;/xsd:choice&gt;<BR>18: &lt;/xsd:complexType&gt;<BR>19: &lt;/xsd:element&gt;<BR>20:<BR>21:&lt;/xsd:schema&gt;<BR><BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12923&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏] -- 作者：teiki]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5161</link>
<author>xyin2005</author>
<pubDate>2005/4/21 10:02:31</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12924&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=teiki" target=_blank>teiki</A><BR>以下为原文：<BR><BR><B></B><BR><BR>跟我学XML Schema(7):稍微更复杂的可选项子元素
<P></P>
<P>再稍微修改一下订书数据的实例文档：</P>
<P>order3.xml<BR>-----------------<BR>&lt;order&gt;<BR>&lt;orderItem&gt;<BR>&lt;name&gt;Accounting Book&lt;/name&gt;<BR>&lt;quantity&gt;2&lt;/quantity&gt;<BR>&lt;/orderItem&gt;<BR>&lt;orderItem&gt;<BR>&lt;id&gt;7-5058-3496-7&lt;/id&gt;<BR>&lt;/orderItem&gt;<BR>&lt;/order&gt;</P>
<P>这里假定&lt;quantity&gt;值为1时，缺省。</P>
<P>如何修改Schema文档呢？</P>
<P>order3.xsd<BR>-----------------<BR>1:&lt;?xml version="1.0"?&gt;<BR>2:&lt;xsd:schema xmlns:xsd="<A class=contentlink href='http://www.w3.org/2001/XMLSchema">' target=_blank>http://www.w3.org/2001/XMLSchema"&gt;</A><BR>3:<BR>4: &lt;xsd:element name="order"&gt;<BR>5: &lt;xsd:complexType&gt;<BR>6: &lt;xsd:sequence&gt;<BR>7: &lt;xsd:element ref="orderItem" maxOccurs="10"/&gt;<BR>8: &lt;/xsd:sequence&gt;<BR>9: &lt;/xsd:complexType&gt;<BR>10: &lt;/xsd:element&gt;<BR>11:<BR>12: &lt;xsd:element name="orderItem"&gt;<BR>13: &lt;xsd:complexType&gt;<BR>14: &lt;xsd:sequence&gt;<BR>15: &lt;xsd:choice&gt;<BR>16: &lt;xsd:element name="name" type="xsd:string"/&gt;<BR>17: &lt;xsd:element name="id" type="xsd:string"/&gt;<BR>18: &lt;/xsd:choice&gt;<BR>19: &lt;xsd:element name="quantity" type="xsd:string" minOccurs="0"/&gt;<BR>20: &lt;/xsd:sequence&gt;<BR>21: &lt;/xsd:complexType&gt;<BR>22: &lt;/xsd:element&gt;<BR>23:<BR>24:&lt;/xsd:schema&gt;</P>
<P>19行中的quantity最少出现值为0，也就是可以有，也可以没有。<BR>当然，也可以直接在&lt;choice&gt;元素中，包含quantity,然后定义它的minOccurs。</P>
<P><BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12924&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏] -- 作者：teiki]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5160</link>
<author>xyin2005</author>
<pubDate>2005/4/21 10:02:38</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12925&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=teiki" target=_blank>teiki</A><BR>以下为原文：<BR><BR><B></B><BR><BR>跟我学XML Schema(8):内置简单类型
<P></P>
<P>内建于XML Schema的简单类型有44种。他们在XML Schema推荐标准的第二部分中公布，下面这是一张内置类型的层次结构图：</P>
<P><A class=contentlink href="http://www.w3.org/TR/2001/PR-xmlschema-2-20010330/type-hierarchy.jpg" target=_blank>http://www.w3.org/TR/2001/PR-xmlschema-2-20010330/type-hierarchy.jpg</A><BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12925&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏] -- 作者：teiki]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5159</link>
<author>xyin2005</author>
<pubDate>2005/4/21 10:02:51</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12926&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=teiki" target=_blank>teiki</A><BR>以下为原文：<BR><BR><B></B><BR><BR>跟我学XML Schema(9):自定义简单类型
<P></P>
<P>如果内置简单类型的44种还不能满足要求，怎么办呢？下面学习自定义简单类型。(XML的扩展性充分体现在这里)</P>
<P>例如这个实例文档：</P>
<P>order4.xml<BR>-----------------<BR>&lt;order&gt;<BR>&lt;orderItem&gt;<BR>&lt;id&gt;7-5058-3496-7&lt;/id&gt;<BR>&lt;quantity&gt;5&lt;/quantity&gt;<BR>&lt;/orderItem&gt;<BR>&lt;/order&gt;</P>
<P>ID是一个标准的ISBN编码，我们怎么定义这个ISBN编码呢？</P>
<P>&lt;xsd:simpleType name="idType"&gt;<BR>&lt;xsd:restriction base="xsd:string"&gt;<BR>&lt;xsd:pattern <I>value</I>="\d{1}-\d{4}-\d{4}-\d{1}"/&gt;<BR>&lt;/xsd:restriction&gt;<BR>&lt;/xsd:simpleType&gt;</P>
<P>idType是一个自定义的简单类型。<BR>我们对它做了限制：<BR>&lt;xsd:restriction base="xsd:string"&gt;代表它是基于一个字符串类型。再用pattern元素来描述该字符串的形式。</P>
<P><I>value</I>="\d{1}-\d{4}-\d{4}-\d{1}"这是一个正则表达式，关于正则表达式，以后再介绍。嘻嘻！</P>
<P>利用这个自定义的简单类型，我们可以重新写Schema文档：</P>
<P>order4.xsd<BR>---------------<BR>1:&lt;?xml version="1.0"?&gt;<BR>2:&lt;xsd:schema xmlns:xsd="<A class=contentlink href='http://www.w3.org/2001/XMLSchema">' target=_blank>http://www.w3.org/2001/XMLSchema"&gt;</A><BR>3:<BR>4: &lt;xsd:element name="order"&gt;<BR>5: &lt;xsd:complexType&gt;<BR>6: &lt;xsd:sequence&gt;<BR>7: &lt;xsd:element ref="orderItem" maxOccurs="10"/&gt;<BR>8: &lt;/xsd:sequence&gt;<BR>9: &lt;/xsd:complexType&gt;<BR>10: &lt;/xsd:element&gt;<BR>11:<BR>12: &lt;xsd:element name="orderItem"&gt;<BR>13: &lt;xsd:complexType&gt;<BR>14: &lt;xsd:sequence&gt;<BR>15: &lt;xsd:element name="id" type="idType"/&gt;<BR>16: &lt;xsd:element name="quantity" type="xsd:integer"/&gt;<BR>17: &lt;/xsd:sequence&gt;<BR>18: &lt;/xsd:complexType&gt;<BR>19: &lt;/xsd:element&gt;<BR>20: <BR>21: &lt;xsd:simpleType name="idType"&gt;<BR>22: &lt;xsd:restriction base="xsd:string"&gt;<BR>23: &lt;xsd:pattern <I>value</I>="\d{1}-\d{4}-\d{4}-\d{1}"/&gt;<BR>24: &lt;/xsd:restriction&gt;<BR>25: &lt;/xsd:simpleType&gt;<BR>26: <BR>27:&lt;/xsd:schema&gt;</P>
<P><BR>假如我们事先确定好ID只有3个，即只有3个ISBN是可选的，那怎么办？我们可以用enumeration元素来进行列举。</P>
<P>&lt;xsd:simpleType name="idType"&gt;<BR>&lt;xsd:restriction base="xsd:string"&gt;<BR>&lt;xsd:enumeration <I>value</I>="7-5058-3496-7"/&gt;<BR>&lt;xsd:enumeration <I>value</I>="7-5005-6450-3"/&gt;<BR>&lt;xsd:enumeration <I>value</I>="7-3020-6069-7"/&gt;<BR>&lt;/xsd:restriction&gt;<BR>&lt;/xsd:simpleType&gt;</P>
<P><BR>再来看订购量quantity的值，如果我们设定其值必须在1－10之间，该怎么办呢？可以这些自定义一个简单类型。</P>
<P>&lt;xsd:simpleType name="quantityType"&gt;<BR>&lt;xsd:restriction base="xsd:integer"&gt;<BR>&lt;xsd:minInclusive <I>value</I>="1"/&gt;<BR>&lt;xsd:maxInclusive <I>value</I>="10"/&gt;<BR>&lt;/xsd:restriction&gt;<BR>&lt;/xsd:simpleType&gt;</P>
<P>其中，minInclusive,maxInclusive分别代表该类型的取值范围。</P>
<P>所以最终修改后的Schema文档如下：</P>
<P>order4-1.xsd<BR>----------------------<BR>1:&lt;?xml version="1.0"?&gt;<BR>2:&lt;xsd:schema xmlns:xsd="<A class=contentlink href='http://www.w3.org/2001/XMLSchema">' target=_blank>http://www.w3.org/2001/XMLSchema"&gt;</A><BR>3:<BR>4: &lt;xsd:element name="order"&gt;<BR>5: &lt;xsd:complexType&gt;<BR>6: &lt;xsd:sequence&gt;<BR>7: &lt;xsd:element ref="orderItem" maxOccurs="10"/&gt;<BR>8: &lt;/xsd:sequence&gt;<BR>9: &lt;/xsd:complexType&gt;<BR>10: &lt;/xsd:element&gt;<BR>11:<BR>12: &lt;xsd:element name="orderItem"&gt;<BR>13: &lt;xsd:complexType&gt;<BR>14: &lt;xsd:sequence&gt;<BR>15: &lt;xsd:element name="id" type="idType"/&gt;<BR>16: &lt;xsd:element name="quantity" type="quantityType"/&gt;<BR>17: &lt;/xsd:sequence&gt;<BR>18: &lt;/xsd:complexType&gt;<BR>19: &lt;/xsd:element&gt;<BR>20: <BR>21: &lt;xsd:simpleType name="idType"&gt;<BR>22: &lt;xsd:restriction base="xsd:string"&gt;<BR>23: &lt;xsd:enumeration <I>value</I>="7-5058-3496-7"/&gt;<BR>&lt;xsd:enumeration <I>value</I>="7-5005-6450-3"/&gt;<BR>&lt;xsd:enumeration <I>value</I>="7-3020-6069-7"/&gt;<BR>26: &lt;/xsd:restriction&gt;<BR>27: &lt;/xsd:simpleType&gt;<BR>28: <BR>29: &lt;xsd:simpleType name="quantityType"&gt;<BR>30: &lt;xsd:restriction base="xsd:integer"&gt;<BR>31: &lt;xsd:minInclusive <I>value</I>="1"/&gt;<BR>32: &lt;xsd:maxInclusive <I>value</I>="10"/&gt;<BR>33: &lt;/xsd:restriction&gt;<BR>34: &lt;/xsd:simpleType&gt;<BR>35:<BR>36:&lt;/xsd:schema&gt;<BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12926&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏] -- 作者：teiki]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5158</link>
<author>xyin2005</author>
<pubDate>2005/4/21 10:02:57</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=13033&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=teiki" target=_blank>teiki</A><BR>以下为原文：<BR><BR><B></B><BR><BR>跟我学XML Schema(10):定义属性
<P></P>
<P>最后，我们再来讲讲元素的属性如何在Schema文档中定义。</P>
<P>比如上面的order.xml实例文档中：</P>
<P>&lt;order&gt;<BR>&lt;orderItem id="7-5058-3496-7" /&gt;<BR>&lt;/order&gt;</P>
<P>对此，我们在Schema文档中采用一个attribute来定义：</P>
<P>order.xsd<BR>－－－－－－－－－<BR>&lt;xsd:element name="orderItem"&gt;<BR>&lt;xsd:complexType&gt;<BR>&lt;xsd:sequence&gt;　　←空元素<BR>&lt;/xsd:sequence&gt;　 <BR><BR>&lt;!--定义该元素属性--&gt;<BR>&lt;xsd:attribute name="id" type="xsd:string"/&gt;<BR>&lt;/xsd:complexType&gt;<BR>&lt;/xsd:element&gt;</P>
<P>那么，实例文档中该属性值是必须的还是可有可无的呢？我们可以这样限制：</P>
<P>&lt;xsd:attribute name="id" type="idType" use="required"/&gt;</P>
<P>这里我们讲id属性类型作为一种自定义数据类型idType。<BR>而且，用attribute元素的use属性来定义是否是必须的属性。<BR>required是必须值，optional是可选值，prohibited是无属性值。</P>
<P><BR>那么对于属性的缺省值，我们怎么定义呢？<BR>比如：<BR>&lt;order&gt;<BR>&lt;orderItem id="4-8443-1780-6" quantity="3"/&gt;<BR>&lt;/order&gt;</P>
<P>我们还可以用attribute元素的另一个属性default来定义：<BR>&lt;xsd:attribute name="quantity" type="xsd:integer" default="1"/&gt;</P>
<P>所以，我们可以重新写出一个Schema文档：</P>
<P>order2.xsd<BR>--------------<BR>&lt;xsd:element name="orderItem"&gt;<BR>&lt;xsd:complexType&gt;<BR>&lt;xsd:sequence&gt;&lt;/xsd:sequence&gt;<BR>&lt;xsd:attribute name="id" type="idType" use="required"/&gt;<BR>&lt;xsd:attribute name="quantity" type="xsd:integer" default="1"/&gt;<BR>&lt;/xsd:complexType&gt;<BR>&lt;/xsd:element&gt;<BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=13033&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏] -- 作者：teiki]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5157</link>
<author>xyin2005</author>
<pubDate>2005/4/21 10:03:13</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=13034&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=teiki" target=_blank>teiki</A><BR>以下为原文：<BR><BR><B></B><BR><BR>上面的属性我们定义我们还可以采用属性组的办法来重新改写Schema文档。
<P></P>
<P>order3.xsd<BR>----------------<BR>1: &lt;xsd:element name="orderItem"&gt;<BR>2: &lt;xsd:complexType&gt;<BR>3: &lt;xsd:sequence&gt;&lt;/xsd:sequence&gt;<BR>4: &lt;xsd:attributeGroup ref="orderItemAttributes"/&gt;<BR>5: &lt;/xsd:complexType&gt;<BR>6: &lt;/xsd:element&gt;<BR>7:<BR>8: &lt;xsd:attributeGroup name="orderItemAttributes"&gt;<BR>9: &lt;xsd:attribute name="id" type="idType" use="required"/&gt;<BR>10: &lt;xsd:attribute name="quantity" type="xsd:integer" default="1"/&gt;<BR>11: &lt;/xsd:attributeGroup&gt;</P>
<P>这个属性组就不详细解释了，不过，大家一看就清楚了吧。</P>
<P>最后，我们写一个完整的订书order.xml的Schema文档。<BR>1: &lt;?xml version="1.0"?&gt;<BR>2: &lt;xsd:schema xmlns:xsd="<A class=contentlink href='http://www.w3.org/2001/XMLSchema">' target=_blank>http://www.w3.org/2001/XMLSchema"&gt;</A><BR>3:<BR>4: &lt;xsd:element name="order"&gt;<BR>5: &lt;xsd:complexType&gt;<BR>6: &lt;xsd:sequence&gt;<BR>7: &lt;xsd:element ref="orderItem" maxOccurs="10"/&gt;<BR>8: &lt;/xsd:sequence&gt;<BR>9: &lt;/xsd:complexType&gt;<BR>10: &lt;/xsd:element&gt;<BR>11:<BR>12: &lt;xsd:element name="orderItem"&gt;<BR>13: &lt;xsd:complexType&gt;<BR>14: &lt;xsd:sequence&gt;&lt;/xsd:sequence&gt;<BR>15: &lt;xsd:attributeGroup ref="orderItemAttributes"/&gt;<BR>16: &lt;/xsd:complexType&gt;<BR>17: &lt;/xsd:element&gt;<BR>18:<BR>19: &lt;xsd:attributeGroup name="orderItemAttributes"&gt;<BR>20: &lt;xsd:attribute name="id" type="idType" use="required"/&gt;<BR>21: &lt;xsd:attribute name="quantity" type="xsd:integer" default="1"/&gt;<BR>22: &lt;/xsd:attributeGroup&gt;<BR>23:<BR>24: &lt;xsd:simpleType name="idType"&gt;<BR>25: &lt;xsd:restriction base="xsd:string"&gt;<BR>26: &lt;xsd:pattern <I>value</I>="\d{1}-\d{4}-\d{4}-\d{1}"/&gt;<BR>27: &lt;/xsd:restriction&gt;<BR>28: &lt;/xsd:simpleType&gt;<BR>29:<BR>30: &lt;/xsd:schema&gt;<BR><BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=13034&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏] -- 作者：teiki]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5155</link>
<author>xyin2005</author>
<pubDate>2005/4/21 10:02:00</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12922&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=teiki" target=_blank>teiki</A><BR>以下为原文：<BR><BR><B></B><BR><BR>跟我学XML Schema(5):如何定义相同子元素的数量？ 
<P></P>
<P>先看这个简单的订购数据实例文档：</P>
<P>order.xml<BR>---------<BR>&lt;order&gt;<BR>&lt;orderItem&gt;Accounting Book&lt;/orderItem&gt;<BR>&lt;orderItem&gt;Taxation Book&lt;/orderItem&gt;<BR>&lt;/order&gt;</P>
<P>假设&lt;orderItem&gt;元素，即每次的订购书目不能超过10种，那该怎么写这个Schema文档呢？这里要用到&lt;element&gt;的maxOccurs属性。</P>
<P>order.xsd<BR>--------------------<BR>1:&lt;?xml version="1.0"?&gt;<BR>2:&lt;xsd:schema xmlns:xsd="<A class=contentlink href='http://www.w3.org/2001/XMLSchema">' target=_blank>http://www.w3.org/2001/XMLSchema"&gt;</A><BR>3:<BR>4: &lt;xsd:element name="order"&gt;<BR>5: &lt;xsd:complexType&gt;<BR>6: &lt;xsd:sequence&gt;<BR>7: &lt;xsd:element name="orderItem" type="xsd:string" maxOccurs="10" /&gt;<BR>8: &lt;/xsd:sequence&gt;<BR>9: &lt;/xsd:complexType&gt;<BR>10: &lt;/xsd:element&gt;<BR>11:<BR>12:&lt;/xsd:schema&gt;</P>
<P>第7行中的maxOccurs属性为10，代表orderItem元素可以最大有10个。如果，不设定元素个数，则可以用maxOccurs="unbounded"来定义.</P>
<P>类似，如果要定义最小值，可以使用minOccurs，比如下面这句：<BR>&lt;xsd:element name="orderItem" type="xsd:string" minOccurs="5" maxOccurs="10"/&gt;<BR>这两个属性缺省值都是1。<BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12922&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏] -- 作者：teiki]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5154</link>
<author>xyin2005</author>
<pubDate>2005/4/21 10:01:32</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12921&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=teiki" target=_blank>teiki</A><BR>以下为原文：<BR><BR><B></B><BR><BR><BR>跟我学XML Schema(4):如何定义属性呢？ 
<P></P>
<P><BR>加入实例文档的元素包含属性，怎么办呢？</P>
<P>customer2.xml<BR>---------------<BR>&lt;customer id="001718"&gt;<BR>&lt;name&gt;Teiki&lt;/name&gt;<BR>&lt;address&gt;No.237, Road Waitan, Shanghai&lt;/address&gt;<BR>&lt;/customer&gt;</P>
<P>那就这样写Schema文档：<BR>customer2.xsd<BR>------------------<BR>1: &lt;?xml version="1.0"?&gt;<BR>2: &lt;xsd:schema xmlns:xsd="<A class=contentlink href='http://www.w3.org/2001/XMLSchema">' target=_blank>http://www.w3.org/2001/XMLSchema"&gt;</A><BR>3:<BR>4: &lt;xsd:element name="customer"&gt;<BR>5: &lt;xsd:complexType&gt;<BR>6: &lt;xsd:sequence&gt;<BR>7: &lt;xsd:element name="name" type="xsd:string"/&gt;<BR>8: &lt;xsd:element name="address" type="xsd:string" /&gt;<BR>9: &lt;/xsd:sequence&gt;<BR>10: &lt;!-- 增加属性定义 --&gt;<BR>11: &lt;xsd:attribute name="id" type="xsd:string"/&gt;<BR>12: &lt;/xsd:complexType&gt;<BR>13: &lt;/xsd:element&gt;<BR>14:<BR>15: &lt;/xsd:schema&gt;</P>
<P>很简单，在&lt;sequence&gt;元素定义完成后，再用&lt;attribute&gt;元素id。<BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12921&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏] -- 作者：teiki]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5153</link>
<author>xyin2005</author>
<pubDate>2005/4/21 10:00:52</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12920&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=teiki" target=_blank>teiki</A><BR>以下为原文：<BR><BR><B></B><BR><BR>跟我学XML Schema(3):含子元素和孙元素的更复杂Schema文档
<P></P>
<P>这次我们给出一个更加复杂一些的文档：</P>
<P>address.xml<BR>---------------<BR>&lt;customer&gt;<BR>&lt;name&gt;Teiki&lt;/name&gt;<BR>&lt;address&gt;<BR>&lt;!-- address追加一个地址子元素 --&gt;<BR>&lt;prefecture&gt;Zhejiang&lt;/prefecture&gt;<BR>&lt;city&gt;Hangzhou&lt;/city&gt;<BR>&lt;street&gt;Xilu Road, No.121, 7F&lt;/street&gt;<BR>&lt;/address&gt;<BR>&lt;/customer&gt;</P>
<P><BR>为此，我们需要一个更加复杂一点的Schema文档：</P>
<P>address.xsd<BR>-----------------<BR>1: &lt;?xml version="1.0"?&gt;<BR>2: &lt;xsd:schema xmlns:xsd="<A class=contentlink href='http://www.w3.org/2001/XMLSchema">' target=_blank>http://www.w3.org/2001/XMLSchema"&gt;</A><BR>3:<BR>4: &lt;xsd:element name="customer"&gt;<BR>5: &lt;xsd:complexType&gt;<BR>6: &lt;xsd:sequence&gt;<BR>7: &lt;xsd:element name="name" type="xsd:string"/&gt;<BR>8: &lt;!-- 追加子元素address--&gt;<BR>9: &lt;xsd:element name="address"&gt;<BR>10: &lt;xsd:complexType&gt;<BR>11: &lt;xsd:sequence&gt;<BR>12: &lt;xsd:element name="prefecture" type="xsd:string"/&gt;<BR>13: &lt;xsd:element name="city" type="xsd:string" /&gt;<BR>14: &lt;xsd:element name="street" type="xsd:string" /&gt;<BR>15: &lt;/xsd:sequence&gt;<BR>16: &lt;/xsd:complexType&gt;<BR>17: &lt;/xsd:element&gt;<BR>18: &lt;!-- end --&gt;<BR>19: &lt;/xsd:sequence&gt;<BR>20: &lt;/xsd:complexType&gt;<BR>21: &lt;/xsd:element&gt;<BR>22:<BR>23:&lt;/xsd:schema&gt;<BR>不过，我们还可以采用ref元素来重新编写这个Schema文档：<BR>address2.xsd<BR>----------------------<BR>1: &lt;?xml version="1.0"?&gt;<BR>2: &lt;xsd:schema xmlns:xsd="<A class=contentlink href='http://www.w3.org/2001/XMLSchema">' target=_blank>http://www.w3.org/2001/XMLSchema"&gt;</A><BR>3:<BR>4: &lt;xsd:element name="customer"&gt;<BR>5: &lt;xsd:complexType&gt;<BR>6: &lt;xsd:sequence&gt;<BR>7: &lt;xsd:element name="name" type="xsd:string"/&gt;<BR>8: &lt;xsd:element ref="address"/&gt;<BR>9: &lt;/xsd:sequence&gt;<BR>10: &lt;/xsd:complexType&gt;<BR>11: &lt;/xsd:element&gt;<BR>12:<BR>13: &lt;xsd:element name="address"&gt;<BR>14: &lt;xsd:complexType&gt;<BR>15: &lt;xsd:sequence&gt;<BR>16: &lt;xsd:element name="prefecture" type="xsd:string"/&gt;<BR>17: &lt;xsd:element name="city" type="xsd:string" /&gt;<BR>18: &lt;xsd:element name="street" type="xsd:string" /&gt;<BR>19: &lt;/xsd:sequence&gt;<BR>20: &lt;/xsd:complexType&gt;<BR>21: &lt;/xsd:element&gt;<BR>22:<BR>23: &lt;/xsd:schema&gt;<BR>使用ref元素可以直接将其指向另一个模块，使文档更加具有可读性。<BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12920&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏] -- 作者：teiki]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5152</link>
<author>xyin2005</author>
<pubDate>2005/4/21 9:59:16</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12919&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=teiki" target=_blank>teiki</A><BR>以下为原文：<BR><BR><B></B><BR><BR>跟我学XML Schema(2):含子元素的稍复杂Schema文档 
<P></P>
<P>假设实例文档是如下的：</P>
<P>customer.xml<BR>-----------<BR>&lt;customer&gt;<BR>&lt;name&gt;teiki&lt;/name&gt;<BR>&lt;address&gt;No.237, Road Waitan, Shanghai&lt;/address&gt;<BR>&lt;/customer&gt;</P>
<P>则可以写出以下的XML Schema文档：<BR>customer.xsd<BR>----------------<BR>1: &lt;?xml version="1.0"?&gt;<BR>2: &lt;xsd:schema xmlns:xsd="<A class=contentlink href='http://www.w3.org/2001/XMLSchema">' target=_blank>http://www.w3.org/2001/XMLSchema"&gt;</A><BR>3: &lt;xsd:element name="customer"&gt;<BR>4: &lt;xsd:complexType&gt;<BR>5: &lt;xsd:sequence&gt;<BR>6: &lt;xsd:element name="name" type="xsd:string"/&gt;<BR>7: &lt;xsd:element name="address" type="xsd:string" /&gt;<BR>8: &lt;/xsd:sequence&gt;<BR>9: &lt;/xsd:complexType&gt;<BR>10: &lt;/xsd:element&gt;<BR>11: &lt;/xsd:schema&gt;</P>
<P>实例文档customer.xml中，&lt;customer&gt;元素含有两个子元素，所以我们在Schema文档中采用ComplexType来定义该元素。</P>
<P>sequence表示子元素依次出现的顺序。<BR><BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12919&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏][原创] 跟我学XML Schema（1）：最简单的Schema文档 -- 作者：teiki]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xyin2005&amp;id=5151</link>
<author>xyin2005</author>
<pubDate>2005/4/21 9:58:39</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12918&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=teiki" target=_blank>teiki</A><BR>以下为原文：<BR><BR><B>[原创] 跟我学XML Schema（1）：最简单的Schema文档</B><BR><BR>如何写一个最简单的XML Schema文档呢？
<P></P>
<P>首先，我们写出一个最简单的XML文档.</P>
<P>hello.xml<BR>-------------------<BR>&lt;?xml version="1.0"?&gt; <BR>&lt;greeting&gt;Hello World!!&lt;/greeting&gt;</P>
<P>（一个根元素：greeting；且这个元素不含属性，无子元素，内容是字符串。）</P>
<P>hello.xsd<BR>－－－－－－－－－－<BR>&lt;?xml version="1.0"?&gt; <BR>&lt;xsd:schema xmlns:xsd="<A class=contentlink href='http://www.w3.org/2001/XMLSchema">' target=_blank>http://www.w3.org/2001/XMLSchema"&gt;</A><BR>&lt;xsd:element name="greeting" type="xsd:string"/&gt;<BR>&lt;/xsd:schema&gt;</P>
<P>XML Schema文档后缀名是.xsd，完全符合XML语法，根元素是schema，命名空间xmlns:xsd="<A class=contentlink href="http://www.w3.org/2001/XMLSchema" target=_blank>http://www.w3.org/2001/XMLSchema</A>，用元素&lt;element&gt;定义实例文档中的元素，如greeting。<BR><BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=23&amp;ID=7076&amp;replyID=12918&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item>
</channel>
</rss>