XML学习笔记 5. XSLT

xsl:template 相当于函数,而

<xsl:template match="/">
	
	</xsl:template>

相当于一个主函数。

使用xsl:apply-templates/>继续广度深层的遍历,然后之后写的函数对其中遍历到的数据进行匹配,若没有函数进行分析则就直接输出了。

<xsl:template match="/">
		<xsl:apply-templates/>
	</xsl:template>

匹配时,对于一个任意的数据,主函数调用之后的任意函数进行匹配,如果有,则使用其中的函数的操作进行操作,没有就直接输出了。

template称作模版,但是其实作用相当于函数。其中可以进行容易的输出,以实现xml的转换操作,模版中可以进行更深层的遍历 使用“xsl:apply-template“,可以调用函数使用xsl:call-template,也可以使用xsl:copy 或者xsl:copy-of进行节点内容的输出,或者使用xsl:value-of进行属性值或者其他值的输出,可以使用xsl:for-each进行条件的遍历,可以使用xsl:if进行条件判断,实用xsl:sort进行排序操作。大致上xslt进行的操作就这些。

xslt中的常用属性有以下几种

match属性是匹配路径,进行任意xml中内容的匹配。matci="/"则为匹配根节点,即实现main函数,也就是所有之后操作的接口。

name属性是名称,使用xsl:call-template可以调用固定名的模版。

mode   模式属性,对名称进行更进一步的区分操作。

priority 优先级属性,依然是对名称进行进一步区分,调用模版时,调用优先级较高的模版

as 返回类型属性,声明模版的返回值类型。

select  xpath属性,对进行判断或遍历的操作 使用xpath来规定其选取的对象。就是使用xpath来选择一定的元素或其他属性。

以下有一些使用的用例:


作业中输出book中的所有的section。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
		<xsl:apply-templates/>
	</xsl:template>
<xsl:template match="section">
	<xsl:copy-of select="."/>
	<xsl:apply-templates/>
</xsl:template>
<xsl:template match="title"></xsl:template>
<xsl:template match="author"/>
<xsl:template match="p"/>
</xsl:stylesheet>
这里对根节点进行遍历,然后去匹配所有的其他元素,使其不输出,然后对section进行 xsl:copy-of 进行的元素输出,然后对section再进行遍历,使嵌套在section中的其他section元素也能够进行输出。


如何同时对多个xml进行操作:

<xsl:variable name="doc" select="document('book.xml')"/>
在这里声明一个文件,为载入的另一个文件,然后在遍历原xml的同时,对新加入的xm也进行遍历l

	<xsl:template match="/">
		<xsl:apply-templates/>
		<xsl:apply-templates select="$doc/node()"/>
	</xsl:template>

q5:

使用参数传值,实现判断操作:

<xsl:variable name="doc" select="document('reviews.xml')"/>	


<xsl:template match="/">
<book-with-prices>
<xsl:apply-templates select="//book"/>
</book-with-prices>
</xsl:template>
<xsl:template match="book">
<xsl:apply-templates select="./price"></xsl:apply-templates> 
</xsl:template>

<xsl:template  name="K">
<xsl:param name="bookprice"/>
<xsl:param name="booktitle"/>
<xsl:for-each select="$doc//entry[./title/text()=$booktitle]">
<book-with-prices>
<title>
<xsl:value-of select="./title/text()"/>
</title>
 <price-bstore2>
	 <xsl:value-of select="./price/text()"/>
 </price-bstore2>
  <price-bstore1><xsl:value-of select="$bookprice"/></price-bstore1>

</book-with-prices>

</xsl:for-each>
</xsl:template>

<xsl:template match="price">
<xsl:call-template name="K"><xsl:with-param name="bookprice" select="text()"/>
<xsl:with-param name="booktitle" select="../title/text()"/>
</xsl:call-template>    
</xsl:template>



使用xpath进行一系列判断,然后快速选中需要的元素

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
	
	
	<xsl:template match="/">
		<book>
			<xsl:apply-templates select="//book[count(./child::author)>0]"/>
		</book>
	</xsl:template>
	
	<xsl:template match="book">
	<book>
		<xsl:copy-of select="./title"/>
		<xsl:copy-of select="./child::element()[position()=2]"/>
		<xsl:copy-of select="./child[position()=3]"/>
		<xsl:if test="count(./child::author)>2">
			<et-al/>
		</xsl:if>
		</book>
	</xsl:template>
	
	
</xsl:stylesheet>



属性的添加 以及sort排序的使用

	
<xsl:template match="/">
<bib>
<xsl:apply-templates select="//book[./publisher/text()='Addison-Wesley'][number(./attribute::year)>1991]">
<xsl:sort select="./title/text()"/>
</xsl:apply-templates>
</bib>
</xsl:template>	

<xsl:template match="book">
<book>
<xsl:copy-of select="./attribute::year"/>
<xsl:copy-of select="./title"/>
</book>	
</xsl:template>
	


<xsl:template match="/">
<xsl:apply-templates select="//book//*[contains(string(.), 'Suciu')and ends-with(local-name(.), 'or')]"/>
</xsl:template>	
<xsl:template match="*">
<book>
<xsl:copy-of select="./ancestor::book/title"/>
<xsl:copy-of select="."/>
</book>
</xsl:template>	
</xsl:stylesheet>




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[实验目的] 1、学习如何使用XMLSPY集成开发环境完成XML Schema相关的开发工作。 2、掌握XML Schema与DTD之间的区别,能够完成两者之间的转换;掌握在XML Schema中如何定义元素和属性,如何使用限制、列表和合并派生自己的简单数据类型,如何定义复杂数据类型,全局/局部元素和数据类型之间的区别;如何将XML Schema文档关联到XML实例数据文档,并完成文档的有效性验证。 3、掌握如何准确定义数据之间的参照完整性约束,如何在模式中使用多态性支持,如何在文档中定义空值等等。 [实验内容和步骤] 1、使用XMLSPY集成开发环境,新建XML Schema文档,在各种不同的编辑视图中尝试采用不同的方式完成XML Schema文档的编辑和查看;并使用XMLSPY提供的便利,建立XML、Schema两者之间的关联,进行XML文档的良构以及有效性验证。 2、严格按照下图给出的文档模型,在XML Schema编辑环境的Schema视图中完成book.xsd的编写(不要使用Text视图进行编写): 在上图中,没有指定简单类型元素和属性的数据类型,请根据合理的情况,完成数据类型的创建(至少使用到限制方式中的三种以上的限制方面),请在IDE的Details视图->type和Facets中完成上述任务。 在上图中,有三个title元素分别表示book、section和figure的标题,请定义下述类型: titleType:1-100个字符的文本; bookTitleType:titleType类型限制派生的子类型,要求取枚举值“Data On the Web”、“TCP/IP Illustrated”等; sectionTitleType:titleType类型限制派生的子类型,要求必须形如“1.xxxx”、“1-1.xxxx”等等(表示第一节、第一节下面的第一节等等,注意section是递归的形式); figureTitleType:titleType类型限制派生的子类型,要求必须形如“1-1.xxxx” 、“1-1-1.xxxx”(表示第一节中的第一个图、第一节下面的第一节的第一个图等等); 然后编写book.xml,并使用多态性(即所有title的类型均为titleType,而数据实例中指明具体类型),请确保通过文档有效性验证。 3、在上次的DTD实验中,我们编写了SpyBase1.xml、SpyBase2.xml、以及SpyBase1.dtd和SpyBase2.dtd,这次需要完成SpyBase1.xsd和SpyBase2.xsd,建立模式与数据之间的关联,并进行文档有效性验证。在编写的XSD文档SpyBase1.xsd中,要求使用key/keyref描述数据的实体完整性以及数据之间的参照完整性(SpyBase2.xml不需要,因为已经使用嵌套消除了参照关系)。 [实验思考] 与ID/IDREF相比,key/keyref有哪些优点,在使用上有何不同? 假设SpyBase1.xml中的alias、mission、spy来自不同的命名空间中,如何在Schema中对其进行限定,请在XMLSPY中完成相应的xsd文档?修改SpyBase1.xml,并验证新的SpyBase1_2.xsd是否正确? [提交时间及内容] 最后提交时间 2013年?月?日 提交内容 提交book.xsd、book.xml(使用多态)。 提交SpyBase1. xsd、SpyBase2. xsd。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值