WEB开发网
开发学院数据库DB2 使用 IBM Data Studio Developer 中的 XSLT 转换 ... 阅读

使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

 2010-04-15 00:00:00 来源:WEB开发网   
核心提示:开始之前了解本教程的内容,以及如何最大限度地利用本教程,使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上),简介Data Web Services 一个强大的特性是对 Web 服务请求和响应应用服务器端 XSL 转换的功能,该特性可以定制客户机

开始之前

了解本教程的内容,以及如何最大限度地利用本教程。

简介

Data Web Services 一个强大的特性是对 Web 服务请求和响应应用服务器端 XSL 转换的功能。该特性可以定制客户机看到的消息格式。如果企业或行业 Web 服务格式需求指定了 Web 服务消息的格式,那么这个特性特别有用。

对于 Web 服务请求和响应消息,Data Web Services 有默认的消息格式。消息格式和那些消息中的 XML 标记名称取决于 Web 服务操作的名称、结果集列名等。在某些情况下,或者因为消息格式需求,或者因为想屏蔽默认的标记名称,您可能不希望客户机看到默认的标记名称。通过使用服务器端 XSLT 特性,可以将传入的 XML 请求和输出的结果转换为与 Data Web Services 默认消息格式不同的格式。

通常,可以使用自上而下或自下而上的方法构建 Web 服务。在自上而下方法中,从一个服务规范(例如一个 WSDL 文件)开始,然后实现与那个规范匹配的底层代码。在自下而上方法中,从一个 Java bean 或 SQL 语句开始,然后将功能公开为 Web 服务。对于 Data Web Services,首先从 DML 操作(例如查询)开始,然后将它们公开为 Web 服务。因此,开发风格通常是自下而上的。然而,在很多情况下,通过将 XSLT 应用到服务消息,可以将自下而上的消息的服务格式映射到自上而下设计中。这解决了一些自上而下服务格式需求,同时又可以开发自下而上的 Web 服务。这种转换可用于以人类可读的格式(例如 HTML、JSON、RSS feed)或 XSL 转换产生的文本格式将数据交付给客户机。

本教程介绍如何在应用服务器上创建和部署 IBM Data Web Services,并深入阐述如何使用 XSLT 特性定制示例 Web 服务的输入和输出消息,以符合定制的 XML 模式。

图 1. 可定制的交付格式 - 应用 XSLT
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上) 

目标

在本教程中,您将学习:

使用属于 Data Web Services 一部分的 XSLT 特性。

为示例 Web 服务生成默认的模式。

应用 Web 风格的转换,以 HTML、JSON 和 RSS 格式显示输出。

将定制的模式应用到 SOAP 消息上。

先决条件

本教程是为熟悉 IBM Data Studio 并知道如何执行一些常见任务的数据库程序员撰写的,这些任务包括创建数据库连接、数据开发项目和 SQL 脚本或存储过程等。如果您还不熟悉这些任务,那么应该先阅读教程 “IBM Data Studio: Data Web Services 快速入门” (developerWorks,2007 年 11 月)。我们假设读者具有 XSLT、XSD 和 XPath 方面的基础知识。由于本教程中的例子都是以 WebSphere® Application Server Community Edition 服务器作为目标环境,本教程假定读者已经安装了 Data Studio Developer 1.2,有一个 WebSphere Application Server Community Edition 服务器实例,并且已经建立一个到 DB2 SAMPLE 数据库的连接。

系统需求

要运行本教程中的示例,需要:

在 Windows 上安装 IBM Data Studio Developer 1.2

IBM WebSphere Application Server Community Edition V 2.0

DB2 Versions 8 or 9 for Linux, Unix and Windows 或者 DB2 Express-C,并创建了 SAMPLE 数据库。

创建一个简单的 Web 服务

本教程使用一个简单的 Web 服务来演示 XSLT 特性。本节描述如何通过使用 IBM Data Studio Developer 来创建这个 Web 服务。这个 Web 服务基于 DB2 SAMPLE 数据库。教程 “IBM Data Studio: Data Web Services 快速入门” (developerWorks,2007 年 11 月)展示了如何创建数据库连接和 WebSphere Application Server Community Edition 服务器实例。本教程假设您已经有一个 DB2 SAMPLE 数据库连接和一个 WebSphere Application Server Community Edition 服务器实例。

创建一个数据开发项目

在 Data Project Explorer 中,在空白处单击右键,选择 New > Data Development Project,创建一个数据开发项目。

图 2. 创建一个新的数据开发项目
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

将该项目命名为 ProjectXSLT,然后单击 Next。

图 3. 创建新项目的选项
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

使用前面设置的到 DB2 SAMPLE 数据库的连接,然后单击 Finish。

图 4. 创建新项目的选项
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

Data Project Explorer 中的新项目应该如下所示:

图 5. 创建的数据开发项目
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

在项目中创建新的 Web 服务

通过右键单击 Web Services 文件夹,并选择 New Web Service,在数据开发项目中创建一个新的 Web 服务。

图 6. 创建 Web 服务
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

将这个 Web 服务命名为 MyWebServiceXSLT,保留 urn:example 作为名称空间 URI。这名称空间 URI 用于在 WSDL 内部限定 XML 输入和输出消息的 Web 服务和 XML 模式。您可以提供任何遵从 URI 构建规则的字符串。单击 Finish。

图 7. 创建 Web 服务的选项
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

数据开发项目现在看上去应该如图 8 所示。您已通过向导为 Data Web Service 创建了一个 “空壳”,现在可以向其中填入数据库操作。

图 8. 包含新创建的 Web 服务的项目
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

将数据库操作添加到 Web 服务中

可以通过右键单击 Web 服务,并选择 New Operation,将数据库操作和存储过程添加到 Web 服务中。

图 9. 将数据库操作添加到 Web 服务中
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

将操作命名为 getAllEmp,并像图 10 那样定义它,然后单击 Finish。

图 10. 定义一个新操作
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

或者,也可以通过右键单击 SQL Scripts 文件夹并选择 New > SQL or XQuery Script 来创建数据库操作。使用相同的方法创建另一个操作。

图 11. 定义数据库操作的另一种方法
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

将脚本命名为 getOneEmp,像图 12 那样选择其他设置,然后单击 Finish。

图 12. 定义另一个数据库操作
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

使用 SQL 编辑器编辑刚才创建的文件,如图 13 所示:

图 13. 编辑文件
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

将该脚本从 SQL Scripts 文件夹拖放到刚才为 Web 服务创建的文件夹中。这一步将 SQL 脚本转换成 Web 服务中的一个操作。

图 14. 拖放脚本
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

Web 服务的定义至此已经完成。这个 Web 服务和它的两个操作(getOneEmp 和 getAllEmp)现在应该如图 15 所示:

图 15. 定义的 Web 服务示例
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

在接下来的小节中,生成输入和输出消息的默认模式。

生成输入和输出消息的默认模式

本节展示如何获取输入和输出消息的默认模式。当使用 Data Studio Developer 将一个操作添加到 Data Web Services 时,将为该操作的输入和输出消息自动生成一个默认的 XML 模式映射。要生成一个 XSLT 脚本,必须知道开始(或要映射到它)的 XML 的模式,因为这个模式定义了 XML 输入和输出消息的默认格式,并且可以作为开发 XSL 脚本的起点。可以使用 Data Web Services 工具获取操作的默认模式。

获取默认模式

将一个操作添加到 Web 服务后,右键单击该操作并选择 Manage XSLT。

图 16. 管理 XSLT 选项
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

单击 Generate Default。

图 17. 生成默认模式
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

保留默认文件名,或随意重新命名,然后单击 Save。

图 18. 保存文件
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

在 Configure XSL Transformations 向导中单击 Finish。

图 19. 生成默认模式的选项
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

刷新 ProjectXSLT 文件夹,现在应该可以看到默认模式已被添加到项目的 XML Schema 文件夹 中。

图 20. XML 文件夹中的默认模式
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

按照相同的过程,生成用于 getOneEmp 的默认模式。右键单击该操作,并选择 Manage XSLT。 单击 Generate Default,然后单击 Save 保存该文件。

图 21. 生成用于 getOneEmp 操作的模式
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

单击 Finish。刷新该项目,应该可以在 XML Schema 文件夹中看到 getOneEmp 操作的默认模式文件。

图 22. XML 文件夹中的默认模式
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

理解默认模式

生成的默认模式包含两个元素定义。用于输入消息的元素定义的名称与操作名称相同(getOneEmp),而用于输出消息的元素定义的名称由操作名称加上后缀 “Response”(getOneEmpResponse)构成。SQL 查询的输入参数在输入消息中列出。清单 1 显示了生成的 getOneEmp 操作的模式:

清单 1. 生成的默认模式

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
targetNamespace="urn:example" xmlns:tns="urn:example"> 
 <element name="getOneEmp"> 
  <complexType> 
   <sequence> 
    <element name="empno" type="xsd:string" nillable="true"/> 
   </sequence> 
  </complexType> 
 </element> 
 <element name="getOneEmpResponse"> 
  <complexType> 
   <sequence> 
    <element maxOccurs="unbounded" minOccurs="0" name="row"> 
     <complexType> 
      <sequence> 
       <element name="EMPNO" type="xsd:string"/> 
       <element name="FIRSTNME" type="xsd:string"/> 
       <element name="MIDINIT" type="xsd:string" nillable="true"/> 
       <element name="LASTNAME" type="xsd:string"/> 
       <element name="WORKDEPT" type="xsd:string" nillable="true"/> 
       <element name="PHONENO" type="xsd:string" nillable="true"/> 
       <element name="HIREDATE" type="xsd:date" nillable="true"/> 
       <element name="JOB" type="xsd:string" nillable="true"/> 
       <element name="EDLEVEL" type="xsd:short"/> 
       <element name="SEX" type="xsd:string" nillable="true"/> 
       <element name="BIRTHDATE" type="xsd:date" nillable="true"/> 
       <element name="SALARY" type="xsd:decimal" nillable="true"/> 
       <element name="BONUS" type="xsd:decimal" nillable="true"/> 
       <element name="COMM" type="xsd:decimal" nillable="true"/> 
      </sequence> 
     </complexType> 
    </element> 
   </sequence> 
  </complexType> 
 </element> 
</schema> 

这个模式定义 XML 输入和输出消息的默认格式,可以使用它作为开发 XSL 脚本的起点。

另外需要注意的是,该默认模式可以按您想要的别名返回这些元素的名。所以,如果像下面这样定义了一个数据库操作:

 select EMPNO as "empNumber" from EMPLOYEE 

那么以上模式(清单 1)中的元素名 EMPNO 就是:

 <element name="empNumber" type="xsd:string"/> 

在下一节中,您将看到一些 XSL 例子。

将 XML 转换为 HTML

Data Web Services 中可用的 Xalan Extension 函数
Data Web Services 使用 Xalan XSLT 处理程序扩展来钩接(hook)一个本地 Java 函数。目前,下面这些 Xalan 函数在 Data Web Services 中都是受支持的:

encodeJSON():将字符串转换为 JSON 编码

getHTTPRequestHeader(String header):允许访问当前请求的 HTTP 请求头

getHTTPRequestURL():返回用于当前请求的 URL

setHTTPResponseHeader(String header, String value):允许设置一个 HTTP 响应头

这些函数是在 com.ibm.datatools.dsws.rt.common.Util 类中实现的静态方法,所以任何 Data Web Services 安装都提供这些函数。可以从 XSL 脚本中直接调用或引用这些方法。

接下来的三个小节展示一些例子,演示如何执行从 XML 到其他格式的转换,例如 HTML、JSON 和 RSS。REST 风格的用例更简单和易于理解,因为它们不涉及定制的 XML 模式,并且只是对输出消息应用转换。

Data Web Services 使用 XSLT 将输出转换成各种不同的格式。XSLT version 1.0 缺少一些基本的字符串处理函数,因此 Data Web Services 使用 Xalan XSLT 处理程序扩展来钩接用于转换字符串的本地 Java 函数。这个扩展由一些在 com.ibm.datatools.dsws.rt.common.Util 类中实现的静态方法组成,所以任何 Data Web Services 安装都提供这些方法。要获得详细信息,请参阅侧边栏。

首先看看从 XML 到 HTML 的转换。完成以下步骤,将 XML 输出转换成 HTML 格式:

可以使用 Data Studio Developer 提供的 XSL 工具来开发 XSL 文件。右键单击项目,选择 New > XSL。 如果没有看到 XSL 选项,那么选择 New > Other,然后选择 XML > XSL。

图 23. 创建定制的 XSL 文件
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

可以使用默认的文件名,也可以另外命名。这个例子使用 getAllEmpAsHTML.xsl 作为文件名。单击 Finish。

图 24. 命名定制的 XSL 文件
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

这样 XSL 文件模板就创建好了,并显示在项目的 XSLT 文件夹中。

图 25. 新创建的定制 XSL 文件模板
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

现在更改这个模板,创建一个定制的 XSL 文件,以便将操作(getAllEmp)的输出转换为 HTML 格式。下面的例子展示了如何格式化输出并将其显示在一个 HTML 表中的一种方法。

method="html" 属性指定要生成一个 HTML 文档。

encoding="UTF-8" 属性指定响应文档中的字符将被编码为 UTF-8。

media type 定义用于 HTTP 响应消息的 MIME 类型。

值为 “/*” 的 match 属性指定将在源文档的根元素节点上调用它。

xsl:if 元素用于测试是否至少有一个可用的行。如果没有,那么就得不到列的名称。如果条件成立,则找到第一行中的所有元素(通过 XPath 表达式)。xsl:for-each 指令指定对 select 属性中的 XPath 表达式返回的节点列表中的每个元素重复 including 指令。在这个例子中,只选择 row[1],因为只需要包含列名称的第一行。

xsl:value-of 指令将一个字符串写到输出中。select 属性包含一个 XPath 表达式。在这里,它是一个返回元素本地名称的 XPath 函数。这是表标题的名称。

接下来的 xsl:for-each 指令用于迭代所有的行。并在其内部再次使用 xsl:for-each 迭代所有的列。

然后使用 xsl:value-of 指令将值写出到结果文档中。这里使用 XPath 函数 text() 找到值,以获得 column 标记的 text 节点。


清单 2. getAllEmpAsHTML.xsl - 定制 XSL 将输出转换为 HTML 格式

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  version="1.0" 
  xmlns:xalan="http://xml.apache.org/xslt"> 
  <xsl:output method="html" encoding="UTF-8" media-type="text/html"/> 
   
  <xsl:template match="/*"> 
 <html> 
     <head> 
      <title>All employees</title> 
     </head> 
     <body> 
      <table border="1"> 
        <tr bgcolor="#9acd32"> 
         <xsl:if test="//row"> 
           <xsl:for-each select="//row[1]/*"> 
            <td><xsl:value-of select="local-name()"/></td> 
           </xsl:for-each> 
         </xsl:if> 
        </tr> 
        <xsl:for-each select="//row"> 
         <tr> 
         <xsl:for-each select="*"> 
            <td><xsl:value-of select="text()"/></td> 
           </xsl:for-each> 
         </tr> 
        </xsl:for-each> 
      </table> 
     </body> 
    </html> 
  </xsl:template> 
</xsl:stylesheet> 

现在,可以将这个 XSL 文件应用到操作上。为此,右键单击操作,选择 Manage XSLT。

图 26. 将 XSLT 文件应用到操作
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

在 XSL file 中,在 Transformation of Output Messages 下,找到刚才创建的定制的 XSL 文件,并单击 Open。

图 27. 浏览 XSLT 文件
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

现在,定制的 XSL 文件被应用到输出消息。在 Configure XSL Transformation 向导中单击 Finish。

图 28. 将 XSLT 文件应用到输出消息
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

右键单击该 Web 服务,并选择 Build and Deploy,以构建和部署它。

图 29. 构建和部署 Web 服务
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

在 Type 中选择 WebSphere Application Server Community Edition V1.1,选择前面创建的 WebSphere Application Server Community Edition 服务器实例(通过选择 Server 旁边的 New),并选择 Data handler 中的 JDBC。此外还有一些可选的选项,包括 Data Web Services test client、Launch test client after deployment 和 Launch Web Services Explorer after deployment。您可以选择这些选项,查看示例请求和响应字符串。单击 Finish。

图 30. 构建和部署选项
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

打开一个浏览器,使用 REST 绑定访问操作。

图 31. 以 HTML 表格式返回的结果
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

为什么操作不出现在 Web Services Explorer 中?
该操作没有出现在 Web Services Explorer 中,因为还需要添加其他步骤,它才能成为一个 “真正” 的 SOAP 操作。另外还需要一个定制的模式文档,以通过元素定义(不能引用类型定义)描述定制的输入和/或输出消息格式。这还将在 通过 SOAP 绑定指定用于公开一个操作的定制模式 小节加以论述。(为了使内容完整,这个小节还谈到了如何为 getOneEmp 操作添加定制模式。对于 getAllEmp 操作也可以采取相同的方法)。

注意,当查看 Web Services Explorer 时,在 SOAP 绑定中看不到 getAllEmp 操作。只能通过 HTTP POST/GET 绑定找到它。要获得详细信息,请参阅侧边栏。

图 32. getAllEmp 不在 SOAP 绑定中,而是在 HTTP GET/POST 绑定中
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

将 XML 转换为 JSON

现在看看 XML 到 JSON 的转换。完成以下步骤,将 XML 输出转换为 JSON 格式:

使用以下示例文件将结果格式化为 JSON。如前一节所述,右键单击项目并选择 New > XSL。

图 33. 用于 JSON 转换的 XSL 模板
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

可以更改生成的模板,添加以下代码。方法 encodeJSON() 是使字符串 JSON 安全的静态 Java 函数。


清单 3. getAllEmpAsJSON.xsl - 定制将输出转换为 JSON 格式的 XSL

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  version="1.0" 
  xmlns:xalan="http://xml.apache.org/xslt" 
  xmlns:json="http://www.json.org" 
  exclude-result-prefixes="xalan json"> 
   
  <xsl:output method="text" encoding="UTF-8" media-type="text/plain"/> 
   
  <xalan:component prefix="json" functions="encodeJSON"> 
<xalan:script lang="javaclass" src="xalan://com.ibm.datatools.dsws.rt.common.Utils"/> 
</xalan:component> 
   
  <xsl:template match="/*"> 
   
  [[<xsl:if test="//row"><xsl:for-each select="//row[1]/*"> 
{"name":"<xsl:value-of select="json:encodeJSON(local-name())" />"} 
<xsl:if test="position()!=last()">,</xsl:if></xsl:for-each></xsl:if>] 
  ,[<xsl:for-each select="//row"> 
    [<xsl:for-each select="./*">"<xsl:value-of select="json:encodeJSON(.)"/>" 
<xsl:if test="position()!=last()">,</xsl:if></xsl:for-each>] 
    <xsl:if test="position()!=last()">,</xsl:if></xsl:for-each>]] 
  </xsl:template> 
</xsl:stylesheet> 

选择将这个 XSL 文件添加到项目的 XSLT 文件夹中。

图 34. 将 XSL 添加到 XSLT 文件夹中
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

右键单击操作 getAllEmp 并选择 Manage XSLT,将这个 XSL 文件应用到该操作。

图 35. 应用 XSL 文件
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

和前面一样,找到前面创建的用于将输出转换为 JSON 格式的 XSL 文件,然后单击 Open。

图 36. 选择文件
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

在 Configure XSL Transformations 向导中单击 Finish。

图 37. 选择的定制 XSL 文件
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

使用下面的选项构建和部署 Web 服务,然后单击 Finish。

图 38. 构建和部署 Web 服务
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

打开浏览器,并使用 REST 绑定访问操作:

图 39. 以 JSON 格式返回的结果
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

将 XML 转换为 RSS

Data Web Services 还可以用于从数据库数据(包括 XML 文档)创建常见的 RSS feed。本节提供一个相关的例子。如前所述,Data Web Services 支持一组新的静态 Java 函数,这些函数可直接在 XSL 脚本中调用。通过这些函数可以获取请求 URL(HTTP 请求头的值),还可以设置 HTTP 响应头的值。本节中的 XSL 脚本将使用这些函数。

表 1. Data Web Services 支持的静态 JAVA 函数

方法作用
java:com.ibm.datatools.dsws.rt.common.Utils.getHTTPRequestHeader(String header)以字符串形式返回指定的 HTTP 请求头的值
java:com.ibm.datatools.dsws.rt.common.Utils.getHTTPRequestURL()返回客户机用于发出请求的 URL
java:com.ibm.datatools.dsws.rt.common.Utils.setHTTPResponseHeader(String header, String value)以给定的名称和值设置响应头

下面的场景演示如何在一个包含 XML 文档(表示实际实体)和附加元数据的表上构建一个 RSS 2.0 feed。实际上,feed 和实体可能需要通过复杂的 SQL 查询或存储过程调用才能得到。为简单起见,这个示例只使用一个表。下面是 create table 语句:

清单 4. createTable.sql - create table 语句

CREATE TABLE RSSTEST ( 
  ID INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY 
  (START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 32672 NO CYCLE CACHE 20), 
  Title VARCHAR(50) NOT NULL, 
  Description VARCHAR(255), 
  doc XML NOT NULL, 
  modified TIMESTAMP 
) 
DATA CAPTURE NONE ; 
ALTER TABLE RSSTEST ADD CONSTRAINT rsstest_PK PRIMARY KEY (ID); 
 

您将定义以下操作来实现 RSS feed。getFeed 和 getDocument 操作用于生成 feed。insertDocument 操作用于将测试文档插入到数据库中,但是对于 RSS feed 不需要使用它。

表 2. 实现 RSS feed 的操作

操作SQL 语句
getFeedSELECT id, title, description, modified FROM rsstest
getDocumentSELECT doc FROM rsstest where id=:id
insertDocumentINSERT INTO rsstest VALUES(DEFAULT, :title, :description, :doc, current timestamp)

首先,运行 createTable SQL 语句。然后,使用 insertDocument 语句将示例数据插入到数据库中。

将 getFeed 和 getDocument 操作拖放到 Web 服务上。图 40 展示了定义了用于实现 RSS feed 的 Web 服务操作之后项目:

图 40. 包含 RSS 操作的项目
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

图 41 显示了示例数据:

图 41. 用于 RSS feed 的示例数据
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

由于 getDocument 操作只返回一行,所以为了优化查询,可以使用 Data Web Services 的一个新特性 “Fetch only single row for queries”。为此,右键单击操作 getDocument 并选择 Edit。

图 42. 编辑操作,使它只取一行
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

选择 Fetch only single row for queries,并单击 Finish。这将消除结果中的 <row> 标记。

图 43. 取单行选项
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

现在定义两个 XSL 文档:一个用于 getFeed 操作的输出(以创建 feed),另一个用于 getDocument 操作的输出(以显示纯 XML 文档)。

下面的 XSL 文档基于 getFeed 操作的输出,并从该输出创建 RSS feed XML 格式(Version 2.0)。为了引用实际的文档,在 URL 中使用当前条目的 ID 作为标识符调用 getDocument 操作。这导致 feed 阅读器以用户选择 feed 条目时提供的 ID 调用 getDocument 操作。为了能够以 RSS feed 要求的格式显示修改时间,必须构造一个遵从 feed 要求的时间格式的字符串。为此,使用 EXSLT 函数(在 Xalan XSL 中)进行日期/时间数据处理。

清单 5. rssFeed.xsl - 指定 getFeed 操作的输出的 XSL 文件

 
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
  xmlns:xalan="http://xml.apache.org/xslt" 
  xmlns:java="http://xml.apache.org/xalan/java" 
  xmlns:date="http://exslt.org/dates-and-times" 
  exclude-result-prefixes="xalan java date"> 
   
  <xsl:output method="xml" encoding="UTF-8" media-type="application/rss+xml"/> 
   
  <xsl:preserve-space elements="*"/> 
   
  <xsl:template match="/*"> 
    
    <!-- access the current request context and look for the request URL --> 
 
   <xsl:variable name="requestUrl" 
   select="java:com.ibm.datatools.dsws.rt.common.Utils.getHTTPRequestURL()"/> 
 
 
    <rss version="2.0"> 
     <channel> 
      <title>Data Server Web Services Feed Test</title> 
      <description>This is a feed test using IBM's Data Server Web Services, 
       request URL: <xsl:value-of select="$requestUrl"/></description> 
      <ttl>5</ttl> 
     <xsl:for-each select="//row"> 
       <item> 
        <title><xsl:value-of select="TITLE/text()"/></title> 
        <description><xsl:value-of select="DESCRIPTION/text()"/></description> 
         
    <!-- 
     refer to our getDocument operation with the key for the current document 
     RSS readers require absolute URLs to address the items - so, use the 
     URL for the current request and remove the getFeed operation name so 
     that we get the pure REST endpoint and use this to assemble the call 
     to our getDocument operation 
    --> 
        <link><xsl:value-of select="substring-before($requestUrl,'getFeed')"/> 
         getDocument?id=<xsl:value-of select="ID/text()"/></link> 
        <guid><xsl:value-of select="substring-before($requestUrl,'getFeed')"/> 
         getDocument?id=<xsl:value-of select="ID/text()"/></guid> 
        <pubDate><xsl:value-of 
            select="concat(date:day-abbreviation(MODIFIED/text()), 
                   ', ', 
                   date:month-abbreviation(MODIFIED/text()), 
                   ' ', 
                   date:day-in-month(MODIFIED/text()), 
                   ' ', 
                   date:year(MODIFIED/text()), 
                   ' ', 
                   date:hour-in-day(MODIFIED/text()), 
                   ':', 
                   date:minute-in-hour(MODIFIED/text()), 
                   ':', 
                   date:second-in-minute(MODIFIED/text()), 
                   ' GMT')"/></pubDate> 
       </item> 
     </xsl:for-each> 
     
     </channel> 
    </rss> 
      
  </xsl:template> 
</xsl:stylesheet> 
 

为了返回没有附加包装器标记的纯 XML 文档,将以下 XSL 文档应用到 getDocument 操作的输出上。

清单 6. rssDocument.xsl - 应用到 getDocument 操作的输出的 XSL 文件

 
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
  xmlns:xalan="http://xml.apache.org/xslt" 
  exclude-result-prefixes="xalan"> 
 
  <xsl:output method="xml" encoding="UTF-8" media-type="text/xml"/> 
   
  <xsl:template match="/*"> 
     <xsl:copy-of select="//DOC/*"/> 
  </xsl:template> 
   
</xsl:stylesheet> 

将这些 XSL 文件应用到 getFeed 和 getDocument 操作上。为此,右键单击操作并选择 Manage XSLT。找到 XSL 文件,并单击 Finish。

图 44. 浏览应用到 getFeed 操作上的 XSL 文件
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

图 45. 浏览应用到 getDocument 操作上的 XSL 文件
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

构建和部署 Web 服务。为了定制 feed,可以使用执行 getFeed 操作的 URL。例如:http://localhost:8080/ProjectXSLTMyWebServiceXSLT/rest /MyWebServiceXSLT/getFeed。

可以使用任何 feed 阅读器,例如 Sage for Firefox、RSS Reader、Google Reader 等。这个例子使用 Sage for Firefox。

在 Sage 窗口中单击右键,并选择 New Bookmark,定义一个书签。将以下属性添加到这个书签中。这个书签如下图所示:

图 46. 书签的属性
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

前面插入到数据库中的 XML 数据现在可以被各种不同的 feed 访问。

图 47. XML 数据现在可以被 feed 访问
使用 IBM Data Studio Developer 中的 XSLT 转换 Data Web Services 消息(上)

Tags:使用 IBM Data

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接