zoukankan      html  css  js  c++  java
  • xml 相关的知识

     

     

     

    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 &lt; 1000 then</message>

     

    5个预定义的实体引用

     

    &lt;

    < 

    小于

    &gt;

    > 

    大于

    &amp;

    &

    和号

    &apos;

    '

    单引号

    &quot;

    "

    引号

     

     

    7)空格会被保留

    8)xmlLF存储换行

    9xml文档包含xml元素

    XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分

     

    2xml命名规则

    ·  名称可以含字母、数字以及其他的字符

    ·  名称不能以数字或者标点符号开始

    ·  名称不能以字符 “xml”(或者 XMLXml)开始

    ·  名称不能包含空格

    3 最佳命名习惯

     

    ·  使名称具有描述性。使用下划线的名称也很不错。

    ·  名称应当比较简短,比如:<book_title>,而不是:<the_title_of_the_book>

    ·  避免 "-" 字符。如果您按照这样的方式进行命名:"first-name",一些软件会认为你需要提取第一个单词。

    ·  避免 "." 字符。如果您按照这样的方式进行命名:"first.name",一些软件会认为 "name" 是对象 "first" 的属性。

    ·  避免 ":" 字符。冒号会被转换为命名空间来使用(稍后介绍)。

    ·  XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。有一个实用的经验,即使用数据库的名称规则来命名 XML 文档中的元素。

    (4)xml 元素是可扩展的

     

    就是指在已经做好的xml文档,我们仍然可以向文档添加一些信息

    5xml属性

     

    1)      Xml元素可以在开始标签汇总包含属性,类似HTML

    属性提供元素元素的额外(附加)信息

     

    2)      Xml 属性必须加引号 ,单或双引均可

    Eg: <person sex="female">   <person sex='female'>

    注意:如果属性值本身包含双引号,那么有必要使用单引号包围它

     

    或者可以用实体引用代替本省的双引号

    Eg:

    <gangster name='George "Shotgun" Ziegler'>

    <gangster name="George &quot;Shotgun&quot; 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 来验证 XMLFirefox, 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+FirefoxChromeSafari 以及 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);

    // FirefoxChromeOpera 以及 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="/">     //xsltemplate定义一个模板,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 &gt; 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']">

    合法的过滤运算符:

    ·  =  (等于)

    ·  != (不等于)

    ·  &lt; (小于)

    ·  &gt; (大于

    <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 &gt; 10">

                <td bgcolor="#ff00ff">

                <xsl:value-of select="artist"/></td>

              </xsl:when>

              <xsl:when test="price &gt; 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-FOXSLT 的结合

    示例:

    <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 参考手册

    ·         Previous Page

    ·         Next Page

    将描述转换为呈现的过程被称为格式化(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 被所有主要的数据库引擎支持(IBMOracleMicrosoft等等)

    ·  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.    值的比较:eqneltlegtge

    这两种比较方法的差异如下:

    请看下面的 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>

     

     

     

     

    5XQuery函数

    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.  XlinkXPoint

     

    (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

    链接的类型。

     

     

     

     

     

  • 相关阅读:
    sql-server数据库中利用触发器实现表与表之间的级联删除
    求任意长度数组的最大值(整数类型)。利用params参数实现任意长度的改变。
    params参数的调用
    C# 参考之方法参数关键字:params、ref及out
    写一个方法求数组中的最大值,最小值,总和以及平均值。
    写一个方法来解析一元二次方程。
    创建一个方法来判断是否为闰年。。
    构造方法
    总结重写和重载区别
    DelegatingActionProxy
  • 原文地址:https://www.cnblogs.com/Jennie/p/2152079.html
Copyright © 2011-2022 走看看