在企业级应用越来越依赖
XML
的今天,
XML
格式的数据被作为信息交换的优先选择。
XML processing
标签库为程序设计者提供了基本的对
XML
格式文件的操作。在该标签库中的标签一共有
10
个,被分为了三类,分别是:
q
XML
核心标签:
<x:parse>
、
<x:out>
、
<x:set>
。
q
XML
流控制标签:
<x:if>
、
<x:choose>
、
<x:when>
、
<x:otherwise>
、
<x:forEach>
。
q
XML
转换标签:
<x:transform>
、
<x:param>
。
由于该组标签库专注于对某一特定领域的实现,因此本书将只选择其中常见的一些标签和属性进行介绍。
<x:parse>
标签是该组标签库的核心,从其标签名就可以知道,它是作为解析
XML
文件而存在的。它的属性和描述如表
9.12
所示:
表9.12 <x:parse>标签属性和说明
属性
|
描述
|
doc
|
源XML的内容,该属性的内容应该为String类型或者java.io.Reader的实例,可以用xml属性来替代,但是不被推荐
|
var
|
将解析后的XML保存在该属性所指定的变量中,之后XML processing标签库中的其他标签若要取XML中的内容就可以从该变量中得到(可选)
|
scope
|
变量的作用范围(可选)
|
varDom
|
指定保存的变量为org.w3c.dom.Document接口类型(可选)
|
scopeDom
|
org.w3c.dom.Document的接口类型变量作用范围(可选)
|
systemId
|
定义一个URI,该URI将被使用到XML文件中以接入其他资源文件(可选)
|
filter
|
该属性必须为org.xml.sax.XMLFilter类的一个实例,可以使用EL表达式传入,将对XML文件做过滤得到自身需要的部分(可选)
|
其中,
var
、
scope
和
varDom
、
scopeDom
不应该同时出现,而应该被视为两个版本来使用,二者的变量都可以被
XML processing
标签库的其他标签来使用。
<x:parse>
标签单独使用的情况很少,一般会结合
XML processing
标签库中的其他标签来一起工作。下面看一个示例。
首先给出一个简单的
XML
文件,将对该
XML
文件做解析,该
XML
文件名为
SampleXml.xml
。
<?xml version="1.0" encoding="UTF-8"?>
<xml-body>
<name>RW</name>
<passWord>123456</passWord>
<age>28</age>
<books>
<book>book1</book>
<book>book2</book>
<book>book3</book>
</books>
</xml-body>
标签库的工作:
<c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml"/>
<x:parse var="xmlFileValue" doc="${xmlFile}"/>
该
示例
读取
XML
文件得到了
<c:import>
标签的帮助,
<c:import>
标签将源
XML
文件的内容保存在“
xmlFile
”变量中,
<x:parse>
标签根据“
xmlFile
”变量的值
解析
“
SampleXml.xml
”。
9.4.2 用于显示XML内容的<x:out>标签
9.4.2 用于显示XML内容的<x:out>标签
<x:out>
标签从
<x:parse>
标签解析后保存的变量中取得需要的
XML
文件内容,并显示在页面上。该标签是通过
XPath
技术(定位
XML
元素的一种技术)来实现的。要使用
<x:out>
标签必须将
xalan-j
的
jar
包保存在“
WEB-INF/lib
”下。它的属性和描述如表
9.13
所示:
表9.13 <x:out>标签属性和说明
属性
|
描述
|
select
|
XPath表达式
|
escape
|
当特殊字符如:“<,>,&,’,””出现在取得的结果字符串中时,将以转义字符来替换
|
<x:out>
标签需要与
<x:parse>
标签协同工作,下面看一个示例。
<c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml"/>
<x:parse var="xmlFileValue" doc="${xmlFile}"/>
name:<x:out select="$xmlFileValue/xml-body/name"/><br>
passWord:<x:out select="$xmlFileValue/xml-body/passWord"/><br>
age:<x:out select="$xmlFileValue/xml-body/age"/><br>
读取
XML
文件并解析后的变量
xmlFileValue
将加上“
$
”作为
XPath
表达式的开头,
select
中的表达式将从
xml-body
根元素下的各个子元素中取得实体内容,最后将结果显示在页面上。根据“
SampleXml.xml
”文件的内容,将显示。
name:RW
passWord:123456
age:28
<x:set>
标签允许将某个源
XML
中元素的实体内容或属性,保存到一个变量中去,它的实现也依靠
XPath
技术。它的属性和描述如表
9.14
所示:
表9.14 <x:set>标签属性和说明
属性
|
描述
|
select
|
XPath表达式
|
var
|
保存结果的变量名
|
scope
|
变量的作用范围(可选)
|
<x:set>
标签的
var
保存的变量由
XPath
的结果决定该变量的类型,下面看一个示例。
<c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml"/>
<x:parse var="xmlFileValue" doc="${xmlFile}"/>
<x:set select="$xmlFileValue/xml-body/name" var="thisName"/>
这里将保存
XML
的
name
元素内容到变量“
thisName
”中。
<x:if>
标签允许由
XPath
的
boolean()
函数得到的判断结果,来判断是否显示其标签所包含的内容。
<x:if>
标签的属性与
<x:set>
标签相同,但是
var
的结果只能是
boolean
类型。
这组标签将一起使用,来提供“
if elseif
”语句的功能。
<x:choose>
标签没有属性,可以被认为是父标签,
<x:when>
、
<x:otherwise>
将作为其子标签来使用。
<x:when>
标签等价于“
if
”语句,它包含一个
select
属性,该属性为
XPath
判断表达式。
<x:forEach>
为对
XML
文件中同一名称元素的循环控制标签。它的属性和描述如表
9.15
所示:
表9.15 <x:set>标签属性和说明
属性
|
描述
|
select
|
XPath表达式,结果是一个集合,将对该集合进行循环(可选)
|
begin
|
开始条件(可选)
|
end
|
结束条件(可选)
|
step
|
循环的
步长
,默认为1(可选)
|
var
| |
varStatus
|
显示循环状态的变量(可选)
|
下面看一个示例。
<x:forEach select="$xmlFileValue/xml-body/books/book" var="book">
${book}
</x:forEach>
该示例将使用循环读取
XML
中多个同存于
books
元素下的
book
子元素。
<x:transform>
标签允许使用
XSLT
(转换
XML
格式的语言)为页面的显示数据做格式化的处理。它的属性和描述如表
9.16
所示:
表9.16 <x:transform>标签属性和说明
属性
|
描述
|
doc
|
源XML的内容,该属性的内容应该为String、java.io.Reader、javax.xml.transform.Source、org.w3c.dom.Document的实例,或者从<x:parse>、<x:set>两个标签得到。可以用xml属性来替代,但是不被推荐(可选)
|
xslt
|
源XSLT的内容,该属性的内容应该为String、java.io.Reader、javax.xml.transform.Source的实例(可选)
|
docSystemId
|
定义一个URI,该URI将被使用到XML文件中以接入其他资源文件。可以用xml SystemId属性来替代,但是不被推荐(可选)
|
xsltSystemId
|
定义一个URI,该URI将被使用到XSLT文件中以接入其他资源文件(可选)
|
var
|
将格式化后的XML文件保存在该属性所指定的变量中,保存的变量为org.w3c.dom.Document接口类型(可选)
|
scope
|
变量的作用范围(可选)
|
result
|
保存转化结果的变量,保存的变量为javax.xml.transform.Result类型的
实例
(可选)
|
下面看一个示例:
<c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml" />
<c:set var="xsltdoc">
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="xml-body">
<html>
<head></head>
<body marginheight="0" marginwidth="0" topmargin="0" leftmargin="0">
<h2>
UserName:
<xsl:value-of select="name" />
</h2>
<h2>
PassWord:
<xsl:value-of select="passWord" />
</h2>
<h2>
age:
<xsl:value-of select="age" />
</h2>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
</c:set>
<x:transform xslt="${xsltdoc}" doc="${xmlFile}" />