- XSLT 教程
- XSLT - 首页
- XSLT - 概述
- XSLT - 语法
- XSLT - <template>
- XSLT - <value-of>
- XSLT - <for-each>
- XSLT - <sort>
- XSLT - <if>
- XSLT - <choose>
- XSLT - <key>
- XSLT - <message>
- XSLT - <apply-template>
- XSLT - <import>
- XSLT 有用资源
- XSLT - 快速指南
- XSLT - 有用资源
- XSLT - 讨论
XSLT 快速指南
XSLT 概述
XSL
在学习 XSLT 之前,我们应该首先了解 XSL,它代表可扩展样式表语言 (EXtensible Stylesheet Language)。它类似于 XML,就像 CSS 关系到 HTML 一样。
XSL 的需求
对于 HTML 文档,标签是预定义的,例如 table、div 和 span;浏览器知道如何向它们添加样式并使用 CSS 样式显示它们。但在 XML 文档的情况下,标签不是预定义的。为了理解和设置 XML 文档的样式,万维网联盟 (W3C) 开发了 XSL,它可以用作基于 XML 的样式表语言。XSL 文档指定浏览器应如何呈现 XML 文档。
以下是 XSL 的主要部分:
XSLT - 用于将 XML 文档转换为各种其他类型的文档。
XPath - 用于导航 XML 文档。
XSL-FO - 用于格式化 XML 文档。
什么是 XSLT
XSLT(可扩展样式表语言转换)提供了自动将 XML 数据从一种格式转换为另一种格式的功能。
XSLT 如何工作
XSLT 样式表用于定义要应用于目标 XML 文档的转换规则。XSLT 样式表以 XML 格式编写。XSLT 处理器获取 XSLT 样式表并将转换规则应用于目标 XML 文档,然后它生成以 XML、HTML 或文本格式表示的格式化文档。然后,此格式化文档由 XSLT 格式化程序利用以生成要显示给最终用户的实际输出。
优势
以下是使用 XSLT 的优势:
独立于编程。转换写在单独的 xsl 文件中,该文件又是 XML 文档。
只需修改 xsl 文件中的转换即可更改输出。无需更改任何代码。因此,Web 设计师可以编辑样式表并快速查看输出中的更改。
XSLT 语法
假设我们有以下示例 XML 文件 students.xml,需要将其转换为格式良好的 HTML 文档。
students.xml
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
我们需要为上述 XML 文档定义一个 XSLT 样式表文档,以满足以下条件:
页面应有一个标题学生。
页面应包含学生详细信息的表格。
列应具有以下标题:学号、名、姓、昵称、分数
表格必须相应地包含学生详细信息。
步骤 1:创建 XSLT 文档
创建一个 XSLT 文档以满足上述要求,将其命名为 students.xsl 并将其保存在与 students.xml 相同的位置。
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <!-- xsl stylesheet declaration with xsl namespace: Namespace tells the xlst processor about which element is to be processed and which is used for output purpose only --> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <!-- xsl template declaration: template tells the xlst processor about the section of xml document which is to be formatted. It takes an XPath expression. In our case, it is matching document root element and will tell processor to process the entire document with this template. --> <xsl:template match = "/"> <!-- HTML tags Used for formatting purpose. Processor will skip them and browser will simply render them. --> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <!-- for-each processing instruction Looks for each element matching the XPath expression --> <xsl:for-each select="class/student"> <tr> <td> <!-- value-of processing instruction process the value of the element matching the XPath expression --> <xsl:value-of select = "@rollno"/> </td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
步骤 2:将 XSLT 文档链接到 XML 文档
使用以下 xml-stylesheet 标记更新 student.xml 文档。将 href 值设置为 students.xsl
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> ... </class>
步骤 3:在 Internet Explorer 中查看 XML 文档
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
输出
XSLT <template>
<xsl:template> 定义了一种重用模板的方法,以便为特定类型/上下文节点生成所需的输出。
声明
以下是<xsl:template>元素的语法声明。
<xsl:template name = Qname match = Pattern priority = number mode = QName > </xsl:template>
属性
序号 | 名称和说明 |
---|---|
1 | name 要应用模板的元素的名称。 |
2 | match 表示要应用模板的元素的模式。 |
3 | priority 模板的优先级数字。在高优先级模板前面,不会考虑优先级较低的匹配模板。 |
4 | mode 允许多次处理元素以每次产生不同的结果。 |
元素
出现次数 | 无限 |
---|---|
父元素 |
xsl:stylesheet, xsl:transform |
子元素 |
xsl:apply-imports,xsl:apply-templates,xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:number, xsl:param, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, 输出元素 |
演示示例
此模板规则具有一个模式,该模式识别<student>元素并以表格格式生成输出。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students_imports.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
输出
XSLT <value-of>
<xsl:value-of> 标记将根据 XPath 表达式选择的节点的值作为文本输出。
声明
以下是<xsl:value-of>元素的语法声明。
<xsl:value-of select = Expression disable-output-escaping = "yes" | "no" > </xsl:value-of>
属性
序号 | 名称和说明 |
---|---|
1 | Select 在当前上下文中要计算的 XPath 表达式。 |
2 | disable-outputescaping 默认 -“no”。如果是“yes”,输出文本将不会转义文本中的 xml 字符。 |
元素
出现次数 | 无限 |
---|---|
父元素 |
xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, 输出元素 |
子元素 |
无 |
演示示例
此示例创建一个<student>元素的表格,其中包含其属性rollno及其子元素<firstname>、<lastname>、<nickname>和<marks>。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
验证输出
XSLT <for-each>
<xsl:for-each> 标记对每个节点重复应用模板。
声明
以下是<xsl:for-each>元素的语法声明
<xsl:for-each select = Expression > </xsl:for-each>
属性
序号 | 名称和说明 |
---|---|
1 | Select 在当前上下文中要计算的 XPath 表达式,以确定要迭代的节点集。 |
元素
出现次数 | 无限 |
---|---|
父元素 |
xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:foreach, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processinginstruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, 输出元素。 |
子元素 |
xsl:apply-imports, xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:number, xsl:processing-instruction, xsl:sort, xsl:text, xsl:value-of, xsl:variable。 |
演示示例
此示例通过迭代每个学生,创建一个<student>元素的表格,其中包含其属性rollno及其子元素<firstname>、<lastname>、<nickname>和<marks>。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
输出
XSLT <sort>
<xsl:sort> 标记指定节点的排序条件。
声明
以下是<xsl:sort>元素的语法声明。
<xsl:sort select = string-expression lang = { nmtoken } data-type = { "text" | "number" | QName } order = { "ascending" | "descending" } case-order = { "upper-first" | "lower-first" } > </xsl:sort>
属性
序号 | 名称和说明 |
---|---|
1 | select 节点的排序键。 |
2 | lang 用于确定排序顺序的语言字母。 |
3 | data-type 文本的数据类型。 |
4 | order 排序顺序。默认为“升序”。 |
5 | case-order 按大小写对字符串进行排序。默认为“upper-first”。 |
元素
出现次数 | 无限 |
父元素 | xsl:apply-templates, xsl:for-each |
子元素 | 无 |
演示示例
此示例通过迭代每个学生并按名字对它们进行排序,创建一个<student>元素的表格,其中包含其属性rollno及其子元素<firstname>、<lastname>、<nickname>和<marks>。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <xsl:sort select = "firstname"/> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
输出
XSLT <if>
<xsl:if> 标记指定针对节点内容的条件测试。
声明
以下是<xsl:if>元素的语法声明。
<xsl:if test = boolean-expression > </xsl:if>
属性
序号 | 名称和说明 |
---|---|
1 | test 要测试的 xml 数据中的条件。 |
元素
出现次数 | 无限 |
---|---|
父元素 | xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, 输出元素 |
子元素 | xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:for-each, xsl:if, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, 输出元素 |
演示示例
此示例通过迭代每个学生,创建一个<student>元素的表格,其中包含其属性rollno及其子元素<firstname>、<lastname>、<nickname>和<marks>。它检查分数是否大于 90,然后打印学生详细信息。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <xsl:if test = "marks > 90"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:if> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
输出
XSLT <choose>
<xsl:choose> 标记指定针对节点内容的多个条件测试,并结合使用<xsl:otherwise>和<xsl:when>元素。
声明
以下是<xsl:choose>元素的语法声明。
<xsl:choose > </xsl:choose>
元素
出现次数 | 无限 |
---|---|
父元素 |
xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, 输出元素 |
子元素 |
xsl:otherwise, xsl:when |
演示示例
此示例通过迭代每个学生,创建一个<student>元素的表格,其中包含其属性rollno及其子元素<firstname>、<lastname>、<nickname>和<marks>。它检查并打印成绩详细信息。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> <th>Grade</th> </tr> <xsl:for-each select = "class/student"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> <td> <xsl:choose> <xsl:when test = "marks > 90"> High </xsl:when> <xsl:when test = "marks > 85"> Medium </xsl:when> <xsl:otherwise> Low </xsl:otherwise> </xsl:choose> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
输出
XSLT <key>
<xsl:key> 标记元素指定分配给 XML 文档中特定元素的命名键值对。此键与 XPath 表达式中的 key() 函数一起使用,以访问 XML 文档中分配的元素。
声明
以下是<xsl:key>元素的语法声明。
<xsl:key name = QName match = Pattern use = Expression > </xsl:key>
属性
序号 | 名称和说明 |
---|---|
1 | Name 要使用的键的名称。 |
2 | Match 用于识别持有此键的节点的模式。 |
3 | Use XPath 表达式,用于识别 xml 文档节点的值。 |
元素
出现次数 | 无限 |
父元素 | xsl:stylesheet |
子元素 | 无 |
演示示例
此示例通过迭代每个学生,创建一个<student>元素的表格,其中包含其属性rollno及其子元素<firstname>、<lastname>、<nickname>和<marks>。它检查键是否为 firstname 是否为学生姓名之一,然后打印学生详细信息。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:key name = "firstname-search" match = "student" use = "firstname"/> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "key('firstname-search', 'Dinkar')"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
输出
XSLT <message>
<message> 标记元素有助于调试 XSLT 处理。它类似于 javascript 警报。<xsl:> 标记将消息缓冲到 XSLT 处理器,该处理器将终止处理并将消息发送到调用应用程序以显示错误消息。
声明
以下是<xsl:message>元素的语法声明。
<xsl:message terminate = "yes" | "no" > </xsl:message>
属性
序号 | 名称和说明 |
---|---|
1 | terminate 它指定在执行此指令后是否应终止转换。默认为“yes”。 |
元素
出现次数 | 无限 |
---|---|
父元素 | xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:foreach, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processinginstruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, 输出元素 |
子元素 |
xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:for-each, xsl:if, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, 输出元素 |
演示示例
此示例通过迭代每个学生,创建一个<student>元素的表格,其中包含其属性rollno及其子元素<firstname>、<lastname>、<nickname>和<marks>。它检查键是否为 firstname 是否存在,然后打印学生详细信息,否则显示错误消息。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname></firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <xsl:if test = "firstname = ''"> <xsl:message terminate = "yes">A first name field is empty. </xsl:message> </xsl:if> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
输出
XSLT <apply-template>
<xsl:apply-template> 标记指示 XSLT 处理器查找要应用的适当模板,这取决于每个选定节点的类型和上下文。
声明
以下是<xsl:apply-template>元素的语法声明。
<xsl:apply-template select = Expression mode = QName > </xsl:apply-template>
属性
序号 | 名称和说明 |
---|---|
1 | select 用于处理由 XPath 表达式选择的节点,而不是处理所有子节点。 |
2 | mode 允许根据其限定名称指定的元素被多次处理,每次产生不同的结果。 |
元素
出现次数 | 无限 |
---|---|
父元素 |
xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:foreach, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processinginstruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, 输出元素 |
子元素 |
xsl:sort, xsl:with-param |
演示示例
此示例通过迭代每个学生,创建一个<student>元素的列表,其中包含其属性rollno及其子元素<firstname>、<lastname>、<nickname>和<marks>。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <xsl:apply-templates select = "class/student" /> </body> </html> </xsl:template> <xsl:template match = "class/student"> <xsl:apply-templates select = "@rollno" /> <xsl:apply-templates select = "firstname" /> <xsl:apply-templates select = "lastname" /> <xsl:apply-templates select = "nickname" /> <xsl:apply-templates select = "marks" /> <br /> </xsl:template> <xsl:template match = "@rollno"> <span style = "font-size = 22px;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> <xsl:template match = "firstname"> First Name:<span style = "color:blue;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> <xsl:template match = "lastname"> Last Name:<span style = "color:green;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> <xsl:template match = "nickname"> Nick Name:<span style = "color:red;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> <xsl:template match = "marks"> Marks:<span style = "color:gray;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> </xsl:stylesheet>
输出
XSLT <import>
<xsl:import> 标记将一个样式表的内容导入另一个样式表。导入样式表比导入样式表具有更高的优先级。
声明
以下是<xsl:import>元素的语法声明。
<xsl:import href = "uri"> </xsl:import>
属性
序号 | 名称和说明 |
---|---|
1. | href 用于传递要导入的 xslt 样式表的路径 . |
元素
出现次数 | 无限 |
父元素 | xsl:stylesheet, xsl:transform |
子元素 | 无 |
演示示例
此示例通过迭代每个学生,创建一个<student>元素的列表,其中包含其属性rollno及其子元素<firstname>、<lastname>、<nickname>和<marks>。这里我们创建了两个 xsl 样式表,其中 students_imports.xsl 样式表导入 students.xsl,并且 students.xml 链接到 students_imports.xsl。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students_imports.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
students_imports.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:import href = "students.xsl"/> <xsl:template match = "/"> <xsl:apply-imports/> </xsl:template> </xsl:stylesheet>