本教程解释了什么是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最喜欢的消遣是阅读杂志和写博客。