XSLT教程 - XSLT转换& 元素与实例

本教程解释了什么是XSLT,它的转换,元素和使用实例。 还包括XPath对开发XSLT转换代码的重要性:

术语 "XSLT "是由两个词组合而成,即 "XSL "和 "T","XSL "是 "可扩展样式表语言 "的简称,"T "是 "转换 "的简称。

因此,基本上,XSLT是一种转换语言,用于将源XML文档转换/转换为XML文档,或通过使用XSL-FO(格式化对象)转换为其他格式,如HTML、PDF等等。

XSLT简介

XSLT处理器(如Saxon、Xalan)的帮助下发生转换。 这个XSLT处理器将一个或多个XML文档作为源文件,其中包含XSLT代码的XSLT文件,结果/输出文档将在随后生成,如下图所示。

XSLT处理器通过使用X-Path来解析源XML文档,从根元素开始一直到文档的结尾,在不同的源元素上进行导航。

你需要了解的所有情况 X-Path

XSLT转换

为了开始转换,我们需要一个XSLT代码将运行的XML文档,XSLT代码文件本身和具有XSLT处理器的工具或软件(你可以使用任何免费版或试用版的软件来学习)。

#1)XML代码

下面是XSLT代码将在其上运行的源XML代码。

文件名称: 书籍.xml

 XSLT程序员参考》 Michael Kay Wrox $40 第4版 Head First Java Kathy Sierra O'reilly $19 第1版 SQL The Complete Reference James R. Groff McGraw-Hill $45 第3版 

#2)XSLT代码

下面是基于XSLT的代码,它将在上述XML文档上运行。

文件名称: Books.xsl

书籍:-

书籍编号 书名 作者姓名 著作人 价格 版本

#3)结果/输出代码

在上述XML文档上使用XSLT代码后,将产生下面的代码。

书籍:-

书籍编号 书名 作者姓名 著作人 价格 版本
5350192956 XSLT程序员参考 迈克尔-凯 纬纶公司 $40 第四届
3741122298 领先的Java Kathy Sierra O'reilly $19 第一届
9987436700 SQL的完整参考 James R. Groff 麦格劳-希尔公司 $45 第三届

#4) 在网络浏览器中查看结果/输出

书籍:

书籍编号 书名 作者姓名 著作人 价格 版本
5350192956 XSLT程序员参考 迈克尔-凯 纬纶公司 $40 第四届
3741122298 领先的Java Kathy Sierra O'reilly $19 第一届
9987436700 SQL的完整参考 James R. Groff 麦格劳-希尔公司 $45 第三届

XSLT元素

为了理解上述XSLT代码及其工作,我们首先需要了解不同的XSLT元素和它们的属性。

#1)或

每条XSLT代码都必须从根元素开始,要么是

属性:

  • @xmlns:xsl: 将XSLT文档与XSLT标准连接起来。
  • @版本: 定义XSLT代码到解析器的版本。

#2)

这个声明定义了一组规则,应用于处理或转换源文件中选定的输入元素,以定义输出文件的目标元素规则。

基本上,根据其属性,有两种类型的模板可供选择:

(i) 命名的模板: 当xsl: 模板元素包含@name属性时,这被称为命名模板。

命名的模板是由xsl:call-template元素调用的。

(ii) 匹配模板: xsl:template元素包含@match属性,它包含一个匹配模式或应用于输入节点的XPath。

匹配模板是由xsl:apply-template元素调用的。

xsl:template元素必须有@match属性或@name属性或两者都有。 一个没有match属性的xsl:template元素必须没有mode属性和优先级属性。

让我们重新写一下上面的XSLT(

a) 基于Match Template的XSLT代码与.见下面黄色&灰色突出显示的修改后的代码,它将产生相同的上述输出结果。

书籍:-

书籍编号 书名 作者姓名 著作人 价格 版本

请参考截图中的高亮区域:

b) 基于Named Template的XSLT代码与.见下面黄色&灰色突出显示的更改后的代码,它将产生与上述相同的输出结果。

书籍:-

书籍编号 书名 作者姓名 著作人 价格 版本

请参考截图中的高亮区域:

#3)

处理器将找到并应用所有在@select属性中定义有XPath的模板。

如果我们想用同样的输入内容给出多种输出方式,也可以使用@mode属性。

#4)

处理器将调用在@name属性内有值的模板(需要)。

元素是用来向模板传递参数的。

#5)

提供关于@select属性中定义的XPath表达式的字符串/文本值,如上述代码所定义。

这将给出书名的值。

#6):重复

这将处理排序后的每一组节点(@select(必填)属性中定义的xpath)的指令。

上述代码对每个节点的存储/书籍的集合意味着:

/store/book[1]

/store/book[2]

/store/book[3]

也可以作为xsl:for-each的一个子节点来定义排序的顺序。

#7):条件处理

xsl:if指令只有在@test属性的布尔值为真时才会处理,否则该指令不会被评估,并返回空序列。

 2"> 条件真:书的数量超过两本。 

结果: 条件真实:书的数量超过两本。

这里的count()是预定义的函数。

#8):替代条件处理

xsl:choice有多个原因,用于不同条件的测试,这些条件在xsl:when元素的@test属性中被测试,在所有的xsl:when中首先成真的测试条件将被首先处理,还有一个可选的xls:other元素,这样如果没有任何条件测试成真,那么这个xsl:other将被考虑。

 条件真:书的数量是一。 条件真:书的数量是二。 条件真:书的数量是三。 没有条件匹配。 

结果: 条件是真实的:这本书的计数是三。

#9)

xsl:copy在上下文项上工作,即如果是节点,那么它将把上下文节点复制到新生成的节点上,这不会复制上下文节点的子节点。 因为这个原因,这被称为浅层复制。 与xsl:copy-of元素不同,xsl:copy没有@select属性。

在下面的代码中,上下文项目被复制到输出&;所有的子项目被称为&;被xsl:apply-template递归地复制。

节点() 代表所有的节点和它们的所有属性递归。

结果: 这将把源文件的所有节点和属性递归地复制到输出文件,也就是说,它将创建一个源文件的精确副本。

#10)

xsl:copy-of默认情况下会递归地复制节点序列及其所有的子节点和属性,由于这种性质,这也被称为深度复制。 @select属性对于XPath的评估是必需的。

结果: 这将把源文件的所有节点和属性递归地复制到输出文件,也就是说,它将创建一个源文件的精确副本。

代表当前节点和当前属性的副本。

#11)

这个元素用来给目标结果写评论,任何靠这个标签的文本内容都会被打印成评论输出。

这将作为一个注释节点打印到输出。

结果:

#12)

这将产生一个文本节点到结果文档中,xsl:text里面的值将被打印成一个字符串输出。

这是一个

文本行。

输出:

这是一个

文本行。

#13)

这将在结果文档中生成一个元素,其名称在@name属性中提到。 name属性是必要属性。

结果: 5350192956

#14)

这将在结果文档中为其父元素生成一个属性。 属性的名称由name属性定义,属性的值由select属性中提到的XPath计算,如下面的代码所示。 name属性是必要属性。

结果:

#15)

该元素将以升序或降序的方式对选定的节点进行相应的排序。 节点或XPath通过@select属性给出,排序的方向由@order属性定义。

在下面的代码中,我们将按照书名的字母顺序获得所有的书籍列表。

书籍:-

书籍编号 书名 作者姓名 著作人 价格 版本

请参考这张截图,了解高亮区域:

结果: 下面的列表包含了按字母顺序排列的书名,即按升序排列。

书籍:

书籍编号 书名 作者姓名 著作人 价格 版本
3741122298 领先的Java Kathy Sierra O'reilly $19 第一届
9987436700 SQL的完整参考 James R. Groff 麦格劳-希尔公司 $45 第三届
5350192956 XSLT程序员参考 迈克尔-凯 纬纶公司 $40 第四届

#16)

这个元素声明了一个持有数值的变量。 变量可以是一个全局变量,也可以是一个局部变量。 变量的名称由@name属性定义,这个变量要持有的数值由@select属性定义。

全局变量的访问是全局的,也就是说,变量可以在任何元素中被调用,并且在样式表中保持可访问性。

要定义一个全局变量,我们只需要在样式表的根元素旁边声明,如下面代码中的黄色高亮显示,变量'SecondBook'是全局变量,它持有第二本书的名字。

局部变量的访问是对它所定义的元素的访问,也就是说,该变量在它所定义的元素之外是不能访问的,如下面代码中的灰色高亮显示,变量'first book'是一个局部变量,它持有第一本书的名字。

要对全局变量和局部变量进行调用,需要在变量名称前使用美元符号($),如下图所示,用黄色高亮显示。 $ .

 第一本书名:第二本书名: 

请参考截图中的高亮区域:

结果:

第一本书名: XSLT程序员参考书

第二本书名:Head First Java

#17)

这个元素用于声明键,用于与该特定键匹配的模式值。

名称是由@name属性(" )提供给该键的。 获取出版商 "),随后在key()函数中使用。 @match属性通过XPath表达式提供输入节点的索引(" "),就像下面黄色突出显示的@match被用来索引商店里所有的书。

相对于@match属性,@use属性被使用,它声明节点通过XPath表达式("publisher")获得该键的值。

现在,假设我们需要只由 "Wrox "出版商出版的书的细节,那么我们可以通过xsl:key元素,通过建立键值对,轻松获得该值。

key('get-publisher', 'Wrox') Key()需要两个参数,第一个是键的名称,在本例中是'get-publisher',第二个是需要搜索的字符串值,在本例中是'Wrox'。

书籍:-

书籍编号 书名 作者姓名 著作人 价格 版本

请参考截图中的高亮区域:

结果:

书籍:-

书籍编号 书名 作者姓名 著作人 价格 版本
5350192956 XSLT程序员参考 迈克尔-凯 纬纶公司 $40 第四届

结果/HTML视图:

书籍:

书籍编号 书名 作者姓名 著作人 价格 版本
5350192956 XSLT程序员参考 迈克尔-凯 纬纶公司 $40 第四届

#18)

该元素用于XSLT开发中的调试目的。 该元素将其输出到应用程序的标准输出屏幕。

@terminate属性有两个值,要么是'yes',要么是'no',如果值被设置为'yes',那么一旦测试条件得到满足,解析器就会立即终止,从而使消息得到执行。

为了理解这一点,我们假设如果在我们的输入文档中,价格元素意外为空,就像下面的代码一样,那么一旦处理器遇到空的价格元素,就应该立即停止处理,这可以通过在if测试条件中使用xsl:message轻松实现,正如下面的XSLT代码。

调试器警报是由应用程序标准屏幕显示的: 处理过程在第21行被xsl:message终止了。

输入XML代码:

 SQL完全参考》 James R. Groff McGraw-Hill 第三版 

突出显示的区域请参考屏幕截图:

XSLT代码:

书籍:-

终止:价格元素为空。
书籍编号 书名 作者姓名 著作人 价格 版本

请参考截图中的高亮区域:

结果: 请注意,一旦解析器遇到空的价格标签,它就会立即终止处理,因为、和的关闭标签不会出现在文件的末尾。

书籍:-

书籍编号 书名 作者姓名 著作人 价格 版本
5350192956 XSLT程序员参考 迈克尔-凯 纬纶公司 $40 第四届
3741122298 领先的Java Kathy Sierra O'reilly $19 第一届

突出显示的区域请参考屏幕截图:

#19号)&;

元素定义了模板的参数,如果定义在里面的话。 它既可以定义为全局参数,也可以定义为该模板的局部参数。

的值是在模板被调用时传递/提供的,由 .

它把定义在 像@name这样的属性包含了参数的名称,它应该与元素的@name属性相匹配。 @Select属性用于为该参数设置一个值。

为了获取与变量相同的参数值,使用了美元符号($)。

源XML代码:

 XSLT程序员参考》 Michael Kay Wrox $40 第4版 Head First Java Kathy Sierra O'reilly $19 第1版 SQL The Complete Reference James R. Groff McGraw-Hill $45 第3版 

XSLT代码:

书籍清单 名称 :-

书名:

请参考屏幕截图,了解高亮区域的情况:

结果输出:

书籍清单 名称 :-

书名:XSLT程序员参考手册

书名:Head First Java

书名:SQL完全参考

#20)

这有助于实现模块化的XSLT开发方法。

在导入后,所有的模板都可以使用,在父样式表(正在导入另一个样式表)中定义的模板的优先级要高于导入的样式表(被父样式表导入的)。

如果另一个样式表也有与正在导入的模板内定义的相同名称的模板,那么外国模板会被你自己的模板覆盖。

属性@href被用来作为你想导入的样式表的URI。

#21)

和上面的xsl:import一样,也有助于实现模块化的XSLT开发方式。 所有被包含的模板都有和调用样式表相同的优先级/顺序。 这就像你从另一个样式表复制所有的模板到你自己的样式表。

属性@href被用来作为你想导入的样式表的URI。

#22)

这个元素用来指定输出文件中的结果树。 它包含像@method这样的属性,可以有'XML'、'HTML'、'XHTML'和'text'这样的值,默认为'XML'。

@encoding指定输出文件中的字符编码,如下例所示encoding="UTF-16",XML或XHTML的默认值可以是UTF-8或UTF-16。 @indent指定XML或HTML输出代码的缩进,对于XML,默认值是'no',对于HTML和XHTML,默认值是yes。

#23)

这个元素用于剥离(去除)@element属性中列出的源元素的非重要的空白,如果我们想从所有元素中剥离空白,那么我们可以在@elements属性中使用'*'。

#24)

这个元素用于保留@element属性内所列源元素的空白,如果我们想保留所有元素的空白,那么我们可以在@elements属性内使用'*'。

总结

因此,在这篇文章中,我们已经了解了XSLT,经常使用的XSLT元素,它们的用法与源和目标/结果代码的例子,源元素到目标元素的转换或转化。

我们还讨论了XPath对开发XSLT转换代码的重要性。 我们已经看到了XSL模板声明和模板调用&;传递参数。 我们学会了声明全局变量和局部变量,它们在XSLT代码中的用法,以及如何调用它们。

我们学习了不同的分支或条件XSLT元素,如xsl:if, xsl:for-each, xsl:choose.我们了解了浅层复制和深层复制的区别,节点的排序,通过使用xsl:message调试XSLT代码,命名模板和匹配模板的区别,以及通过使用xsl:output进行输出格式化。

关于作者 : Himanshu P.是信息技术领域的资深专家,他曾在ITC跨国公司从事跨业务领域和多种技术的工作。 Himanshu最喜欢的消遣是阅读杂志和写博客。

滚动到顶部