Xml
1. Xml简介
1) 什么是xml
2) XML 指可扩展标记语言(EXtensible Markup Language)
3) XML 是一种标记语言,很类似 HTML
4) XML 的设计宗旨是传输数据,而非显示数据 (在不兼容的系统之间轻松地交换数据)
5) XML 标签没有被预定义。您需要自行定义标签。
6) XML 被设计为具有自我描述性。
7) XML 是 W3C 的推荐标准
2. Xml文档认识
<?xml version="1.0" encoding="ISO-8859-1"?> //第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集)。
<note> //根元素
<to>George</to> //子元素
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
(1)语法规则
1)Xml文档形成一种树结构
2)所有xml元素都必须有关闭标签 eg<p> ……</P> 打开标签、关闭标签
3)Xml标签对大小写敏感
4)Xml必须正确地嵌套
5)必须有根元素
6)Xml属性值必须加引号
Eg: <note date="08/08/2008">
<to>George</to>
<from>John</from>
</note>
8) 实体引用
在 XML 中,一些字符拥有特殊的意义。
如果你把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。
这样会产生 XML 错误:
<message>if salary < 1000 then</message>
为了避免这个错误,请用实体引用来代替 "<" 字符:
<message>if salary < 1000 then</message>
5个预定义的实体引用
< |
< |
小于 |
> |
> |
大于 |
& |
& |
和号 |
' |
' |
单引号 |
" |
" |
引号 |
7)空格会被保留
8)xml以LF存储换行
9)xml文档包含xml元素
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分
(2)xml命名规则
· 名称可以含字母、数字以及其他的字符
· 名称不能以数字或者标点符号开始
· 名称不能以字符 “xml”(或者 XML、Xml)开始
· 名称不能包含空格
(3) 最佳命名习惯
· 使名称具有描述性。使用下划线的名称也很不错。
· 名称应当比较简短,比如:<book_title>,而不是:<the_title_of_the_book>。
· 避免 "-" 字符。如果您按照这样的方式进行命名:"first-name",一些软件会认为你需要提取第一个单词。
· 避免 "." 字符。如果您按照这样的方式进行命名:"first.name",一些软件会认为 "name" 是对象 "first" 的属性。
· 避免 ":" 字符。冒号会被转换为命名空间来使用(稍后介绍)。
· XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。有一个实用的经验,即使用数据库的名称规则来命名 XML 文档中的元素。
(4)xml 元素是可扩展的
就是指在已经做好的xml文档,我们仍然可以向文档添加一些信息
(5)xml属性
1) Xml元素可以在开始标签汇总包含属性,类似HTML
属性提供元素元素的额外(附加)信息
2) Xml 属性必须加引号 ,单或双引均可
Eg: <person sex="female"> 、<person sex='female'>
注意:如果属性值本身包含双引号,那么有必要使用单引号包围它
或者可以用实体引用代替本省的双引号
Eg:
<gangster name='George "Shotgun" Ziegler'>
<gangster name="George "Shotgun" Ziegler">
3) 什么时候用元素,什么时候用属性
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
在sex表示元素和属性的时候,功能一样
“我的经验是在 HTML 中,属性用起来很便利,但是在 XML 中,您应该尽量避免使用属性。如果信息感觉起来很像数据,那么请使用子元素吧。”
属性引起的问题:
· 属性无法包含多重的值(元素可以)
· 属性无法描述树结构(元素可以)
· 属性不易扩展(为未来的变化)
· 属性难以阅读和维护
Eg: 优秀的xml文档
<note>
<date>
<day>08</day>
<month>08</month>
<year>2008</year>
</date>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
不要做这样的蠢事(这不是 XML 应该被使用的方式):
<note day="08" month="08" year="2008"
to="George" from="John" heading="Reminder"
body="Don't forget the meeting!">
</note>
4)针对元数据的xml属性
有时候会向元素分配 ID 引用。这些 ID 索引可用于标识 XML 元素
<messages>
<note id="501">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
<note id="502">
<to>John</to>
<from>George</from>
<heading>Re: Reminder</heading>
<body>I will not</body>
</note>
</messages>
上面的 ID 仅仅是一个标识符,用于标识不同的便签。它并不是便签数据的组成部分。
元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。
(6) “形式良好”的xml文档
· XML 文档必须有根元素
· XML 文档必须有关闭标签
· XML 标签对大小写敏感
· XML 元素必须被正确的嵌套
· XML 属性必须加引号
(7)验证XML文档
验证 XML 文档
合法的 XML 文档是“形式良好”的 XML 文档,同样遵守文档类型定义 (DTD) 的语法规则
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
引用的DTD文件
XML DTD
DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构:
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
(8)Xml Schema
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
(9)XML验证器
验证器 ,这工具不错,好!
释:只有在 Internet Explorer 中,可以根据 DTD 来验证 XML。Firefox, Mozilla, Netscape 以及 Opera 做不到这一点
3. 使用CSS显示XML
在xml文档中,套用css
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>
注释:使用 CSS 格式化 XML 不是常用的方法,更不能代表 XML 文档样式化的未来。W3C 推荐使用 XSLT。
4. 使用XSIT显示XML
Eg: xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
- <!--
Edited with XML Spy v2007 (http://www.altova.com)
-->
- <breakfast_menu>
- <food>
<name>Belgian Waffles</name>
<price>$5.95</price>
<description>two of our famous Belgian Waffles with plenty of real maple syrup</description>
<calories>650</calories>
</food>
- <food>
<name>Strawberry Belgian Waffles</name>
<price>$7.95</price>
<description>light Belgian waffles covered with strawberries and whipped cream</description>
<calories>900</calories>
</food>
- </breakfast_menu>
xsiT 文件
<?xml version="1.0" encoding="ISO-8859-1" ?>
- <!--
Edited with XML Spy v2007 (http://www.altova.com)
-->
- <html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
- <body style="font-family:Arial,helvetica,sans-serif;font-size:12pt; background-color:#EEEEEE">
- <xsl:for-each select="breakfast_menu/food">
- <div style="background-color:teal;color:white;padding:4px">
- <span style="font-weight:bold;color:white">
<xsl:value-of select="name" />
</span>
-
<xsl:value-of select="price" />
</div>
- <div style="margin-left:20px;margin-bottom:1em;font-size:10pt">
<xsl:value-of select="description" />
- <span style="font-style:italic">
(
<xsl:value-of select="calories" />
calories per serving)
</span>
</div>
</xsl:for-each>
</body>
</html>
结果
Belgian Waffles - $5.95
two of our famous Belgian Waffles with plenty of real maple syrup (650 calories per serving)
Strawberry Belgian Waffles - $7.95
light Belgian waffles covered with strawberries and whipped cream (900 calories per serving)
5. XMLHttpRequest 对象
XMLHttpRequest 对象用于在后台与服务器交换数据
(1) 创建
所有现代浏览器 (IE7+、Firefox、Chrome、Safari 以及 Opera) 都内建了 XMLHttpRequest 对象。
通过一行简单的 JavaScript 代码,我们就可以创建 XMLHttpRequest 对象。
xmlhttp=new XMLHttpRequest();
<script type="text/javascript">
var xmlhttp;
function loadXMLDoc(url)
{
xmlhttp=null;
if (window.XMLHttpRequest)
{// code for all new browsers
xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{// code for IE5 and IE6
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp!=null)
{
xmlhttp.onreadystatechange=state_Change;
//onreadystatechange 是一个事件句柄。它的值 (state_Change) 是一个函数的名称,当 XMLHttpRequest 对象的状态发生改变时,会触发此函数
xmlhttp.open("GET",url,true); //第三个参数true,该参数规定请求是否异步处理
onreadystatechange 事件使代码复杂化了。但是这是在没有得到服务器响应的情况下,防止代码停止的最安全的方法。
通过把该参数设置为 "false",可以省去额外的 onreadystatechange 代码。如果在请求失败时是否执行其余的代码无关紧要,那么可以使用这个参数
xmlhttp.send(null);
}
else
{
alert("Your browser does not support XMLHTTP.");
}
}
function state_Change()
{
if (xmlhttp.readyState==4)
{// 4 = "loaded"
if (xmlhttp.status==200)
{// 200 = OK
// ...our code here...
}
else
{
alert("Problem retrieving XML data");
}
}
}
</script>
(1)将XML 放到 ASP
您也可以把 XML 文档打开并发送到服务器上的 ASP 页面,分析此请求,然后传回结果。
<html>
<body>
<script type="text/javascript">
xmlHttp=null;
if (window.XMLHttpRequest)
{// code for IE7, Firefox, Opera, etc.
xmlHttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{// code for IE6, IE5
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlHttp!=null)
{
xmlHttp.open("GET", "note.xml", false);
xmlHttp.send(null);
xmlDoc=xmlHttp.responseText;
xmlHttp.open("POST", "demo_dom_http.asp", false);
xmlHttp.send(xmlDoc);
document.write(xmlHttp.responseText);
}
else
{
alert("Your browser does not support XMLHTTP.");
}
</script>
</body>
</html>
(2)
<html>
<head>
<script type="text/javascript">
var xmlhttp;
function loadXMLDoc(url)
{
xmlhttp=null;
if (window.XMLHttpRequest)
{// code for IE7, Firefox, Opera, etc.
xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp!=null)
{
xmlhttp.onreadystatechange=state_Change;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}
else
{
alert("Your browser does not support XMLHTTP.");
}
}
function state_Change()
{
if (xmlhttp.readyState==4)
{// 4 = "loaded"
if (xmlhttp.status==200)
{// 200 = "OK"
document.getElementById('A1').innerHTML=xmlhttp.status;
document.getElementById('A2').innerHTML=xmlhttp.statusText;
document.getElementById('A3').innerHTML=xmlhttp.responseText;
//通过XML HTTP 进行head请求
// document.getElementById('p1').innerHTML=xmlhttp.getAllResponseHeaders
// 进行指定的head 请求
document.getElementById('p1').innerHTML="This file was last modified on: " + xmlhttp.getResponseHeader('Last-Modified');
}
}
else
{
alert("Problem retrieving XML data:" + xmlhttp.statusText);
}
}
}
</script>
</head>
<body>
<h2>Using the HttpRequest Object</h2>
<p><b>Status:</b>
<span id="A1"></span>
</p>
<p><b>Status text:</b>
<span id="A2"></span>
</p>
<p><b>Response:</b>
<br /><span id="A3"></span>
</p>
<button onclick="loadXMLDoc('/example/xdom/note.xml')">Get XML</button>
<p id="p1">
The getAllResponseHeaders() function returns the headers of a resource.
The headers contain file information like length,
server-type, content-type, date-modified, etc.</p>
<button onclick="loadXMLDoc('/example/xdom/test_xmlhttp.txt')">Get Headers</button>
</body>
</html>
6. XPath
XPath 是一种用于在 XML 文档中进行导航的语言
(1)XPath路径
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的
路径表达式:
表达式 |
描述 |
nodename |
选取此节点的所有子节点。 |
/ |
从根节点选取。 |
// |
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. |
选取当前节点。 |
.. |
选取当前节点的父节点。 |
@ |
选取属性。 |
谓语
谓语用来查找某个特定的节点或者包含某个指定的值的节点
路径表达式 |
结果 |
/bookstore/book[1] |
选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] |
选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] |
选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] |
选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] |
选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang='eng'] |
选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] |
选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title |
选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
选取未知节点
通配符 |
描述 |
* |
匹配任何元素节点。 |
@* |
匹配任何属性节点。 |
node() |
匹配任何类型的节点。 |
选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式 |
结果 |
//book/title | //book/price |
选取 book 元素的所有 title 和 price 元素。 |
//title | //price |
选取文档中的所有 title 和 price 元素。 |
/bookstore/book/title | //price |
选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。 |
XPath 轴
轴可定义相对于当前节点的节点集。
轴名称 |
结果 |
ancestor |
选取当前节点的所有先辈(父、祖父等)。 |
ancestor-or-self |
选取当前节点的所有先辈(父、祖父等)以及当前节点本身。 |
attribute |
选取当前节点的所有属性。 |
child |
选取当前节点的所有子元素。 |
descendant |
选取当前节点的所有后代元素(子、孙等)。 |
descendant-or-self |
选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 |
following |
选取文档中当前节点的结束标签之后的所有节点。 |
namespace |
选取当前节点的所有命名空间节点。 |
parent |
选取当前节点的父节点。 |
preceding |
选取文档中当前节点的开始标签之前的所有节点。 |
preceding-sibling |
选取当前节点之前的所有同级节点。 |
self |
选取当前节点。 |
位置路径表达式
位置路径可以是绝对的,也可以是相对的。
绝对路径起始于正斜杠( / ),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:
绝对位置路径:
/step/step/...
相对位置路径:
step/step/...
每个步均根据当前节点集之中的节点来进行计算。
步(step)包括:
轴(axis)
定义所选节点与当前节点之间的树关系
节点测试(node-test)
识别某个轴内部的节点
零个或者更多谓语(predicate)
更深入地提炼所选的节点集
步语法 轴名称::节点测试[谓语]
例子 |
结果 |
child::book |
选取所有属于当前节点的子元素的 book 节点。 |
attribute::lang |
选取当前节点的 lang 属性。 |
child::* |
选取当前节点的所有子元素。 |
attribute::* |
选取当前节点的所有属性。 |
child::text() |
选取当前节点的所有文本子节点。 |
child::node() |
选取当前节点的所有子节点。 |
descendant::book |
选取当前节点的所有 book 后代。 |
ancestor::book |
选择当前节点的所有 book 先辈。 |
ancestor-or-self::book |
选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点) |
child::*/child::price |
选取当前节点的所有 price 孙节点。 |
(2)演示
Xml文档
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore> // 根
<book category="COOKING"> // 子元素和属性
<title lang="en">Everyday Italian</title> // 子的子
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
选取所有的title节点
/bookstore/book/title (绝对路径)
选取第一个title节点
/bookstore/book[1]/title
问题:IE5 以及更高版本将 [0] 视为第一个节点,而根据 W3C 的标准,应该是 [1]。
解决方法:
xml.setProperty("SelectionLanguage","XPath"); // 用了这句话,输出HarryPotter [0][1]
//注销,输出everyday Italian [1]
var nodes=xml.selectNodes(path);
选出所有价格
/bookstore/book/price
(3) 网页加载xml
function loadXMLDoc(dname)
{
if (window.XMLHttpRequest)
{
xhttp=new XMLHttpRequest();
//所有现代浏览器都支持使用 XMLHttpRequest 来加载 XML 文档的方法
}
else
{
xhttp=new ActiveXObject("Microsoft.XMLHTTP");
//老版古老的微软浏览器(IE 5 和 6)
}
xhttp.open("GET",dname,false);
xhttp.send("");
return xhttp.responseXML;
}
xml=loadXMLDoc("/example/xmle/books.xml");
path="/bookstore/book/title" ; //制定读取节点的路径
//读xml节点内容
// code for IE
if (window.ActiveXObject)
{
var nodes=xml.selectNodes(path);
// Internet Explorer 使用 selectNodes() 方法从 XML 文档中的选取节点:
for (i=0;i<nodes.length;i++)
{
document.write(nodes[i].childNodes[0].nodeValue);
document.write("<br />");
}
}
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
var nodes=xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null);
// Firefox、Chrome、Opera 以及 Safari 使用 evaluate() 方法从 XML 文档中选取节点:
var result=nodes.iterateNext();
while (result)
{
document.write(result.childNodes[0].nodeValue);
document.write("<br />");
result=nodes.iterateNext();
}
}
7. XSLT
(1)简介
XSL 指扩展样式表语言(EXtensible Stylesheet Language)。
XSLT
· XSLT 指 XSL 转换(XSL Transformations)。
· XSLT 是 XSL 中最重要的部分。
· XSLT 可将一种 XML 文档转换为另外一种 XML 文档。
· XSLT 使用 XPath 在 XML 文档中进行导航。
· XPath 是一个 W3C 标准。
(2)示例
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" //表明此文档是一个stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"> //xsl:template定义一个模板,match="/" 属性则把此模板与 XML 源文档的根相联系
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd"> //循环
<xsl:if test="price > 10"> //条件判断
<xsl:sort select="artist"/> // 排序
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
(3)节点
<xsl:value-of> 元素
<xsl:value-of> 元素用于提取某个选定节点的值,并把值添加到转换的输出流中
例如:
<td><xsl:value-of select="catalog/cd/artist"/></td>
select 属性的值是一个 XPath 表达式
<xsl:for-each> 元素
<xsl:for-each> 元素可用于选取指定的节点集中的每个 XML 元素 (相当于循环)
<xsl:for-each select="catalog/cd">
select 属性的值是一个 XPath 表达式。此表达式的工作方式类似于定位某个文件系统,在其中正斜杠可选择子目录。
在循环时,选择指定条件的信息。选择属性的判别式
<xsl:for-each select="catalog/cd[artist='Bob Dylan']">
合法的过滤运算符:
· = (等于)
· != (不等于)
· < (小于)
· > (大于
<xsl:sort>
元素用于对结果进行排序。
如需对结果进行排序,只要简单地在 XSL 文件中的 <xsl:for-each> 元素内部添加一个 <xsl:sort>
<xsl:if> 元素
<xsl:if test="expression">
...
...如果条件成立则输出...
...
</xsl:if>
<xsl:choose> 元素
<xsl:choose>
<xsl:when test="expression">
... 输出 ...
</xsl:when>
<xsl:otherwise>
... 输出 ....
</xsl:otherwise>
</xsl:choose>
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<xsl:choose>
<xsl:when test="price > 10">
<td bgcolor="#ff00ff">
<xsl:value-of select="artist"/></td>
</xsl:when>
<xsl:when test="price > 9">
<td bgcolor="#cccccc">
<xsl:value-of select="artist"/></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="artist"/></td>
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
<xsl:apply-templates> 元素
<xsl:apply-templates> 元素可把一个模板应用于当前的元素或者当前元素的子节点。
假如我们向 <xsl:apply-templates> 元素添加一个 select 属性,此元素就会仅仅处理与属性值匹配的子元素。我们可以使用 select 属性来规定子节点被处理的顺序。
(4)客户端
<html>
<body>
<script type="text/javascript">
// Load XML
var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async = false
xml.load("cdcatalog.xml")
// Load XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("cdcatalog.xsl")
// Transform
document.write(xml.transformNode(xsl))
</script>
</body>
</html>
第一段代码创建了微软的 XML 解析器的一个实例,然后把 XML 文件载入了内存。第二段代码创建了解析器的另一个实例,然后把这个 XSL 文件载入了内存。最后一行代码使用 XSL 文档转换了 XML 文档,并在浏览器中把结果作为 XHTML 显示出来。任务完成!
(5)在服务器上
8. XSL-FO教程
(1)简介
· XSL-FO 是用于格式化 XML 数据的语言
· XSL-FO 指可扩展样式表语言格式化对象(Extensible Stylesheet Language Formatting Objects)
· XSL-FO 是一个 W3C 推荐标准
· XSL-FO 目前通常被称为 XSL
XSL-FO 文档是带有输出信息的 XML 文件。它们包含着有关输出布局以及输出内容的信息。
XSL-FO 文档存储在以 .fo 或 .fob 为后缀的文件中。以 .xml 为后缀存储的 XSL-FO 文档也很常见,这样做的话可以使 XSL-FO 文档更易被 XML 编辑器存取
(2)示例
XSL-FO 的文档结构类似这样:
<?xml version="1.0" encoding="ISO-8859-1"?> // xml文档的声明
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> //根元素、命名空间
(此处是XSL-FO文档的内容 )
<fo:layout-master-set> //元素含有一个或过个页面模板
<fo:simple-page-master master-name="A4">
//元素包含一个单一的页面模板。每个模板须有一个唯一的名称(master-name):
<!-- Page template goes here -->
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4">
//master-reference 属性使用相同的名称来引用 simple-page-master 模板:
<!-- Page content goes here -->
</fo:page-sequence>
</fo:root>
XSL-FO Pages(页面)
XSL-FO 输出会被格式化到页面中。打印输出通常会进入分为许多分割的页面。浏览器输出经常会成为一个长的页面。
XSL-FO 页面包含区域(Region)。
XSL-FO Regions(区)
每个 XSL-FO 页面均包含一系列的 Regions(区):
· region-body (页面的主体)
· region-before (页面的页眉)
· region-after (页面的页脚)
· region-start (左侧栏)
· region-end (右侧栏)
XSL-FO Regions 包含块区域(Block Area)。
XSL-FO Block Areas(块区域)
XSL-FO 块区域可定义小的块元素(通常由一个新行开始),比如段落、表格以及列表。
XSL-FO 块区域可包含其他的块区域,不过大多数时候它们包含的是行区域(Line Area)。
<fo:page-sequence>
<fo:flow flow-name="xsl-region-body">
<fo:block>
<!-- Output goes here -->
</fo:block>
</fo:flow>
</fo:page-sequence>
块区域的属性:
<fo:block border-width="1mm">
这个输出块周围有一条一毫米的边框。
</fo:block>
图示:
space before 和 space after 是块与块之间起分割作用的空白。
margin 是块外侧的空白区域。
border 的区域外部边缘的矩形。其四个边均可有不同的宽度。它也可被填充为不同的颜色和背景图像。
padding 是位于内容区域与边框之间的区域。
内容区域可包含实际的内容,比如文本、图片、图形等等。
块边距:
· margin
· margin-top
· margin-bottom
· margin-left
· margin-right
块边框样式属性:
· border-style
· border-before-style
· border-after-style
· border-start-style
· border-end-style
· border-top-style ((等同于 border-before)
· border-bottom-style (等同于 border-after)
· border-left-style (等同于 border-start)
· border-right-style (等同于 border-end)
边框颜色属性:
· border-color
· border-before-color
· border-after-color
· border-start-color
· border-end-color
· border-top-color (等同于 border-before)
· border-bottom-color (等同于 border-after)
· border-left-color (等同于 border-start)
· border-right-color (等同于 border-end)
边框宽度属性:
· border-width
· border-before-width
· border-after-width
· border-start-width
· border-end-width
· border-top-width (等同于 border-before)
· border-bottom-width (等同于 border-after)
· border-left-width (等同于 border-start)
· border-right-width (等同于 border-end)
块填充
· padding
· padding-before
· padding-after
· padding-start
· padding-end
· padding-top (等同于 padding-before)
· padding-bottom (等同于 padding-after)
· padding-left (等同于 padding-start)
· padding-right (等同于 padding-end)
块背景
· background-color
· background-image
· background-repeat
· background-attachment (scroll 或者 fixed)
块样式属性:
块是可被单独样式化的输出序列:
<fo:block
font-size="12pt"
font-family="sans-serif">
This block of output will be written in a 12pt sans-serif font.
</fo:block>
字体属性:
· font-family
· font-weight
· font-style
· font-size
· font-variant
文本属性:
· text-align
· text-align-last
· text-indent
· start-indent
· end-indent
· wrap-option (定义自动换行,word wrap)
· break-before (定义分页符,page breaks)
· break-after (定义分页符,page breaks)
· reference-orientation (定义 90" 内的文字旋转)
示例
<fo:block
font-size="14pt" font-family="verdana" color="red"
space-before="5mm" space-after="5mm">
W3School
</fo:block>
<fo:block
text-indent="5mm"
font-family="verdana" font-size="12pt"
space-before="5mm" space-after="5mm">
At W3School you will find all the Web-building tutorials you
need, from basic HTML and XHTML to advanced XML, XSL, Multimedia
and WAP.
</fo:block>
XSL-FO Line Areas(行区域)
XSL-FO 行区域定义了块区域内部的文本行。
XSL-FO 行区域包含行内区域(Inline Area)。
XSL-FO 页面(Page)、流(Flow)以及块(Block)
XSL-FO 输出通常被嵌套在 <fo:block> 元素中,<fo:block> 嵌套于 <fo:flow> 元素中,<fo:flow> 嵌套于 <fo:page-sequence> 元素中:
<fo:page-sequence>
<fo:flow flow-name="xsl-region-body">
//flow-name 属性的值定义 <fo:flow> 元素的内容会去往何处。
· xsl-region-body (进入 region-body)
· xsl-region-before (进入 region-before)
· xsl-region-after (进入 region-after)
· xsl-region-start (进入 region-start)
· xsl-region-end (进入 region-end)
<fo:block>
<!-- Output goes here -->
</fo:block>
</fo:flow>
</fo:page-sequence>
XSL-FO 页面顺序
XSL-FO 使用 <fo:page-sequence> 元素来定义输出页面。
每个输出页面都会引用一个定义布局的 page master。
每个输出页面均有一个定义输出的 <fo:flow>元素。
每个输出页面均会按顺序(序列)被打印或显示。
XSL-FO 页面模板示例
XSL-FO 使用名为 "Page Masters" 的页面模板来定义页面的布局。每个模板必须拥有一个唯一的名称:
<fo:simple-page-master master-name="intro">
<fo:region-body margin="5in" />
</fo:simple-page-master>
<fo:simple-page-master master-name="left">
<fo:region-body margin-left="2in" margin-right="3in" />
</fo:simple-page-master>
<fo:simple-page-master master-name="right">
<fo:region-body margin-left="3in" margin-right="2in" />
</fo:simple-page-master>
XSL-FO 页面尺寸
XSL-FO 使用下面的属性来定义页面尺寸:
page-width
定义页面的宽度
page-height
定义页面的高度
XSL-FO 页面边距
XSL-FO 使用下面的属性定义页面边距:
margin-top
定义上边距
margin-bottom
定义下边距
margin-left
定义左边距
margin-right
定义右边距
margin
定义所有边的边距
XSL-FO 页面区(Page Regions)
region-body
定义主体区
region-before
定义顶部区 (页眉)
region-after
定义底部区 (页脚)
region-start
定义左侧区 (左侧栏)
region-end
定义右侧区 (右侧栏)
布局图展
<fo:simple-page-master master-name="A4" // 定义了名称为A4 的Simple Page Master Template
page-width="297mm" page-height="210mm" //页面
margin-top="1cm" margin-bottom="1cm" //边距
margin-left="1cm" margin-right="1cm">
<fo:region-body margin="3cm"/> // 主体边距
<fo:region-before extent="2cm"/>
<fo:region-after extent="2cm"/>
<fo:region-start extent="2cm"/>
<fo:region-end extent="2cm"/>
</fo:simple-page-master
XSL-FO 列表
简介
有四种 XSL-FO 对象可用来创建列表:
fo:list-block
包含整个列表。
fo:list-item
包含列表中的每个项目。
fo:list-item-label
包含用于 list-item 的标记 - 典型地,包含一个数字或者字符的 <fo:block> 。
fo:list-item-body
包含 list-item 的主体或内容 - 典型地,一个或多个 <fo:block> 对象。
一个 XSL-FO 列表实例:
fo:list-block>
<fo:list-item>
<fo:list-item-label>
<fo:block>*</fo:block>
</fo:list-item-label>
<fo:list-item-body>
<fo:block>Volvo</fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item>
<fo:list-item-label>
<fo:block>*</fo:block>
</fo:list-item-label>
<fo:list-item-body>
<fo:block>Saab</fo:block>
</fo:list-item-body>
</fo:list-item>
</fo:list-block>
以上代码的输出:
XSL-FO表格
简介
XSL-FO 使用 <fo:table-and-caption> 元素来定义表格。它包含一个<fo:table>以及一个可选的<fo:caption>元素
有九种 XSL-FO 对象可用来创建表格:
fo:table-and-caption :1) fo:table
2) fo:table-caption
fo:table: 1) fo:table-column 可选
2) fo:table-header 可选
3) fo:table-footer 可选
4) fo:table-body
这些元素中可能含有一个或多个fo:table-row 包含一个或多个 fo:table-cell
示例
<fo:table-and-caption>
<fo:table>
<fo:table-column column-width="25mm"/>
<fo:table-column column-width="25mm"/>
<fo:table-header>
<fo:table-row>
<fo:table-cell>
<fo:block font-weight="bold">Car</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-weight="bold">Price</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block>Volvo</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>$50000</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>SAAB</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>$48000</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:table-and-caption>
XSL-FO与XSLT 的结合
示例:
<fo:block
font-size="14pt" font-family="verdana" color="red"
space-before="5mm" space-after="5mm">
W3School
</fo:block>
<fo:block
text-indent="5mm"
font-family="verdana" font-size="12pt"
space-before="5mm" space-after="5mm">
At W3School you will find all the Web-building tutorials you
need, from basic HTML and XHTML to advanced XML, XSL, Multimedia
and WAP.
</fo:block>
从文档中移除XSL-FO 信息
<header>
W3School
</header>
<paragraph>
At W3School you will find all the Web-building tutorials you
need, from basic HTML and XHTML to advanced XML, XSL, Multimedia
and WAP.
</paragraph>
添加 XSLT 转换:
<xsl:template match="header">
<fo:block
font-size="14pt" font-family="verdana" color="red"
space-before="5mm" space-after="5mm">
<xsl:apply-templates/>
</fo:block>
</xsl:template>
<xsl:template match="paragraph">
<fo:block
text-indent="5mm"
font-family="verdana" font-size="12pt"
space-before="5mm" space-after="5mm">
<xsl:apply-templates/>
</fo:block>
</xsl:template>
XSL-FO 参考手册
将描述转换为呈现的过程被称为格式化(formatting)。
对象 |
描述 |
basic-link |
定义一个链接的起始资源 |
bidi-override |
Overrides the default Unicode BIDI direction |
block |
定义一个输出块(比如段落和标题) |
block-container |
定义一个块级的引用区域(reference-area) |
character |
定义一个字符,该字符会被映射为供呈现的字形 |
color-profile |
定义样式表的一个颜色配置文件 |
conditional-page-master-reference |
规定一个当所定义的条件成立时使用的page-master |
declarations |
组合针对某个样式表的全局声明 |
external-graphic |
用于图像数据位于XML结果树之外的某个图形 |
float |
典型的用法是,在页面起始位置的某个单独的区域放置一幅图片,或者把一幅图片放置到一侧,而内容则流动至图片的旁边。 |
flow |
包含所有被输出到页面的元素 |
footnote |
定义在页面的region-body内部的一个脚注 |
footnote-body |
定义脚注的内容 |
initial-property-set |
格式化<fo:block>的第一行 |
inline |
通过背景或者将其包围在一个边框中,来格式化文本的某个部分 |
inline-container |
定义一个行内的引用区域(inline reference-area) |
instream-foreign-object |
用于行内图形(inline graphics)或用于普通对象,其中对象的数据作为<fo:instream-foreign-object>的后代存在。 |
layout-master-set |
存有所有用在文档中的master |
leader |
用来生成"."由内容表格中的页码来分隔标题,或者创建表单中的输入域,或者创建水平线 |
list-block |
定义列表 |
list-item |
包含列表中的每个项目 |
list-item-body |
包含列表项的内容或主体 |
list-item-label |
包含列表项的标号(有代表性的是数据、字符等等) |
marker |
与fo:retrieve-marker使用来创建连续的页面或页脚 |
multi-case |
包含 XSL-FO对象的每个供选择的子树(在<fo:multi-switch>内部)。父元素<fo:multi-switch>会选择显示那个选项并隐藏其余的选项。 |
multi-properties |
用来在两个或更多的属性集(property-sets)间转换 |
multi-property-set |
规定一个可供选择的属性集,这个属性集会被根据用户代理的状态来进行应用。 |
multi-switch |
存有一个或多个<fo:multi-case>对象,并控制它们之间的切换(通过<fo:multi-toggle>激活) |
multi-toggle |
用来切换到另一个<fo:multi-case> |
page-number |
表示当前的页面 |
page-number-citation |
为页面引用页码,此页面包含首个由被引用对象返回的标准区域。 |
page-sequence |
一个针对页面输出元素的容器。在其中一个<fo:page-sequence>对象针对每个页面布局。 |
page-sequence-master |
规定使用哪个simple-page-master,以及使用次序。 |
region-after |
定义页脚 |
region-before |
定义页眉 |
region-body |
定义页面主体 |
region-end |
定义页面的右侧栏 |
region-start |
定义页面的左侧栏 |
repeatable-page-master-alternatives |
定义一套simple-page-master的副本 |
repeatable-page-master-reference |
规定一个简单的simple-page-master的副本 |
retrieve-marker |
与<fo:marker>一同使用来创建连续页眉或者页脚 |
root |
XSL-FO文档的根(顶)节点 |
simple-page-master |
定义页面的尺寸和形状 |
single-page-master-reference |
规定用在页面序列的某个给定的点的一个 |
static-content |
包含在许多页面上重复的静态内容(比如页眉和页脚) |
table |
格式化一个表格的表格式的材料 |
table-and-caption |
格式化一个表格及其标题 |
table-body |
表格行和表格单元的容器 |
table-caption |
包含一个表格的标题 |
table-cell |
定义表格单元 |
table-column |
格式化表格的列 |
table-footer |
定义表格的页脚 |
table-header |
定义表格的页眉 |
table-row |
定义表格的行 |
title |
为页面序列定义一个标题 |
wrapper |
为一组XSL-FO对象规定继承属性 |
9. XQuery
(1)简介
· XQuery 是用于 XML 数据查询的语言
· XQuery 对 XML 的作用类似 SQL 对数据库的作用
· XQuery 被构建在 XPath 表达式之上
· XQuery 被所有主要的数据库引擎支持(IBM、Oracle、Microsoft等等)
· XQuery 是 W3C 标准。
XQuery 术语
在 XQuery 中,有七种节点:元素、属性、文本、命名空间、处理指令、注释、以及文档(根)节点
(2)语法
规则
打开xml文件
· XQuery 对大小写敏感
· XQuery 的元素、属性以及变量必须是合法的 XML 名称。
· XQuery 字符串值可使用单引号或双引号。
· XQuery 变量由 “$” 并跟随一个名称来进行定义,举例,$bookstore
· XQuery 注释被 (: 和 :) 分割,举例,(: XQuery 注释 :)
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
XQuery 使用函数来提取 XML 文档中的数据
doc("books.xml")
路径表达式
下面的路径表达式用于在 "books.xml" 文件中选取所有的 title 元素:
doc("books.xml")/bookstore/book/title
结果:<title lang="en">Everyday Italian</title>
<title lang="en">Harry Potter</title>
<title lang="en">XQuery Kick Start</title>
<title lang="en">Learning XML</title>
谓语
doc("books.xml")/bookstore/book[price<30]
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
(3)使用Flwor
doc("books.xml")/bookstore/book[price>30]/title
下面这个 FLWOR 表达式所选取的数据和上面的路径表达式是相同的:
for $x in doc("books.xml")/bookstore/book
where $x/price>30
return $x/title
通过 FLWOR,您可以对结果进行排序:
for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
for
(可选) 向每个由 in 表达式返回的项目捆绑一个变量
for $x in (1 to 5)
return <test>{$x}</test>
结果:
<test>1</test>
<test>2</test>
<test>3</test>
<test>4</test>
<test>5</test>
关键词 at 可用于计算迭代:
for $x at $i in doc("books.xml")/bookstore/book/title
return <book>{$i}. {data($x)}</book>
结果:
<book>1. Everyday Italian</book>
<book>2. Harry Potter</book>
<book>3. XQuery Kick Start</book>
<book>4. Learning XML</book>
在 for 语句中同样允许多个 in 表达式。请使用逗号来分割每一个 in 表达式:
for $x in (10,20), $y in (100,200)
return <test>x={$x} and y={$y}</test>
结果:
<test>x=10 and y=100</test>
<test>x=10 and y=200</test>
<test>x=20 and y=100</test>
<test>x=20 and y=200</test>
let
(可选)
let 语句可完成变量分配,并可避免多次重复相同的表达式。let 语句不会导致迭代。
let $x := (1 to 5)
return <test>{$x}</test>
结果:
<test>1 2 3 4 5</test>
where
(可选) 设定一个条件
用于为结果设定一个或多个条件(criteria)。
where $x/price>30 and $x/price<100
order by
(可选) 设定结果的排列顺序
order by 语句用于规定结果的排序次序。此处,我们要根据 category 和 title 来对结果进行排序:
for $x in doc("books.xml")/bookstore/book
order by $x/@category, $x/title
return $x/title
return
规定在结果中返回的内容
FLWOR 是 "For, Let, Where, Order by, Return" 的只取首字母缩写。
for 语句把 bookstore 元素下的所有 book 元素提取到名为 $x 的变量中。
where 语句选取了 price 元素值大于 30 的 book 元素。
order by 语句定义了排序次序。将根据 title 元素进行排序。
return 语句规定返回什么内容。在此返回的是 title 元素。
上面的 XQuery 表达式的结果:
(4)在HTML列表中提交结果
<ul>
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return <li>{$x}</li>
}
</ul>
<ul>
<li><title lang="en">Everyday Italian</title></li>
<li><title lang="en">Harry Potter</title></li>
<li><title lang="en">Learning XML</title></li>
<li><title lang="en">XQuery Kick Start</title></li>
</ul>
现在我们希望去除 title 元素,而仅仅显示 title 元素内的数据。
<ul>
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return <li>{data($x)}</li>
}
</ul>
<ul>
<li>Everyday Italian</li>
<li>Harry Potter</li>
<li>Learning XML</li>
<li>XQuery Kick Start</li>
</ul>
If then else 语句
for $x in doc("books.xml")/bookstore/book
return if ($x/@category="CHILDREN")
then <child>{data($x/title)}</child>
else <adult>{data($x/title)}</adult>
上面的例子的结果:
<adult>Everyday Italian</adult>
<child>Harry Potter</child>
<adult>Learning XML</adult>
<adult>XQuery Kick Start</adult>
比较
在 XQuery 中,有两种方法来比较值。
1. 通用比较:=, !=, <, <=, >, >=
2. 值的比较:eq、ne、lt、le、gt、ge
这两种比较方法的差异如下:
请看下面的 XQuery 表达式:
$bookstore//book/@q > 10
如果 q 属性的值大于 10,上面的表达式的返回值为 true。
$bookstore//book/@q gt 10
如果仅返回一个 q,且它的值大于 10,那么表达式返回 true。如果不止一个 q 被返回,则会发生错误。
向结果添加元素
<html>
<body>
<h1>Bookstore</h1>
<ul>
{
for $x in doc("books.xml")/bookstore/book
order by $x/title
return <li>{data($x/title)}. Category: {data($x/@category)}</li>
}
</ul>
</body>
</html>
<html>
<body>
<h1>Bookstore</h1>
<ul>
<li>Everyday Italian. Category: COOKING</li>
<li>Harry Potter. Category: CHILDREN</li>
<li>Learning XML. Category: WEB</li>
<li>XQuery Kick Start. Category: WEB</li>
</ul>
</body>
</html>
添加属性
<html>
<body>
<h1>Bookstore</h1>
<ul>
{
for $x in doc("books.xml")/bookstore/book
order by $x/title
return <li class="{data($x/@category)}">{data($x/title)}</li>
}
</ul>
</body>
</html>
html>
<body>
<h1>Bookstore</h1>
<ul>
<li class="COOKING">Everyday Italian</li>
<li class="CHILDREN">Harry Potter</li>
<li class="WEB">Learning XML</li>
<li class="WEB">XQuery Kick Start</li>
</ul>
</body>
</html>
(5)XQuery函数
XQuery 函数命名空间的 URI:
http://www.w3.org/2005/02/xpath-functions
调用函数
在元素中
<name>{uppercase($booktitle)}</name>
在路径表达式的谓语中
doc("books.xml")/bookstore/book[substring(title,1,5)='Harry']
在 let 语句中
let $name := (substring($booktitle,1,4))
自定义函数
语法:
declare function 前缀:函数名($参数 AS 数据类型) //必须使用前缀名
AS 返回的数据类型
{
(: ...函数代码... :)
};
Eg:
declare function local:minPrice(
$price as xs:decimal?,
$discount as xs:decimal?)
AS xs:decimal?
{
let $disc := ($price * $discount) div 100
return ($price - $disc)
};
调用函数
<minPrice>{local:minPrice($book/price, $book/discount)}</minPrice>
10. Xlink和XPoint
(1)Xlink简介
XLink 定义了一套标准的在 XML 文档中创建超级链接的方法。
XPointer 使超级链接可以指向 XML 文档中更多具体的部分(片断)。
(2)XPoint
在 HTML 中,我们可创建一个既指向某个 HTML 页面又指向 HTML 页面内某个书签的超级链接(使用#)。
有时,可指向更多具体的内容会更有好处。举例,我们需要指向某个特定的列表的第三个项目,或者指向第五段的第二行。通过 XPointer 是很容易做到的
href="http://www.example.com/cdlist.xml#id('rock').child(5,item)"
(3)Link示例讲解
<?xml version="1.0"?>
<homepages xmlns:xlink="http://www.w3.org/1999/xlink">
<homepage xlink:type="simple"
xlink:href="http://www.w3school.com.cn">Visit W3School</homepage>
<homepage xlink:type="simple"
xlink:href="http://www.w3.org">Visit W3C</homepage>
</homepages>
1) 为了访问 XLink 的属性和特性,我们必须在文档的顶端声明 XLink 命名空间。
XLink 的命名空间是:"http://www.w3.org/1999/xlink"。
2) <homepage> 元素中的 xlink:type 和 xlink:href 属性定义了来自 XLink 命名空间的 type 和 href 属性。
xlink:type="simple" 可创建一个简单的两端链接(意思是“从这里到哪里”)。稍后我们会研究多端链接(多方向)。
(4)XML 链接文档
不止能够链接到整个文档(当使用 XLink 时),XPointer 允许您链接到文档的特定部分。如需链接到页面的某个具体的部分,请在 xlink:href 属性中的 URL 后添加一个井号 (#) 以及一个 XPointer 表达式。
表达式:#xpointer(id("Rottweiler")) 可引用目标文档中 id 值为 "Rottweiler" 的元素。
因此,xlink:href 属性会类似这样:xlink:href="http://dog.com/dogbreeds.xml#xpointer(id('Rottweiler'))"
不过,当使用 id 链接到某个元素时,XPointer 允许简写形式。您可以直接使用 id 的值,就像这样:xlink:href="http://dog.com/dogbreeds.xml#Rottweiler"。
XLink手册
XLink 属性 参考手册
属性 |
值 |
描述 |
xlink:actuate |
· onLoad · onRequest · other · none |
定义何时读取和显示被链接的资源。 |
xlink:href |
URL |
要链接的 URL。 |
xlink:show |
· embed · new · replace · other · none |
在何处打开链接。Replace 是默认值。 |
xlink:type |
· simple · extended · locator · arc · resource · title · none |
链接的类型。 |