选择显示字体大小

用xsl翻译web服务应用程序

web服务应用程序存在的一个常见问题是,真正的后端软件不支持xml(或者至少不支持你web服务所使用的标准化的xml)。要解决这个问题,很多架构都实施了一个翻译阶段,用来解释收到的xml,并将它转换成为后端系统能够识别的更加适当的格式。 虽然将xml翻译成不同的格式有很多种方式法,但是可扩展样式表语言(extensiblestylesheet language,xsl)提供了一个强健的、标准的和对xml友好的解决方案。

一些常见的问题
 
xml消息和将要处理它的应用程序之间,存在着很多种可能需要翻译的地方。但是,这也存在着很多常见的问题,包括:

查询(lookup)
映射(mapping)
聚合(aggregation)
分割(splitting)
公式(formulas)
重排序(reordering)
查询处理会接受收到的值,并为目标系统将它映射到不同的值。例如,你的xml有一个值是309,但是应用程序需要的值是“uber widget”。

映射在本质上是将来自一个字段的值重新分配为另一个值。例如,在xml里,你可能有一个accountnumber元素,它需要被重新分配成为一个叫做customeraccountnumber的新元素。

聚合处理是将两个或者更多来自xml的项目组合成一个用于后端系统的单个项目。一个常见的例子是将姓和名字段组合成单一的姓名(字段)。分割是聚合的逆向操作,它是将xml的一个值分成两个或者更多分开的组件。

公式处理一般涉及对一个或者更多xml值的计算,以获得一个用于新应用程序的值。一个例子是利用xml里子定单来计算定单的总量。

最后,重排序是更改xml里项目的序列或者结构的处理,这样它们就能够符合目标系统所期望的序列或者结构。

映射举例
现在让我们用一个例子来更加仔细地看看这个过程。我们假设收到的xml就像listing 1里的一样:

listing 1: webserviceorder.xml

<?xml version="1.0" ?>
<order>
  <ordernumber>8100</ordernumber>
  <accountnumber>99213</accountnumber>
  <item>
    <sku>2388</sku>
    <description>uber widget</description>
    <quantity>15</quantity>
    <priceper>10.95</priceper>
  </item>
  <item>
    <sku>6273</sku>
    <description>flangeoid</description>
    <quantity>10</quantity>
    <priceper>52.00</priceper>
  </item>   
</order>

现在,我们的订单系统需要一个稍有不同的格式。我们所需要做的是将从web服务收到的订单转换成为listing 2里的这种格式。

listing 2: applicationorder.xml

<?xml version="1.0" encoding="utf-8" ?>
<neworder>
  <customeraccountnumber>99213</customeraccountnumber>
  <customerordernumber>8100</customerordernumber>
  <orderitems>
    <orderitem>
      <sku>2388</sku>
      <customerprice>10.95</customerprice>
      <quantity>15</quantity>
      <subtotal>164.25</subtotal>
    </orderitem>
    <orderitem>
      <sku>6273</sku>
      <customerprice>52.00</customerprice>
      <quantity>10</quantity>
      <subtotal>520</subtotal>
    </orderitem>
  </orderitems>
</neworder>
 

翻译
 
由于这是一个经过简化的例子,所以我们在转换格式的时候需要对xsl模板所做的只有不多的一些事情。我们要注意的第一件事是:我们必须映射一些元素:

把order映射成neworder
把accountnumber映射成customeraccountnumber
把ordernumber映射成customerordernumber
把item映射成orderitem
把priceper映射成customerprice
然后,我们需要将orderitem元素重新安排到一个叫做orderitems的新元素之下。最后,我们加入一个叫做subtotal的新元素,它会根据(商品)单价和数量进行计算。

映射翻译是最简单的,因为你只需要简单地在模板里定义新元素,并指明这个新元素拥有来自收到的xml文档里元素的值。对items的重排序是通过将item子模板调用放进一个叫做orderitems的新元素里实现的。最后,使用一个简单的xpath表达式来进行计算。listing 3显示了用来将收到的xml转换成针对应用程序的xml的xsl文档。

listing 3: translate.xsl

<?xml version="1.0"  ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform">
  <xsl:template match="/">
    <xsl:apply-templates select="order" />
  </xsl:template>

  <xsl:template match="order">
    <neworder>
      <customeraccountnumber><xsl:value-of select="accountnumber" /></customeraccountnumber>
      <customerordernumber><xsl:value-of select="ordernumber" /></customerordernumber>
      <orderitems>
        <xsl:apply-templates select="item" />
      </orderitems>
    </neworder>
  </xsl:template>

  <xsl:template match="item">
    <orderitem>
      <sku><xsl:value-of select="sku" /></sku>
      <customerprice><xsl:value-of select="priceper" /></customerprice>
      <quantity><xsl:value-of select="quantity" /></quantity>
      <subtotal><xsl:value-of select="priceper * quantity" /></subtotal>
    </orderitem>
  </xsl:template>
   
</xsl:stylesheet>

本文作者brian schaffner是富士通咨询公司的副主任。他为富士通的技术咨询公司提供架构、设计和开发支持。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons