使用 XSLT 处理 WSDL 文档
在 Web 服务的世界中,Web 服务描述语言(Web Services Description Language,WSDL)文档对 Web 服务提供的接口进行描述,并指示可以在网络上什么位置找到这些 Web 服务的实例。
Web 服务标准的架构师刻意选择了使用 XML 表示 WSDL 文档,其中的部分原因是出于使它们能够为各种开发工具所解析和理解。虽然这一承诺的大部分都已经实现了,但使用 XSLT(最强大的基于 XML 的工具之一)可靠地处理 WSDL 文档仍然有很大的挑战。本文将给出可用于采用 XSL 样式表对 WSDL 进行深入了解的方法,并说明了一些应该避免的常见错误。
引言
在 Web 服务的世界中,Web 服务描述语言(Web Services Description Language,WSDL)文档对 Web 服务提供的接口进行描述,并指示可以在网络上什么位置找到这些 Web 服务的实例。一般而言,WSDL 文档是通过各种开发工具撰写的,也是通过这些工具进行使用的。对于几乎所有与 Web 服务相关的信息,WSDL 文档都采用标准的 XML 文档格式进行表示。
XML 的优势之一就是,可以采用越来越强大的工具来对数据进行处理。XSLT 就是此类工具中的一员,可以用于有效地对 XML 数据进行复杂转换。由于 WSDL 文档表示为 XML,因此可以使用 XSLT 自动实现很多 WSDL 转换任务。本文描述了一些经过证实的、可使用 XSLT 有效地处理 WSDL 文档的方法(也有一些未经证实的方法),并列出了一些通用技术,以帮助简化 WSDL 文档的自动处理。
本文假定您有使用 WSDL 和 XSLT 的经验。以下 IBM developerWorks 上的链接可提供有用的背景信息:
- 有关 WSDL 等 Web 服务标准的背景信息,请访问 Standards and Web services。
- 有关 WSDL 的更多信息,请参阅文章 New to SOA and Web services。
- 有关 XSLT 的更多信息,请参阅 New to XML。
SAX 及 DOM 与 XSL 的比较
有两种修改 WSDL 文档的基本方法。第一种方法是结合使用一种语言(如 Java 或 C)和一个 XML 解析 API(如 SAX 或 DOM)。将读取原始 WSDL 文档,算法将对其内容进行分析和修改,并将构造修改后的 WSDL 文档——通过手动将字符串装配为文档或使用特定于语言的 XML 库进行。第二种方法将利用 XSL 转换,该 XSL 转换指定应如何对输入 WSDL 文档进行操作,以产生输出 WSDL 文档。虽然本文描述的很多技术都适用于第一种方法,但 XSL 方法具有以下几个优势:
- 通用语言没有用于处理 XML 文档的特殊构造。当然可以将其用于此类任务,但这样会要求进行多得多的工作,才能达到等效的结果。
- 对于通用语言,为了实现转换而需要大量代码,从而会丢失转换背后的一些概念。XSL 转换的相对简洁使得基础概念更为明显,从而更便于进行调试和维护。
- XSL 转换可以由很多不同的工具进行处理,其中很多工具现在都可以通过各种渠道方便地获得。例如,大部分 Linux 分发版本都提供 ant 构建工具、libxslt 软件包,而 Java 运行时环境和很多 Web 浏览器都可以执行 XSL 转换。
全面来看,应当注意,XSL 在表示并不与输入 XML 文档的结构直接相关的算法方面有一定的不足。如果所需的转换大量使用了此类算法,采用通用语言可能比使用 XSL 更好。
WSDL 的挑战
使用 XSL 从 WSDL 文档提取结构会带来一些重要的挑战。为了便于尽可能适应各种 XSL 转换引擎,请将样式表限制为 XSL 1.1 版中定义的特性。XSL 2.0 版中定义的某些特性可简化本文中所示的一些 XSL,但该版本在一定时间内还不会在很多环境中广泛使用。
使用 XSL 处理 WSDL 文档的最大障碍在于 WSDL 文档内的属性值内大量使用了名称空间前缀。这些名称空间前缀用于使消息、portType、绑定和端口相关。虽然 XSL 非常擅长处理输入文档中的元素和属性上的名称空间,但其用于在属性值和字符数据中处理名称空间的构造却有一些欠佳。
- 本文关键词:

