XSL 语言@等通配符,XPath等的说明

来源:互联网 发布:非农数据网址 编辑:程序博客网 时间:2024/05/02 00:24

XSL语言 2011-01-19 12:00:35

分类:

XSL 指扩展样式表语言(EXtensible Stylesheet Language

CSS = HTML样式表

HTML 使用预先定义的标签,标签的意义很容易被理解。

HTML 元素中的 <table> 元素定义表格 - 并且浏览器清楚如何显示它。

向 HTML 元素添加样式是很容易的。通过 CSS,很容易告知浏览器用特定的字体或颜色显示一个元素。

 

XSL = XML样式表

XML 不使用预先定义的标签(我们可以使用任何喜欢的标签名),并且这些标签的意义并不都那么容易被理解。

<table> 元素意味着一个 HTML 表格,一件家具,或是别的什么东西 - 浏览器不清楚如何显示它。

XSL 可描述如何来显示 XML文档!

XSLT是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。

XPath是一种用于在 XML 文档中进行导航的语言。

 

XPath简介

 

XPath路径表达式

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

节点(Node

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

下面列出了最有用的路径表达式:

表达式

描述

nodename

选取此节点的所有子节点

/

从根节点选取

//

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置

.

选取当前节点

..

选取当前节点的父节点

@

选取属性

实例

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式

结果

bookstore

选取 bookstore 元素的所有子节点

/bookstore

选取根元素 bookstore

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book

选取所有属于 bookstore 的子元素的 book 元素。

//book

选取所有 book 子元素,而不管它们在文档中的位置。

bookstore//book

选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。

//@lang

选取所有名为 lang 的属性。

谓语(Predicates

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

实例

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式

结果

/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。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符

描述

*

匹配任何元素节点

@*

匹配任何属性节点

node()

匹配任何类型的节点

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式

结果

/bookstore/*

选取 bookstore 元素的所有子节点

//*

选取文档中的所有元素

//title[@*]

选取所有带有属性的 title 元素。

选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式

结果

//book/title | //book/price

选取所有 book 元素的 title 和 price 元素。

//title | //price

选取所有文档中的 title 和 price 元素。

/bookstore/book/title | //price

选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。

 


实例研究:如何使用 XSLT 将 XML 转换为 XHTML。

从一个原始的 XML文档开始

我们现在要把下面这个 XML文档("cdcatalog.xml")转换为 XHTML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
 
<cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
.
.

创建 XSL样式表

然后创建一个带有转换模板的 XSL样式表("cdcatalog.xsl"):

<?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 align="left">Title</th> <th align="left">Artist</th> </tr> <xsl:for-each select="catalog/cd">

<tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each>

 </table>

 </body>

</html>

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

.
</catalog>

 

把 XSL样式表链接到 XML 文档

向 XML 文档("cdcatalog.xml")添加 XSL 样式表引用:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<catalog>
 
<cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
.
.
.
</catalog>

如果您使用的浏览器兼容 XSLT,它会很顺利地把您的 XML 转换为 XHTML。

XSL 样式表由一个或多套被称为模板(template)的规则组成。

每个模板含有当某个指定的节点被匹配时所应用的规则。

<xsl:template>元素

<xsl:template>元素用于构建模板。

match 属性用于关联 XML 元素和模板。match 属性也可用来为整个文档定义模板。match 属性的值是 XPath 表达式(举例,match="/" 定义整个文档)。

<xsl:template>元素定义了一个模板。而 match="/" 属性则把此模板与 XML 源文档的根相联系。

<xsl:template>元素内部的内容定义了写到输出结果的 HTML 代码。

最后两行定义了模板的结尾,及样式表的结尾。

<xsl:value-of>元素

<xsl:value-of>元素用于提取某个选定节点的值,并把值添加到转换的输出流中:

 

<xsl:for-each>元素

<xsl:for-each>元素可用于选取指定的节点集中的每个 XML 元素。

结果过滤

通过在 <xsl:for-each>元素中添加一个选择属性的判别式,我们也可以过滤从 XML 文件输出的结果。

<xsl:for-each select="catalog/cd[artist='Bob Dylan']">

合法的过滤运算符:

·         =  (等于)

·         != (不等于)

·         &lt; (小于)

·         &gt; (大于)

 

在何处放置排序信息

如需对结果进行排序,只要简单地在 XSL文件中的 <xsl:for-each> 元素内部添加一个 <xsl:sort> 元素:

在何处放置 <xsl:if>元素

如需添加有条件的测试,请在 XSL文件中的 <xsl:for-each> 元素内部添加 <xsl:if> 元素:

XSLT <xsl:choose>元素用于结合 <xsl:when> 和 <xsl:otherwise> 来表达多重条件测试。

 

<xsl:apply-templates>元素可把一个模板应用于当前的元素或者当前元素的子节点。

假如我们向 <xsl:apply-templates>元素添加一个 select 属性,此元素就会仅仅处理与属性值匹配的子元素。我们可以使用 select 属性来规定子节点被处理的顺序。

 

XSL-FO和格式化有关

XSL-FO 是一种基于 XML 的标记语言,用于描述向屏幕、纸或者其他媒介输出 XML 数据的格式化(信息)。

XSL-FO使用矩形框(区域)来显示输出。

所有的输出都会被格式化到这些框中,然后会被显示或打印到某个目标媒介。

让我们研究一下下面这些区域:

·         Pages(页面)

·         Regions(区)

·         Block areas(块区域)

·         Line areas(行区域)

·         Inline areas(行内区域)

 

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)。

XSL-FO Line Areas(行区域)

XSL-FO 行区域定义了块区域内部的文本行。

XSL-FO 行区域包含行内区域(Inline Area)。

XSL-FO Inline Areas(行内区域)

XSL-FO 行内区域定了行内部的文本(着重号、单字符以及图像等等)。

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">
    <fo:block>
      <!-- Output goes here -->
    </fo:block>
  </fo:flow>

XSL-FO实例

现在让我们看一个真实的 XSL-FO实例:

<?xml version="1.0" encoding="ISO-8859-1"?>< fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">< fo:layout-master-set> <fo:simple-page-master master-name="A4"> </fo:simple-page-master>< /fo:layout-master-set>< fo:page-sequence master-reference="A4"> <fo:flow flow-name="xsl-region-body"> <fo:block>Hello W3School</fo:block> </fo:flow>< /fo:page-sequence>< /fo:root>


</fo:page-sequence>

 

0 0
原创粉丝点击