IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Information Management  >

使用 XSL 将 DB2 数据发布为 PDF

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

JoÃo Alberto de Oliveira Lima (joaolima@acm.org), 软件工程师,巴西

2004 年 3 月 01 日

本文描述了使用 XSL(可扩展样式表语言)以 PDF 格式发布 DB2 数据的简单方法。该过程需要三个步骤:第一,使用 DB2 新的内置函数创建一个 XML 文件;第二,使用 XSL-FO(可扩展样式表语言 - 格式化对象)转换该文件;最后但也是很重要的,使用 XSL-FO 处理器将文件转换为 PDF 格式。

在 Internet 上进行信息发布的一种主要格式就是可移植文档格式(Portable Document Format,PDF),它是由 Adobe Systems 于 1993 年创建的。PDF 是一种开放的实际标准,用于在任何具有 Adobe Acrobat Reader 的平台上以高保真度的方式复制文档格式特征、字体以及图像。如果在 Web 上发布 DB2® 数据,您或许会希望直接将数据发布为 PDF 格式。正如在本文中将讨论的,您可以利用由 DB2 Universal Database TM所提供的对 XML 的支持来将数据发布为一个 PDF 文档。

IBM 在 DB2 UDB 的近期版本中已经不断改进了对 XML 的支持。Version 8 带来了新的函数(XMLAGG、XMLELEMENT 和 XMLATTRIBUTES)以助于将 DB2 数据转换为 XML 格式。这些函数均独立于 XML Extender,并且遵从将来的 SQL 标准(ISO/IEC 9075-14 - SQL/XML)。

XML 技术已经越来越多地用于多种类型的应用程序中。XML 本身就是 XML 家族的核心。根据不同的应用程序,您可以使用处理特定方面的其他家族标准(“W3C 推荐标准”)。例如,XML 的一个主要特点就是可以将内容与表示分离开来,尽管您也可以使用 XSL 来定义表示特征。

本文涵盖了下列主题:

  • DB2 XML 内置函数—— 本小节讨论新的 DB2 函数。
  • XSL = XSLT + XSL-FO + XPath —— 本小节介绍处理样式的 W3C 推荐标准(recommendation)的基本概念。
  • PDF 的创建 —— 本小节向您展示如何使用 XSL-FO 处理器(XSL-FO renderer,FOP)来创建 PDF 文档。

为了说明每一小节的内容,我将展示一个示例,用 DB2 UDB SAMPLE 数据库中某些表里的数据来生成一个 PDF 文件。

DB2 XML 内置函数

在探究新的内置函数如何工作之前,您应该先要熟悉新的 DB2 数据类型,即 XML 数据类型。这是一种 XML 内部的暂时表示,不支持列定义或该数据类型的应用程序返回。总是有必要使用标量函数 XML2CLOB(xml-data-type):clob-data-type 来将 XML 内容串行化为 CLOB 数据类型 。

新的 DB2 XML 函数允许以简单、直接的方式创建 XML 格式的数据。将 XMLELEMENT 和 XMLATTRIBUTES 这两种标量函数相结合,就可设置形成 XML 文档的基本元素。因为这都是些标量函数,所以将为结果集的每一行创建 XML 数据类型的结果。并且还可使用 XMLAGG 列函数将结果集的各行进行分组。

新的 XML 函数如下:

  • XMLELEMENT —— 创建 XML 元素的标量函数。
  • XMLATTRIBUTES —— 创建元素属性的标量函数(必须总是用于 XMLELEMENT 函数中)。
  • XMLAGG —— 将几个元素组成一个父元素的列函数。

清单 1 中展示了 XMLELEMENT 和 XMLATTRIBUTES 函数的语法。注意第 3 行中,如果元素存在某些属性,就应该恰好在元素名称之后,元素内容(第 4 行)之前告知。参数“element_content”是一个表达式结果,该表达式提供这些数据类型中的一种:SMALLINT、INTEGER、BIGINT、DECIMAL、NUMERIC、REAL、DOUBLE、CHAR、VARCHAR、LONG VARCHAR、CLOB、GRAPHIC、VARGRAPHIC、LONG VARGRAPHIC、DBCLOB、DATE、TIME、TIMESTAMP、XML 或其源类型为上述数据类型之一的任何独特类型。另一方面,参数“attribute_value”(第 7-8 行)也是一个表达式结果,而该表达式除了对 XML 类型以外都将返回与“element_content”相同的数据类型。

清单 1. XMLELEMENT 和 XMLATTRIBUTES 函数的语法
1. XMLELEMENT_FUNCTION ::= 
2.    XMLELEMENT ( NAME element_name 
3.       	     [ , XMLATTRIBUTES_FUNCTION ]
4.           [ { , element_content } ] )
5.              
6. XMLATTRIBUTES_FUCTION ::=
7.   XMLATTRIBUTES ( attribute_value [ AS attribute_name ]
8.            [ { , attribute_value [ AS attribute_name ] } ] )

表 1展示了这些函数的一些示例。结果列已经被格式化了,以便我们易于查看产生的 XML。作为处理 XML2CLOB 函数的结果,DB2 不会在 XML 元素间填充空白区或插入换行符。

表 1. 函数 XMLELEMENT 和 XMLATTRIBUTES 的示例
# SQL 结果

1

select  xml2clob(
           xmlelement(NAME "empName", firstnme)
        )
from employee
where empno = '000200';

<empName>DAVID</empName>

2

select  xml2clob(
   xmlelement(
       NAME "empName", 
       xmlelement(NAME "firstName", firstnme),
       xmlelement(NAME "lastName", lastname)
   )
)
from employee
where empno = '000200';

<empName>
   <firstName>DAVID</firstName>
   <lastName>BROWN</lastName>
</empName>

3

select  xml2clob(
   xmlelement(NAME "employee",
      xmlattributes(empno as "empNo"), 
      xmlelement(
          NAME "empName", 
          xmlelement(NAME "firstName", firstnme),
          xmlelement(NAME "lastName", lastname)
      ),
     xmlelement(NAME "empJob", job),
     xmlelement(NAME "empSalary", salary),
     xmlelement(NAME "empBonus", bonus),
     xmlelement(NAME "empComm", comm)
   )
)
from employee
where empno = '000200'

<employee empNo="000200">
   <empName>
      <firstName>DAVID</firstName>
      <lastName>BROWN</lastName>
   </empName>
   <empJob>DESIGNER</empJob>
   <empSalary>0027740.00</empSalary>
   <empBonus>0000600.00</empBonus>
   <empComm>0002217.00</empComm>
</employee>

注意,正如您从示例中可看到的,仅需要在外层使用一次 XML2CLOB 函数。另外注意,示例 3 中用了函数 XMLATTRIBUTES 来创建“employee”元素中的“empNo”属性。

表 1的示例中,产生的 XML 仅仅引用 EMPLOYEE 表中的一行。可使用 XMLAGG 函数对多个行进行分组。 清单 2展示了该函数的语法。

清单 2. 函数 XMLAGG 的语法
1. XMLAGG_FUNCTION ::= 
2.   XMLAGG ( XMLELEMENT_FUNCTION 
3.               [ ORDER BY sort_key [ ASC | DESC ]   
4.               [ { , sort_key [ ASC | DESC ] } ] )

注意在第 3-4 行中,ORDER BY 选项用于指定元素应按何种次序连接起来。 清单 4中显示的示例使用函数 XMLAGG 以获得三个组:department、employee 和 project。

SELECT 语句中存在嵌套函数是非常普遍的。您将发现这有助于使命令格式类似于需要创建的 XML 元素的层次结构。该做法极大地提高了命令的可读性。请将下面遵从了建议格式的 SQL 示例与另一个进行了其他格式化的示例进行比较。

表 2. 格式化 SQL 命令

OK

select  xml2clob(
   xmlelement(NAME "employee",
      xmlattributes(empno as "empNo"), 
      xmlelement(
          NAME "empName", 
          xmlelement(NAME "firstName", firstnme),
          xmlelement(NAME "lastName", lastname)
      ),
     xmlelement(NAME "empJob", job),
     xmlelement(NAME "empSalary", salary),
     xmlelement(NAME "empBonus", bonus),
     xmlelement(NAME "empComm", comm)
   )
)
from employee
where empno = '000200'

Not OK

select  xml2clob(xmlelement(NAME "employee", 
          xmlattributes(empno as "empNo"), 
     xmlelement(NAME "empName", 
           xmlelement(NAME "firstName", firstnme), 
     xmlelement(NAME "lastName", lastname)),
     xmlelement(NAME "empJob", job), 
     xmlelement(NAME "empSalary", salary),
     xmlelement(NAME "empBonus", bonus), 
     xmlelement(NAME "empComm", comm)))
from employee
where empno = '000200'

仅在一个 SELECT 命令中就可能创建复杂的 XML 内容。XML 越复杂,SQL 维护就会越难。因此,使用公共表表达式对于更好地构造命令是很有帮助的。 清单 3中的示例显示了使用公共表表达式创建结构化的 XML。

清单 3. 带有 SAMPLE 数据库中数据的 XML 结构
01. <depts>
02.    <dept deptno="...">          -- For each department
03.       <deptName>...</deptName>            
04.          <emps> 
05.             <emp empNo="..."> -- For each employee in this department
06.                <empName>...</empName> -- concat firstname with lastname
07.                <empJob>...</empJob>
08.                <empSalary>...</empSalary> -- empSalary = salary + comm 
                                          --  + bonus
09.             </emp>
10.         </emps>
11.         <projs>
12.             <proj projNo="...">    -- For each project with department 
                                          -- employee participation
13.                <projName>...</projName>      
14.             </proj>
15.         </projs>
16.    </dept>
17. </depts>

注意,在目标结构里出现了三个副本组(第 2、5 和 12 行)。将一些副本分组成一个更高层的元素是很好的做法(第 1、4 和 11 行)。尤其是该分组将有助于 XSL 转换规则的创建。下列 SELECT 命令创建了符合 清单 2中所示结构的 XML。

清单 4. 使用公共表表达式创建 XML 的示例
01. WITH
02. empXMLtab (workdept, empXMLcol) as
03.    (select  
04.       workdept, 
05.       xmlelement(NAME "emps",  
06.       xmlagg(
07. 	         xmlelement(NAME "emp",
08. 	         xmlattributes(empno as "empNo"), 
09. 	         xmlelement(NAME "empName", firstnme || ' ' || lastname),
10. 	         xmlelement(NAME "empJob", job),
11. 	          xmlelement(NAME "empSalary", salary + bonus + comm)
12. 	          ) order by firstnme
13. 	      )  
14.     )
15.    from employee
16.    group by workdept
17.    ),
18. projXMLtab(workdept, projXMLcol) as
19.    (select 
20.       t.workdept, 
21.       xmlelement(NAME "projs",  
22.          xmlagg(
23.             xmlelement(NAME "proj", 
24.                xmlattributes(t.projno as "projNo"),
25.                xmlelement(NAME "projName", t.projname)
26.             ) order by projname
27.          ) 
28.       )
29.     from (select distinct e.workdept, p.projno, p.projname
30.           from employee e,
31.               emp_act ea,
32.               project p
33.           where  e.empno  = ea.empno
34.             and ea.projno = p.projno
35.          ) as t
36.     group by t.workdept
37.     ),
38.  depXMLtab (depXMLcol) as 
39.     (select 
40.        xmlelement(NAME "depts",
41.           xmlagg(
42.              xmlelement(NAME "dept",
43.                 xmlattributes(deptno as "deptno"),
44.                 xmlelement(NAME "deptName", deptname),
45.                 empXMLcol,
46.                 projXMLcol
47.              ) order by deptname
48.           )
49.        )
50.      from department d,  
51.           empXMLtab  e,
52.           projXMLtab p
53.      where d.deptno = e.workdept 
54.        and d.deptno = p.workdept
55.     )
56.  select xml2clob(depXMLcol)
57.  from depXMLtab;

注意,已为每个副本组创建了一个公共表表达式(第 2、18 和 38 行)。并且对于每个 XMLAGG 函数(第 6、22 和 41 行),都存在一个更高层的 XMLELEMENT 函数(第 5、21 和 40 行)致力于封装由 XMLAGG 函数所连接的元素。XMLAGG 函数使用 ORDER BY 子句对组内元素进行排序。

公共表表达式 empXMLtab 和 projXMLtab 选择了列 WORKDEPT 以获得与 DEPARTMENT 表的连接。注意,在第 45-46 行中,XML 内容来自于最开始的两个公共表表达式。

主 SELECT(第 56-57 行)使用 XML2CLOB 函数来串行化 XML 内容。

清单 5中,我们将看到由 SUPPORT SERVICES 部门所创建的部分 XML。

清单 5. 产生的 XML(仅针对 E01 部门)
01.  <dept deptno="E01">                                  
02.      <deptName>SUPPORT SERVICES</deptName>            
03.      <emps>                                           
04.          <emp empNo="000050">                         
05.              <empName>JOHN GEYER</empName>            
06.              <empJob>MANAGER</empJob>                 
07.              <empSalary>000044189.00</empSalary>      
08.          </emp>                                       
09.      </emps>                                          
10.      <projs>                                          
11.          <proj projNo="OP1000">                       
12.              <projName>OPERATION SUPPORT</projName>   
13.          </proj>                                      
14.          <proj projNo="OP2010">                       
15.              <projName>SYSTEMS SUPPORT</projName>     
16.          </proj>                                      
17.      </projs>                                         
18.  </dept>                                              

我们利用新函数创建 SELECT 命令,且该命令生成包含 DB2 数据的 XML。下一步将把 XML 树转换为另一种 XML 树,这种 XML 树将利用 XSL-FO 词汇表来定义如何显示内容。该实现将在下一小节中介绍。





回页首


XSL = XSLT+XSL-FO+XPath

据 W3C 叙述,“XSL 是一种用于表示样式表的语言,由三部分组成:XSL Transformations(XSLT)、XML Path Language(XPath)和XSL Formatting Object(XSL-FO)。XSLT 是一种用于转换 XML 文档的语言。XPath 是一种表达式语言,由 XSLT 用来访问或引用 XML 文档中的部分内容(XPath 还用于 XML Linking 规范)。XSL-FO 是一个用于指定格式化语义的 XML 词汇表”。

它可能看上去有些多余,尤其是处理样式化的 W3C 推荐标准的数目。XML 专家 G.Ken Holman就清晰地阐述了这一点:

“样式化是指将信息呈现为适合于目标读者消费的形式。因为对于给定的一组信息读者可能改变,我们通常需要对该信息应用不同的样式化以获得不一样的呈现,从而满足每个读者的需要。也许需要将某些信息重排,从而对读者来说更有意义。也许需要以不同的方式突出显示某些信息以便关注关键内容。”

“当我们考虑样式化信息时,务必要记住其中涉及到两个不同的过程,而不是仅仅一个过程。首先,我们必须将信息从其创建时所使用的组织转换为消费所需的组织。其次,无论目标媒体是什么,在呈现时,我们都必须表示出重组信息的外观的各个方面。”

该示例中的下一步就是创建一个 XSL 文件,用以将原始的 XML 文档转换为带有 XSL-FO 标签的另一文档。该转换是由 XSLT Engine 完成的。它获得两个输入:带有数据的 XML 文件和带有转换规则的 XSLT 文件(见 图 1)。该处理的输出为带有标签的 XML 文件,而这些标签将与为 XSL-FO 推荐标准所定义的词汇表一致。


图 1. 利用 XSL-FO 进行的样式化过程
利用 XSL-FO 进行的样式化过程

转换规则是使用模板以声明方式指定的。每个模板匹配原始 XML 文件中的元素并且定义作为处理输出而创建的元素的结构和属性。包含在该转换过程中的 XSL-FO 词汇表的元素处理特定的表示方面,比如字体、字号、轮廓、表、页码,等等。务必要记住 XSL-FO 推荐标准只注意页面布局描述,因而将独立于输出格式。注意在 图 1中,XSL-FO 处理器可以生成多种格式的输出。

要理解该转换是如何发生的,请参阅 图 2。它显示了与 Software Support Department 相符的格式化页面。注意,除添加了许多图形元素之外,还添加了几个元素:表的标题、salary 列的总和。


图 2. Software Support Department 的 PDF 输出
示例 PDF 输出

正如通过 SELECT 命令所实现的一样,其中每个分组与一个公共表表达式相关,页面样式表文件(db2pdf.xsl 文件)是使用每个分组的模板构造而成的。请参阅 清单 6中引用了处理 employee 分组的模板的部分 xsl 文件。

注意, 清单 6 中的元素是以别名为前缀的。别名“xsl:”加在遵从 XSLT 推荐标准词汇表的元素之前。这些元素定义来自原始 XML 的转换规则。另一方面,别名“fo:”定义将被聚集为原始 XML 的元素,用以定义页面布局(XSL-FO 推荐标准)。

第 1 行用“match”属性定义在转换过程中将允许使用该模板的元素。这样一来,每个出现的“emps”元素将要受该模板规则的约束。第 2 行启动包含雇员信息表布局的块。然后,第 3 行则启动表定义,而紧接着的 4 行定义该表中的列宽。第 9 到 31 行定义表的标题。请注意出现的那些元素和属性,它们带有诸如轮廓、填充、颜色等表示特征的定义。第 32 行使用“xsl:for-each”元素来定义创建表的主要部分的循环,用以为每个出现的“emp”元素生成一行。第 33 到 51 行格式化了表的主体。注意第 48 和 60 行中数字字段格式掩码定义里“format-numbe”函数的使用。

最后但也很重要的是,第 53 到 63 行定义表中最后一行的表示,该行包含该部门雇员的薪水总和。注意第 60 行中作为 SUM 函数参数的 XPath 表达式。

清单 6. 处理雇员的页面样式模板
01. <xsl:template match="emps">                                                                       
02.   <fo:block font-size="10pt" margin-left="5pt">                                                  
03.    <fo:table table-layout="fixed" >                                                          
04.      <fo:table-column column-width="2cm" />                                                  
05.      <fo:table-column column-width="7cm" />                                                     
06.      <fo:table-column column-width="4cm" />                                                     
07.      <fo:table-column column-width="4cm" />                                                     
08.      <fo:table-body>                                                                         
09.        <fo:table-row>                                                                        
10.          <xsl:attribute name="font-weight">bold</xsl:attribute>                              
11.          <fo:table-cell />                                                                   
12.          <fo:table-cell border-width="0.2pt" border-style="solid" 
                    border-color="gray"          
13.               border-bottom-width="1pt" border-top-width="1pt" >                   
14.            <fo:block padding="2pt">                                                          
15.              Name                                                                               
16.            </fo:block>                                                                       
17.          </fo:table-cell>                                                                    
18.          <fo:table-cell border-width="0.2pt" border-style="solid" 
                   border-color="gray"       
19.               border-bottom-width="1pt" border-top-width="1pt">                   
20.            <fo:block padding="2pt">                                                         
21.              Job                                                                            
22.            </fo:block>                                                                      
23.          </fo:table-cell>                                                                   
24.          <fo:table-cell border-width="0.2pt" border-style="solid" 
                 border-color="gray"       
25.            border-bottom-width="1pt" border-top-width="1pt"
                 text-align="right" 
26.            padding-right="4pt">                                                
27.            <fo:block padding="2pt">                                                         
28.             Total Salary                                                                   
29.            </fo:block>                                                                      
30.          </fo:table-cell>                                                                   
31.        </fo:table-row>                                                                      
32.        <xsl:for-each select="emp">                                                          
33.           <fo:table-row>                                                                   
34.             <fo:table-cell />                                                              
35.             <fo:table-cell border-width="0.2pt" border-style="solid" 
                    border-color="gray"> 
36.               <fo:block padding="2pt">                                                    
37.                 <xsl:value-of select="empName"/>                                          
38.               </fo:block>                                                                 
39.             </fo:table-cell>                                                              
40.             <fo:table-cell border-width="0.2pt" border-style="solid"
                    border-color="gray"> 
41.               <fo:block padding="2pt">                                                    
42.                <xsl:value-of select="empJob"/>                                           
43.               </fo:block>                                                                 
44.             </fo:table-cell>                                                              
45.             <fo:table-cell border-width="0.2pt" border-style="solid" 
                     border-color="gray"  
46.                 text-align="right" padding-right="6pt">                                      
47.               <fo:block padding="2pt">                                                    
48.                  <xsl:value-of select="format-number(empSalary,
                         '###,###')" />            
49.               </fo:block>                                                                 
50.             </fo:table-cell>                                                              
51.           </fo:table-row>                                                                 
52.        </xsl:for-each>                                                                    
53.        <fo:table-row>                                                                     
54.          <fo:table-cell />                                                                
55.          <fo:table-cell />                                                                
56.          <fo:table-cell />                                                                
57.          <fo:table-cell border-width="0.2pt" border-style="solid" 
                  border-color="gray"     
58.              text-align="right" padding-right="6pt">                                 
59.             <fo:block padding="2pt">                                                      
60.               <xsl:value-of select="format-number(sum(emp/empSalary), 
                        '###,###')" />         
61.             </fo:block>                                                                      
62.          </fo:table-cell>                                                                   
63.        </fo:table-row>                                                                      
64.      </fo:table-body>                                                                       
65.    </fo:table>                                                                              
66.  </fo:block>                                                                                
67. </xsl:template>  

我们已经创建了样式表,它定义一组原始转换规则,用于将原始 XML 转换为另一种使用 XSL-FO 页面定义词汇表的 XML。执行转换之后,我们就该将注意力转向根据所需格式呈现输出了。下一小节将展示 PDF 的创建。





回页首


PDF 的创建

本示例的最后部分就是呈现 PDF(见图 1,第二步)。这是由软件 XSL-FO Render 软件自动完成的。本例中,我们将使用 FOP —— 格式化对象处理器(Formatting Object Processor)。FOP 是 Apache Open Source 项目中的一部分,其目的是“向 PDF formatter 提交 XSL-FO,而 PDF formatter 至少遵从 2001 年 10 月 15 日的 W3C 推荐标准中所描述的基本一致性级别,并且遵守 1999 年 3 月 11 日 Adobe Systems 的可移植文档格式规范(Portable Document Format Specification)(Version 1.3)”。

要使用 FOP 创建 PDF 文件,仅需告知遵照 XSL-FO 推荐标准的文件名和输出文件名(清单 7 中的第 1 和 2 行)。还可将从原始 XML 的转换任务授权给 FOP,同样必须告知 XML 文件名和样式表(清单 7 中的第 4 和 5 行)。最后一个示例中,FOP 将在开始呈现 PDF 文件之前调用 Xalan XSLT 处理器。

清单 7. FOP 的执行
01. fop.bat -fo db2toPDF.fo -pdf db2toPDF.PDF         (windows)     
02. fop.sh  -fo db2toPDF.fo -pdf db2toPDF.PDF         (unix)
03. or 
04. fop.bat -xml db2toPDF.xml -xsl db2toPDF.xsl -pdf db2toPDF.PDF  (windows)     
05. fop.sh  -xml db2toPDF.xml -xsl db2toPDF.xsl -pdf db2toPDF.PDF  (unix)

PDF 呈现是本例中最简单的一步。仅需调用处理器来创建文件。FOP 还允许您呈现其他格式的结果,比如 PCL、PS、TXT 和 AWT。





回页首


结束语

PDF 格式允许独立于浏览器类型或平台的数据发布。近年来,它已经成为了一种事实上的标准。XML 技术允许使用 XSL-FO 描述发布材料的页面布局。最后,新的内置 XML 函数支持容易地从 DB2 表中的结构化数据创建 XML 内容。通过一个简单示例,我向您展示了如何用新的函数生成 XML 内容以及如何将之转换为另一使用 XSL-FO 词汇表的 XML。在最后一步中,我们使用 XSL-FO 处理器呈现了 PDF。

关于 XSL-FO e XSLT 的进一步信息,我建议阅读下列教程: “XSL 格式化对象(XSL-FO)基础知识”



参考资料



关于作者

Joao Lima 的照片

JoÃo Alberto de Oliveira Lima 于 1991 年作为一名程序员/分析员开始了他在软件行业的职业生涯。从 1993 以来,他作为开发人员、DBA 和 SQL 性能分析员一直从事 DB2 方面的工作。JoÃo 拥有计算机科学学士学位以及软件工程硕士学位。他通过了以下认证:IBM Certified Developer in“XML and Related Technologies”、IBM Certified Solution Designer in“Business Intelligence V8.1”and IBM Certified Solutions Expert in“DB2 UDB V7.1 DBA for OS/390”、“DB2 UDB V7.1 DBA for Unix, Windows and OS/2”以及“DB2 UDB V7.1 Family Application Development”。他是参考指南“DB2 UDB [Mainframe v. 7]”一书的作者,该书由 Novatec Editora 出版(只有葡萄牙文)。他居住在巴西利亚(巴西)。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款