Sử dụng XSLT trong IBM Data Studio Developer để chuyển đổi các thông điệp dịch vụ Web dữ liệu (Data Web Services)

Cách sử dụng đặc tính XSLT trong dịch vụ Web dữ liệu để tùy biến các thông điệp vào và ra của dịch vụ Web

IBM® Dịch vụ Web dữ liệu là một phần của IBM Data Studio Developer, một nền công cụ đồng nhất cho các máy chủ cơ sở dữ liệu IBM. Dịch vụ Web dữ liệu có thể được sử dụng để thể hiện các thao tác cơ sở dữ liệu và các thủ tục đã được lưu trữ như là các dịch vụ Web mà không phải lập trình. Bạn có thể tùy biến thêm các thông điệp mà các ứng dụng khách gửi và nhận từ các dịch vụ Web. Bài viết này hướng dẫn bạn cách áp dụng các phép biến đổi XSL cho các thông điệp vào và ra để phù hợp với đa dạng khách hàng.

Kavitha Pullela, Kỹ sư phát triển phần mềm, IBM

Author Photo: Kavitha PullelaKavitha Pullela là một kỹ sư phát triển phần mềm làm việc trong nhóm dịch vụ Web dữ liệu tại phòng thí nghiệm thung lũng Silicon của IBM ở San Jose, California. Cô tham gia vào nhóm từ tháng 11 năm 2007 và làm việc trong nhóm phát triển công cụ cho máy chủ dữ liệu của IBM. Các lĩnh vực yêu thích của cô bao gồm tạo dịch vụ Web cho các máy chủ cơ sở dữ liệu của IBM, XML, Java và cơ sở dữ liệu. Kavitha Pullela có bằng kĩ sư điện và bằng thạc sỹ khoa học máy tính của trường đại học Texas, Dallas. Cô cũng đã từng làm việc tại Cisco Systems, Hewlett Packard, và Silicon Graphics trước khi làm việc cho IBM.



Michael Schenker, Kỹ sư phần mềm, IBM

Author Photo: Michael SchenkerMichael Schenker là một kỹ sư phần mềm làm việc tại phòng thí nghiệm thung lũng Silicon của IBM ở San Jose, California. Anh gia nhập vào IBM năm 2002 và làm việc trong nhóm phát triển công cụ cho máy chủ dữ liệu của IBM. Michael Schenker thành thạo trong việc tạo dịch vụ Web cho các máy chủ dữ liệu của IBM. Anh có bằng thạc sĩ về khoa học máy tính của trường đại học khoa học ứng dụng ở Leipzig, Đức



20 05 2009

Trước khi bắt đầu

Tìm hiểu xem mình mong đợi gì từ bài viết này và làm thế nào để có được kết quả cao nhất

Lời giới thiệu

Một đặc tính rất mạnh của các dịch vụ Web dữ liệu là khả năng ứng dụng các biến đổi XSL phía máy chủ cho các phản hồi và yêu cầu dịch vụ Web. Đặc tính này cho phép bạn tùy biến định dạng của các thông điệp mà khách hàng nhìn thấy. Đặc tính này đặc biệt quan trọng trong các trường hợp mà các yêu cầu định dạng dịch vụ Web cho các tổ chức, các ngành chỉ rõ là các thông điệp dịch vụ cần phải có dạng như thế nào.

Các dịch vụ Web dữ liệu có định dạng thông điệp mặc định khi có yêu cầu dịch vụ Web và các thông điệp phản hồi. Định dạng thông điệp và các tên thẻ XML trong các thông điệp đó phụ thuộc vào tên thao tác dịch vụ Web, tập kết quả tên các cột,... Trong một số trường hợp, do yêu cầu định dạng thông điệp hoặc chỉ đơn giản là bởi vì bạn muốn giấu các tên thẻ ngầm định, bạn có thể không muốn để cho khách hàng nhìn thấy các tên thẻ ngầm định đó. Sử dụng đặc tính XSLT phía máy chủ, chúng ta có thể làm cho các yêu cầu XML đến và các kết quả đi có dạng khác với định dạng thông điệp ngầm định của dịch vụ Web dữ liệu.

Nói chung, các dịch vụ Web có thể được xây dựng bằng cả cách tiếp cận từ trên xuống (top-down) hoặc từ dưới lên (bottom-up). Với cách tiếp cận từ trên xuống, bạn bắt đầu với một đặc tả dịch vụ (ví dụ, một tệp WSDL) rồi tiếp theo, chạy đoạn mã phía dưới để sao cho phù hợp với đặc tả đó. Với cách tiếp cận từ dưới lên, bạn bắt đầu với một Java bean hoặc một câu lệnh SQL và đưa ra kết quả là các dịch vụ Web. Sử dụng các dịch vụ Web dữ liệu, bạn bắt đầu với các thao tác DML (ví dụ, các truy vấn) và hiển thị chúng như là các dịch vụ Web. Do đó, đặc trưng là kiểu phát triển chương trình từ dưới lên. Tuy nhiên, bằng cách áp dụng XSLT vào các thông điệp dịch vụ, trong nhiều trường hợp, bạn có thể chiếu định dạng dịch vụ của các thông điệp dạng bottom-up sang thiết kế top-down. Cách này làm giảm bớt một số yêu cầu định dạng dịch vụ kiểu top-down trong khi cho phép bạn phát triển các dịch vụ Web bottom-up. Việc chuyển đổi cũng có thể được sử dụng để chuyển dữ liệu đến cho khách hàng dưới định dạng có thể đọc được ví dụ như là HTML, JSON, RSS feeds hay bất cứ định dạng văn bản(text) nào mà có thể là kết quả từ một phép biến đổi XSL

Bài viết này hướng dẫn để bạn tạo ra và triển khai các dịch vụ Web dữ liệu IBM trên một máy chủ ứng dụng và cũng đưa ra một cái nhìn tổng quát toàn diện về việc làm thế nào để sử dụng đặc tính XSLT để tùy biến các thông điệp đến và đi của một dịch vụ Web minh họa cho vừa vào lược đồ XML tùy biến của bạn.

Hình 1. Áp dụng XSLT – Tùy chọn các định dạng phân tán
Áp dụng XSLT – Tùy chọn các định dạng phân tán

Các mục tiêu

Trong bài viết này bạn sẽ học:

  • Sử dụng đặc tính XSLT, mà giờ đây đặc tính này là một phần của các dịch vụ Web dữ liệu.
  • Tạo ra một lược đồ ngầm định cho một dịch vụ Web minh họa.
  • Ứng dụng các phép biến đổi kiểu Web để hiển thị đầu ra dưới các định dạng HTML, JSON và RSS.
  • Ứng dụng các lược đồ tùy biến của bạn cho các thông điệp SOAP.

Các điều kiện tiên quyết

Bài viết này viết cho các lập trình viên cơ sở dữ liệu, những người đã quen thuộc với IBM Data Studio và biết làm thế nào để thực hiện các thao tác thông thường như là tạo một kết nối cơ sở dữ liệu, một dự án phát triển dữ liệu và các tập lệnh SQL hoặc các thủ tục lưu trữ. Nếu bạn chưa quen thuộc với các thao tác này thì trước tiên bạn nên hoàn thành giáo trình "IBM Data Studio: Get started with Data Web Services" (developerWorks, 11 - 2007). Các kiến thức cơ sở về XSLT, XSD, và XPath được giới thiệu ở giáo trình này. Bởi vì tất cả các ví dụ trong tài liệu hướng dẫn này đều dựa trên WebSphere® Application Server Community Edition server như là môi trường đích, nên ở đây chúng ta giả sử rằng người đọc đã cài đặt Data Studio Developer 1.2 với WebSphere Application Server Community Edition server và đã thiết lập kết nối với cơ sở dữ liệu DB2 SAMPLE.

Các yêu cầu hệ thống

Để chạy các ví dụ trong tài liệu hướng dẫn này, bạn cần:


Tạo một dịch vụ Web đơn giản

Bài viết này sử dụng một ứng dụng Web đơn giản để minh họa các đặc tính XSLT. Phần này mô tả cách bạn tạo ra dịch vụ Web này bằng cách sử dụng IBM Data Studio Developer. Dịch vụ Web này dựa trên cơ sở dữ liệu DB2 SAMPLE. Bài viết "IBM Data Studio: Get started with Data Web Services" (developerWorks, 11 - 2007) chỉ cho bạn cách làm thế nào để có thể tạo ra một kết nối cơ sở dữ liệu và một khởi tạo WebSphere Application Server Community Edition server. Bài viết này giả sử rằng bạn đã có kết nối cơ sở dữ liệu DB2 SAMPLE và WebSphere Application Server Community Edition server đã được cài đặt.

Tạo một dự án phát triển dữ liệu

  1. Tạo một dự án phát triển dữ liệu bằng cách nhấn chuột phải vào khoảng trống trong Data Project Explorer và chọn New > Data Development Project.
    Hình 2. Tạo một dự án phát triển dữ liệu mới
    Tạo một dự án phát triển dữ liệu mới
  2. Đặt tên dự án ProjectXSLT, và nhấn Next.
    Hình 3. Các tùy chọn để tạo một dự án mới
    Các tùy chọn để tạo một dự án mới
  3. Sử dụng kết nối với cơ sở dữ liệu DB2 SAMPLE mà chúng ta đã thiết lập trước đây, rồi nhấn Finish.
    Hình 4. Các tùy chọn để tạo một dự án mới
    Các tùy chọn để tạo một dự án mới
  4. Dự án mới trong Data Project Explorer cần phải có dạng như sau:
    Hình 5. Dự án phát triển dữ liệu đã được tạo ra
    Dự án phát triển dữ liệu đã được tạo ra

Tạo ra một dịch vụ Web mới trong dự án

  1. Tạo ra một dịch vụ Web mới bằng cách nhấn chuột phải vào thư mục Web Services trong dự án phát triển dữ liệu của bạn và chọn New Web Service.
    Hình 6. Tạo một dịch vụ Web
    Tạo một dịch vụ Web
  2. Đặt tên cho dịch vụ Web MyWebServiceXSLT và để urn:example như là namespace (không gian tên) URI. Không gian tên URI được sử dụng trong WSDL để làm cho dịch vụ Web cũng như các lược đồ XML phù hợp với các thông điệp vào và ra của XML. Bằng cách tuân thủ các quy định về việc tạo URI, bạn có thể đưa vào bất cứ chuỗi kí tự nào. nhấn Finish.
    Hình 7. Các tùy chọn để tạo một dịch vụ Web
    Các tùy chọn để tạo một dịch vụ Web
  3. Đến bây giờ thì dự án phát triển dữ liệu của bạn cần phải có dạng như Hình 8. Sử dụng thủ thuật này, bạn đã tạo ra một “lớp vỏ” cho dịch vụ Web dữ liệu, và giờ đây thì dịch vụ Web dữ liệu này đã có thể được đưa vào sử dụng với các thao tác cơ sở dữ liệu.
    Hình 8. Dự án với dịch vụ Web mới đã được tạo ra
    Dự án với dịch vụ Web mới đã được tạo ra

Thêm các thao tác cơ sở dữ liệu vào dịch Web

  1. Bạn có thể thêm các thao tác cơ sở dữ liệu và lưu các thủ tục vào dịch vụ Web của bạn bằng cách nhấn chuột phải vào dịch vụ Web và chọn New Operation.
    Hình 9. Thêm các thao tác cơ sở dữ liệu vào dịch vụ Web
    Thêm các thao tác cơ sở dữ liệu vào dịch vụ Web
  2. Đặt tên cho thao tác getAllEmp và định nghĩa thao tác đó, như đã được chỉ ra trong Hình 10 rồi chọn Finish.
    Hình 10. Định nghĩa một thao tác mới
    Định nghĩa một thao tác mới
  3. Một cách khác là bạn có thể tạo ra một thao tác cơ sở dữ liệu bằng cách nhấn chuột phải vào thư mục SQL Scripts và chọn New > SQL or XQuery Script. Tạo ra một thao tác khác bằng cách sử dụng phương thức này.
    Hình 11. Một cách khác để định nghĩa thao tác cơ sở dữ liệu
    Một cách khác để định nghĩa thao tác cơ sở dữ liệu
  4. Đặt tên cho tập lệnh (script) getOneEmp, chọn các thiết lập khác như đã được chỉ ra trong Hình 12, rồi nhấn Finish.
    Hình 12. Định nghĩa một thao tác cơ sở dữ liệu khác
    Định nghĩa một thao tác cơ sở dữ liệu khác
  5. Sử dụng SQL editor để soạn thảo tệp đã được tạo ra như Hình 13:
    Hình 13. Soạn thảo tệp
    Soạn thảo tệp
  6. Kéo tập lệnh từ thư mục SQL Scripts thả vào thư mục dành cho dịch vụ Web mà bạn đã tạo ra. Bước này biến SQL tập lệnh thành thao tác trong dịch vụ Web.
    Hình 14. Kéo thả tập lệnh
    Kéo thả tập lệnh
  7. Định nghĩa dịch vụ Web đã hoàn thành. Bây giờ thì dịch vụ Web với 2 thao tác (getOneEmp và getAllEmp) cần có dạng như Hình 15:
    Hình 15. Ví dụ của dịch vụ Web đã được định nghĩa
    Ví dụ của dịch vụ Web đã được định nghĩa

Trong phần sau, bạn sẽ sinh ra lược đồ ngầm định cho thông điệp vào và ra.


Sinh ra một lược đồ ngầm định cho thông điệp vào và ra

Phần này hướng dẫn bạn cách lấy lược đồ ngầm định cho các thông điệp vào và ra. Khi bạn sử dụng Data Studio Developer để thêm một thao tác vào dịch vụ Web dữ liệu, thì một phép chiếu lược đồ XML ngầm định được sinh ra cho các thông điệp vào và ra của thao tác đó. Để sinh ra một XSLT tập lệnh, bạn phải biết được lược đồ của XML mà bạn bắt đầu với (hoặc là bạn muốn chiếu đến) bởi vì lược đồ này định nghĩa các định dạng thông điệp đến và đi XML ngầm định và có thể được sử dụng làm điểm bắt đầu để phát triển các XSL tập lệnh. Bạn có thể sử dụng công cụ dịch vụ Web dữ liệu để lấy lược đồ ngầm định cho một thao tác.

Lấy lược đồ ngầm định

  1. Sau khi bạn thêm một thao tác vào dịch vụ Web, nhấn chuột phải thao tác đó và chọn Manage XSLT.
    Hình 16. Quản lý tùy chọn XSLT
    Quản lý tùy chọn XSLT
  2. Nhấn Generate Default.
    Hình 17. Sinh lược đồ ngầm định
    Sinh lược đồ ngầm định
  3. Giữ tên tệp ngầm định hoặc thay đổi nó nếu bạn muốn, rồi nhấn Save.
    Hình 18. Lưu tệp
    Lưu tệp
  4. Nhấn Finish trong thủ thuật định dạng các phép biến đổi XSL (Configure XSL Transformations).
    Hình 19. Sinh ra tùy chọn lược đồ ngầm định
    Sinh ra tùy chọn lược đồ ngầm định
  5. Làm mới lại (refresh) thư mục ProjectXSLT và bây giờ bạn cần có tệp lược đồ ngầm định thêm vào trong thư mục XML Schema trong dự án của mình.
    Hình 20. Lược đồ ngầm định trong thư mục XML
    Lược đồ ngầm định trong thư mục
  6. Chúng ta cũng thực hiện thủ tục giống như trên để tạo ra lược đồ ngầm định cho getOneEmp. nhấn chuột phải thao tác đó, chọn Manage XSLT. nhấn Generate Default, rồi nhấn Save để lưu tệp.
    Hình 21. Sinh lược đồ cho thao tác getOneEmp
    Sinh lược đồ cho thao tác getOneEmp
  7. Nhấn Finish. Làm mới lại dự án và bạn sẽ thấy tệp lược đồ ngầm định cho thao tác getOneEmp trong thư mục XML Schema.
    Hình 22. Lược đồ ngầm định trong thư mục XML
    Lược đồ ngầm định trong thư mục XML

Tìm hiểu lược đồ ngầm định

Lược đồ ngầm định được sinh ra bao gồm hai định nghĩa phần tử. Định nghĩa phần tử cho thông điệp vào thì giống như thao tác (getOneEmp) và định nghĩa phần tử cho thông điệp ra thì tên được đặt dưới dạng tên của thao tác cộng thêm phần đuôi “Response” (getOneEmpResponse). Các tham số vào của truy vấn SQL được liệt kê ở thông điệp vào. Hình 1 thể hiện lược đồ đã được sinh ra cho thao tác getOneEmp:

Ví dụ 1. Lược đồ ngầm định đã được sinh ra
<?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>

Lược đồ này định nghĩa các định dạng thông điệp vào và ra XML ngầm định và bạn có thể sử dụng lược đồ này làm điểm bắt đầu để phát triển các XSL tập lệnh.

Ở đây có một điểm chúng ta cần lưu ý, đó là, lược đồ ngầm định trả lại các tên phần tử này dưới bất cứ dạng bí danh nào mà bạn muốn. Vì vậy, nếu bạn đã định nghĩa thao tác cơ sở dữ liệu như sau:

	select EMPNO as "empNumber" from EMPLOYEE

Thì khi đó tên phần tử EMPNO trong lược đồ nói trên (Ví dụ 1) sẽ có dạng:

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

Ở phần sau, chúng ta sẽ có một số ví dụ về XSL.


Chuyển từ XML sang HTML

Các hàm mở rộng Xalan (Xalan Extension) có sẵn trong dịch vụ Web dữ liệu

Dịch vụ Web dữ liệu sử dụng việc mở rộng bộ xử lý Xalan XSLT để kết hợp với hàm Java gốc. Các hàm Xalan sau hiện đang được hỗ trợ trong dịch vụ Web dữ liệu:

  • encodeJSON(): JSON-mã hóa một xâu kí tự
  • getHTTPRequestHeader(String header): Cho phép truy cập tới phần đầu (header) của yêu cầu HTTP hiện tại
  • getHTTPRequestURL(); Trả lại URL được sử dụng cho yêu cầu hiện tại.
  • setHTTPResponseHeader(String header, String value): Cho phép bạn thiết lập phần đầu của phản hồi HTTP

Các hàm này là các phương thức tĩnh được thực thi trong lớp com.ibm.datatools.dsws.rt.common.Util và vì vậy chúng có sẵn đối với bất cứ cài đặt dịch vụ Web dữ liệu nào. Các phương thức này có thể được tham chiếu hoặc gọi trực tiếp từ các XSL tập lệnh tùy biến của bạn. Hãy tham khảo Xalan Java Extension để có thêm thông tin về các hàm Xalan.

Ba phần tiếp theo giới thiệu các ví dụ về việc làm thế nào bạn có thể chuyển từ XML sang nhiều các định dạng khác, ví dụ như HTML, JSON, và RSS. Các ca sử dụng (use case) kiểu REST thì đơn giản và dễ hiểu hơn bởi vì chúng không chứa các lược đồ XML tùy chọn và việc biến đổi đổi chỉ áp dụng cho các thông điệp ra.

Dịch vụ Web dữ liệu sử dụng XSLT để biến đầu ra thành nhiều định dạng khác nhau. Phiên bản 1.0 của XSLT bị thiếu một số các hàm xử lý xâu kí tự cơ bản, do đó dịch vụ Web dữ liệu sử dụng việc mở rộng bộ xử lý Xalan XSLT để kết nối vào hàm Java gốc có khả năng biến đổi bất cứ xâu kí tự nào. Việc mở rộng ở đây bao gồm các phương thức tĩnh được thực thi trong lớp com.ibm.datatools.dsws.rt.common.Util, vì vậy nó có sẵn đối với bất cứ cài đặt dịch vụ Web dữ liệu nào. Để biết chi tiết hãy tham khảo ghi chú ở bên.

Làm quen với phép biến đổi từ XML sang HTML. Hãy hoàn thành các bước sau để chuyển từ đầu ra XML thành định dạng HTML:

  1. Bạn có thể sử dụng các công cụ XSL được cung cấp với Data Studio Developer để phát triển các tệp XSL của mình. nhấn chuột phải vào dự án và chọn New > XSL. . Nếu bạn không thấy tùy chọn XSL thì hãy chọn New > Other, rồi chọn XML > XSL.
    Hình 23. Tạo ra một tệp XSL tùy biến
    Tạo ra một tệp XSL tùy biến
  2. Bạn có thể sử dụng tên ngầm định hoặc một tên khác cho tệp. Ở ví dụ này sử dụng tên tệp là getAllEmpAsHTML.xsl. nhấn Finish.
    Hình 24. Đặt tên tệp XSL tùy biến
    Đặt tên tệp XSL tùy biến
  3. Mẫu (template) tệp XSL được tạo ra và hiển thị trong thư mục XSLT ở dự án của bạn.
    Hình 25. Mẫu tệp XSL tùy biến đã được tạo ra
    Mẫu tệp XSL tùy biến đã được tạo ra
  4. Bây giờ bạn thay đổi mẫu để tạo ra một tệp XSL tùy biến, tệp XSL này sẽ biến đổi đầu ra của thao tác (getAllEmp) thành định dạng HTML. Ví dụ dưới đây chỉ ra một cách để định dạng và hiển thị đầu ra dưới dạng bảng HTML.
    • Thuộc tính method="html" chỉ ra rằng bạn muốn sinh một tài liệu HTML.
    • Thuộc tính encoding="UTF-8" chỉ ra rằng các kí tự trong tài liệu phản hồi sẽ được mã hóa dưới dạng UTF-8.
    • media type định nghĩa kiểu MIME được sử dụng cho các thông điệp phản hồi HTTP.
    • Thuộc tính match với giá trị "/*" chỉ ra rằng nó sẽ được gọi ở phần tử gốc của tài liệu nguồn.
    • Phần tử xsl:if được sử dụng để kiểm tra xem có tồn tại ít nhất một hàng hay không. Nếu như không có hàng nào tồn tại thì bạn sẽ không lấy tên của các cột. Nếu có ít nhất một hàng tồn tại (điều kiện nói trên được thỏa mãn) thì lấy ra tất cả các phần tử ở hàng thứ nhất (thông qua một biểu thức Xpath). Lệnh xsl:for-each chỉ ra rằng phải lặp lại các lệnh bao hàm cho mỗi phần tử trong danh sách các nốt do biểu thức Xpath trả lại trong thuộc tính select. Trong trường hợp này, bạn chỉ chọn hàng [1], bởi vì bạn muốn có hàng đầu tiên, chứa tên của các cột.
    • Lệnh xsl:value-of viết một chuỗi kí tự vào đầu ra (output). Thuộc tính được chọn chứa một biểu thức Xpath. Trong trường hợp này thì đây là một hàm Xpath cho ta tên vùng của phần tử, đây là tên của phần đầu bảng.
    • Lệnh tiếp theo, xsl:for-each được sử dụng để lặp lại cho tất cả các dòng. Trong đó, bạn lại sử dụng xsl:for-each để lặp lại cho tất cả các cột.
    • Bạn sử dụng lệnh xsl:value-of để viết các giá trị ra tài liệu kết quả. Để lấy được giá trị đó, bạn dùng hàm XPath text() để lấy nốt văn bản của thẻ cột.
    Ví dụ 2. getAllEmpAsHTML.xsl – Tùy biến XSL để chuyển đổi đầu ra sang định dạng 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>
  5. Bây giờ bạn áp dụng tệp XSL này cho thao tác của mình. Để làm như vậy, hãy nhấn chuột phải vào thao tác và chọn Manage XSLT.
    Hình 26. Áp dụng tệp XSL cho thao tác
    Áp dụng tệp XSL cho thao tác
  6. Trong trường XSL tệp, ở phần Transformation của các thông điệp ra (output message), trỏ tới chỗ để tệp XSL tùy chọn mà bạn đã tạo ra, rồi nhấn Open.
    Hình 27. Duyệt tới chỗ để tệp XSLT
    Duyệt tới chỗ để tệp XSLT
  7. Bây giờ thì tệp XSL tùy chọn đã được áp dụng cho thông điệp ra. nhấn Finish trong thủ thuật Configure XSL Transformation.
    Hình 28. Áp dụng tệp XSLT cho thông điệp ra
    Áp dụng tệp XSLT cho thông điệp ra
  8. Xây dựng và triển khai dịch vụ Web bằng cách nhấn chuột phải vào nó và chọn Build and Deploy.
    Hình 29. Xây dựng và triển khai dịch vụ Web
    Xây dựng và triển khai dịch vụ Web
  9. Chọn WebSphere Application Server Community Edition V1.1 trong trường Type, chọn trường hợp WebSphere Application Server Community Edition server đã được tạo ra (bằng cách chọn New cạnh trường Server), và chọn JDBC trong trường Data handler. Các tùy chọn khác (gồm có Data Web Services test client, Launch test client after deployment và Launch Web Services Explorer after deployment) là không bắt buộc. Bạn có thể chọn các tùy chọn này để xem các xâu kí tự yêu cầu và phản hồi giống nhau. nhấn Finish.
    Hình 30. Xây dựng và triển khai các tùy chọn
    Xây dựng và triển khai các tùy chọn
  10. Mở một trình duyệt và dùng REST binding (kết dính REST) để truy cập thao tác.
    Hình 31. Các kết quả được trả lại ở định dạng bảng HTML
    Các kết quả được trả lại ở định dạng bảng HTML

Tại sao thao tác không xuất hiện trong trình duyệt dịch vụ Web (Web Services Explorer)?

Thao tác không xuất hiện trong trình duyệt dịch vụ Web là bởi vì cần thêm vào các bước để làm cho nó trở thành thao tác SOAP “thật sự”. Bạn cũng cần một tài liệu lược đồ tùy biến, tài liệu này mô tả định dạng thông điệp vào và/hoặc ra tùy biến thông qua một định nghĩa phần tử (bạn không thể tham chiếu các định nghĩa kiểu). Phần này được viết trong Assign a custom schema to expose an operation through the SOAP kết dính (Để cho trọn vẹn, phần này bao gồm các lược đồ tùy biến thêm vào cho thao tác getOneEmp. Bạn có thể thực hiện tương tự cho getAllEmp).

Chú ý rằng khi bạn nhìn vào trình duyệt dịch vụ Web, bạn không thấy thao tác getAllEmp liệt kê trong SOAP. Thao tác CHỈ có ở các tập HTTP POST/GET. Để biết thêm chi tiết hãy tham khảo ghi chú ở bên.

Hình 32. Thao tác getAllEmp không có ở SOAP kết dính (binding), mà chỉ có ở các kết dính HTTP GET/POST
Thao tác getAllEmp không có ở SOAP kết dính(binding), mà chỉ có ở các kết dính HTTP GET/POST

Chuyển từ XML sang JSON

Bây giờ hãy xem phép chuyển từ XML sang JSON. Hoàn thành các bước sau để chuyển XML đầu ra sang định dạng JSON:

  1. Sử dụng các tệp ví dụ sau để định dạng kết quả dưới dạng JSON. Như đã miêu tả trong phần trước, nhấn chuột phải vào dự án và chọn New > XSL.
    Hình 33. XSL mẫu cho phép biến đổi JSON
    XSL mẫu cho phép biến đổi JSON

    Có thể sửa đổi mẫu đã được sinh ra để thêm vào đoạn mã trình dưới đây. Phương thức encodeJSON() là hàm Java tĩnh để tạo ra một xâu kí tự JSON-safe.

    Ví dụ 3. getAllEmpAsJSON.xsl – Tùy biến XSL để chuyển đổi đầu ra sang định dạng JSON
    <?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>
  2. Bây giờ thì tệp XSL đã được thêm vào thư mục XSLT trong dự án của bạn.
    Hình 34. XSL đã được thêm vào thư mục XSLT
    XSL đã được thêm vào thư mục XSLT
  3. Áp dụng tệp XSL này vào thao tác getAllEmp bằng cách nhấn chuột phải vào thao tác và chọn Manage XSLT.
    Hình 35. Ứng dụng tệp XSL
    Ứng dụng tệp XSL
  4. Như ở phần trên, trỏ đến nơi bạn để tệp XSL bạn đã tạo ra để chuyển đổi đầu ra sang định dạng JSON, rồi nhấn Open.
    Hình 36. Chọn tệp
    Chọn tệp
  5. Nhấn Finish trong thủ thuật Configure XSL Transformations.
    Hình 37. Tùy biến tệp XSL đã được chọn
    Tùy biến tệp XSL đã được chọn
  6. Dùng các tùy chọn sau để xây dựng và triển khai dịch vụ Web, rồi nhấn Finish.
    Hình 38. Xây dựng và triển khai dịch vụ
    Xây dựng và triển khai dịch vụ
  7. Mở một trình duyệt và dùng kết dính REST để truy cập thao tác:
    Hình 39. Cho ra kết quả dưới định dạng JSON
    Cho ra kết quả dưới định dạng JSON

Chuyển từ XML sang RSS

Dịch vụ Web dữ liệu cũng có thể được sử dụng để tạo các RSS feed (nguồn tin) chung từ dữ liệu cơ sở dữ liệu (bao gồm các tài liệu XML). Ví dụ trong phần này minh họa cách thực hiện. Như đã nói đến ở trên, có một tập hợp mới các hàm Java tĩnh được hỗ trợ bởi các dịch vụ Web dữ liệu, tập hợp này có thể được trích dẫn trực tiếp từ các XSL tập lệnh. Các hàm này cho phép bạn lấy URL yêu cầu, giá trị phần đầu yêu cầu HTTP (HTTP request), và thiết lập giá trị phần đầu phản hồi HTTP (HTTP response). Các hàm này được sử dụng trong các XSL tập lệnh trong phần này.

Bảng 1. Các hàm JAVA tĩnh được hỗ trợ bởi các dịch vụ Web dữ liệu
Phương thứcMục đích
java:com.ibm.datatools.dsws.rt.common.Utils.getHTTPRequestHeader(String header)Trả về giá trị của phần đầu yêu cầu HTTP được chỉ định dưới dạng một xâu kí tự
java:com.ibm.datatools.dsws.rt.common.Utils.getHTTPRequestURL()Trả lại URL mà khách hàng đã sử dụng để yêu cầu
java:com.ibm.datatools.dsws.rt.common.Utils.setHTTPResponseHeader(String header, String value)Thiết lập phần đầu phản hồi với giá trị và tên đã cho

Đoạn dưới đây minh họa cách xây dựng một nguồn tin RSS 2.0 trên một bảng đơn chứa các tài liệu XML (đại diện cho các thực thể thực sự) và một số siêu dữ liệu (metadata) bổ sung. Tuy nhiên, nguồn tin đó cũng như các thực thể có thể là kết quả của các truy vấn SQL phức tạp hoặc là kết quả của việc gọi các thủ tục có sẵn. Để đơn giản thì trong ví dụ này chúng ta dùng một bảng đơn. Sau đây là câu lệnh tạo bảng:

Ví dụ 4. createTable.sql – Câu lệnh tạo bảng
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);

Bạn sẽ định nghĩa các thao tác sau để thực thi nguồn tin RSS. Các thao tác getFeed và getDocument được sử dụng để sinh ra các nguồn tin. Thao tác insertDocument được sử dụng để chèn các tài liệu kiểm tra vào cơ sở dữ liệu, nhưng với nguồn tin RSS thì thao tác này không được yêu cầu

Bảng 2. Các thao tác để thực thi một nguồn tin RSS
Thao tácCâu lệnh 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)

Trước tiên, chạy câu lệnh SQL createTable. Sau đó bạn có thể dùng câu lệnh insertDocument để chèn dữ liệu ví dụ vào cơ sở dữ liệu của mình.

Kéo các thao tác getFeedgetDocument và thả vào dịch vụ Web. Hình 40 là ví dụ minh họa việc dự án của bạn sẽ có dạng như thế nào sau khi định nghĩa các thao tác dịch vụ Web để thực thi nguồn tin RSS:

Hình 40. Dự án với các thao tác RSS
Dự án với các thao tác RSS

Hình 41 cho thấy dữ liệu ví dụ của bạn sẽ có dạng như thế nào:

Hình 41. Dữ liệu ví dụ của nguồn tin RSS
Dữ liệu ví dụ của RSS điểm tin

Bởi vì bạn biết rằng thao tác getDocument chỉ trả lại một hàng, nên để tối ưu hóa truy vấn bạn có thể sử dụng một đặc tính mới mà giờ đây đặc tính này là một phần của dịch vụ Web dữ liệu có tên gọi là “tìm nạp chỉ một dòng đơn cho các truy vấn” ("Fetch only single row for queries"). Để làm được điều này, nhấn chuột phải vào thao tác getDocument và chọn Edit.

Hình 42. Hiệu chỉnh thao tác cho tìm lấy dòng đơn
Hiệu chỉnh thao tác cho tìm lấy dòng đơn

Chọn Fetch only single row for queries, và nhấn Finish. Việc này loại trừ <row>thẻ từ kết quả.

Hình 43. Tùy chọn tìm lấy dòng đơn
Tùy chọn tìm lấy dòng đơn

Bây giờ thì định nghĩa hai tài liệu XSL: một cho đầu ra của thao tác getFeed (để tạo điểm tin) và tài liệu còn lại cho đầu ra của thao tác getDocument (chỉ để hiển thị tài liệu XML thuần túy).

Tài liệu XSL sau đây dựa trên đầu ra của thao tác getFeed và từ đó tạo ra định dạng XML nguồn tin RSS (RSS feed XML format) (phiên bản 2.0). Để trích dẫn tài liệu thực sự, hãy sử dụng ID của entry hiện tại như là định danh, đặt lệnh gọi đến URL cho thao tác getDocument. Việc này làm cho bộ đọc điểm tin gọi thao tác getDocument với ID đã cho khi người dùng chọn một điểm tin. Bạn phải tạo lên một xâu kí tự theo định dạng thời gian yêu cầu cho các điểm tin để có thể hiển thị được thời gian chỉnh sửa dưới định dạng đã được yêu cầu bởi nguồn tin RSS. Để làm việc này, hãy sử dụng các hàm EXSLT (các hàm này có sẵn trong Xalan XSL) để điều chỉnh ngày/thời gian.

Ví dụ 5. rssFeed.xsl – tệp XSL dành cho đầu ra của thao tác getFeed
<?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="/*">
       
       <!-- truy cập ngữ cảnh yêu cầu hiện tại để tìm URL yêu cầu -->

      <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>

Để kết quả trả lại là tài liệu XML đơn, không chứa thêm các wrapper tag, gán tài liệu XSL sau đây cho thao tác đầu ra getDocument.

Ví dụ 6. rssDocument.xsl – tệp XSL dành cho đầu ra của thao tác getDocument
<?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>

Áp dụng các tệp XSL này cho các thao tác getFeed và getDocument. Để làm như vậy, hãy nhấn chuột phải vào các thao tác đó và chọn Manage XSLT. Tìm tới tệp XSL và nhấn Finish.

Hình 44. Duyệt tệp XSL để áp dụng cho thao tác getFeed
Duyệt tệp XSL để áp dụng cho thao tác getFeed
Hình 45. Duyệt tệp XSL để áp dụng cho thao tác getDocument
Duyệt tệp XSL để áp dụng cho thao tác getDocument

Xây dựng và triển khai dịch vụ Web. Để sử dụng điểm tin đó, bạn có thể dùng URL chạy thao tác getFeed. Ví dụ: http://localhost:8080/ProjectXSLTMyWebServiceXSLT/rest/MyWebServiceXSLT/getFeed.

Bạn có thể sử dụng bất cứ bộ đọc điểm tin nào, ví dụ như Sage for Firefox, RSS Reader, Google Reader,.v.v. Trong ví dụ này chúng ta dùng Sage for Firefox.

Định nghĩa một đánh-dấu(bookmark) mới bằng cách nhấn chuột phải trong cửa sổ Sage và chọn New Bookmark. Thêm các thuộc tính sau đây vào đánh-dấu. Đánh-dấu sẽ có dạng như sau:

Hình 46. Các thuộc tính cho đánh-dấu
Các thuộc tính cho đánh-dấu

Bây giờ thì dữ liệu XML đã được chèn vào cơ sở dữ liệu có thể được truy cập bởi nhiều điểm tin.

Hình 47. Giờ đây dữ liệu XML được truy cập bởi các điểm tin
Giờ đây dữ liệu XML được truy cập bởi các điểm tin

Gán một lược đồ tùy biến để thể hiện thao tác (operation) thông qua tập SOAP

Tiếp theo học cách chiếu các lược đồ tùy biến lên lược đồ ngầm định được sinh ra bởi dịch vụ Web dữ liệu và ngược lại.

Các thao tác được gán các XSL tập lệnh, trả lại kết quả XML được đánh giá như là các thao tác dịch vụ Web SOAP. Nhưng bạn cũng cần tài liệu lược đồ tùy biến, tài liệu này mô tả định dạng thông điệp vào và ra tùy biến thông qua một định nghĩa phần tử (dịch vụ Web dữ liệu không thể tham chiếu các định nghĩa kiểu). Tên thông điệp đủ tiêu chuẩn của các thông điệp yêu cầu cũng phải là duy nhất đối với dịch vụ Web. Phần này mô tả các bước mà bạn cần phải thực hiện thêm để tạo ra một thao tác SOAP thực sự.

Tình huống ví dụ phòng nhân sự

Trong ví dụ này, phòng nhân sự (HR) trong một công ty sử dụng các lược đồ tùy biến riêng của họ để theo dõi các thông tin chi tiết của nhân viên. Lược đồ tùy biến đầu vào này được chuyển thể sang lược đồ ngầm định và được coi như là đầu vào để đưa vào dịch vụ Web. Dữ liệu đầu ra (output) được đưa ra trong lược đồ ngầm định, sau đó được chuyển thể trở lại lược đồ tùy biến đầu ra, như trong Hình 48:

Hình 48. Tình huống nhân sự
Tình huống nhân sự

Tạo lược đồ tùy biến ví dụ để áp dụng cho các thông điệp vào và ra. nhấn chuột phải vào dự án và chọn New > XML Schema.

Hình 49. Tạo một lược đồ tùy biến
Tạo một lược đồ tùy biến
Ví dụ 7. NewXMLSchemaInput.xsd – Tùy biến XSD cho các thông điệp vào
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/HREmpGetInfo" elementFormDefault="qualified">
     <element name="HREmpGetInfo">
    	<complexType>
      	    <sequence>
        	<element name="EMPSerial" type="xsd:string" nillable="true"/>
      	    </sequence>
    	</complexType>
     </element>
</schema>
Ví dụ 8. NewXMLSchemaOutput.xsd – Tùy biến XSD cho các thông điệp ra
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/getHREmpDetails" elementFormDefault="qualified">
   <element name="getHREmpDetails">
     <complexType>
       <sequence>
          <element name="HREmpPersonalDetails">
             <complexType>
            	<sequence>
              	    <element name="EMP_FIRSTNAME" type="xsd:string"/>
              	    <element name="EMP_MIDINIT" type="xsd:string" nillable="true"/>
              	    <element name="EMP_LastNAME" type="xsd:string"/>
              	    <element name="EMP_SEX" type="xsd:string" nillable="true"/>
              	    <element name="EMP_BDATE" type="xsd:date" nillable="true"/>
            	</sequence>
             </complexType>
          </element>
          <element name="HREmpSalaryDetails">
             <complexType>
          	<sequence>
          	    <element name="EMP_SERIAL" type="xsd:string"/>
          	    <element name="EMP_YEARLY_COMP" type="xsd:decimal" nillable="true"/>
              	    <element name="EMP_MIDYEAR_BONUS" type="xsd:decimal" nillable="true"/>
              	    <element name="EMP_YEAREND_BONUS" type="xsd:decimal" nillable="true"/>
              	</sequence>
             </complexType>
          </element>
          <element name="HREmpWorkDetails">
             <complexType>
          	<sequence>
              	    <element name="EMP_DEPT" type="xsd:string" nillable="true"/>
              	    <element name="EMP_WORKNO" type="xsd:string" nillable="true"/>
              	    <element name="EMP_HIREDATE" type="xsd:date" nillable="true"/>
              	    <element name="EMP_JOBDESC" type="xsd:string" nillable="true"/>
              	    <element name="EMP_EDLEVEL" type="xsd:short"/>
              	</sequence>
             </complexType>
          </element>
       </sequence>
     </complexType>
   </element>
</schema>

Thêm lược đồ tùy biến này vào dịch vụ Web

  1. Để tạo ra tài liệu WSDL đúng, bạn phải cung cấp một hoặc nhiều các lược đồ chứa các định nghĩa phần tử (tùy biến) cần thiết cho các thông điệp vào và ra. Để thêm một lược đồ tùy biến, nhấn chuột phải dịch vụ Web và chọn Manage Custom Schemas.
    Hình 50. Quản lý lược đồ tùy biến
    Quản lý lược đồ tùy biến
  2. Cửa sổ “Add or Remove Custom XML Schemas” mở ra và bạn có thể quản lý tất cả các lược đồ tùy biến cho dịch vụ Web. Nút Add mở ra một cửa sổ khác, do đó bạn có thể chọn không gian tên đích từ tệp lược đồ tùy biến để thêm vào thao tác. Nhấn Add.
    Hình 51. Quản lý hộp thoại lược đồ tùy biến
    Quản lý hộp thoại lược đồ tùy biến
  3. Trỏ đến các lược đồ tùy biến đầu vào và đầu ra mà chúng ta đã tạo ra ở Ví dụ 7Ví dụ 8, rồi nhấn Open.
    Hình 52. Chọn tệp lược đồ ngầm định
    Chọn tệp lược đồ ngầm định
  4. Sau khi thêm các lược đồ tùy biến, bạn có thể thấy không gian tên đích của tất cả các lược đồ đó. Bạn có thể thêm vào dịch vụ Web nhiều hơn một lược đồ, nhưng không gian tên đính của tất cả các lược đồ đó phải là duy nhất. Bạn có thể thêm lược đồ có trùng không gian tên đích với dịch vụ Web. Trong trường hợp đó, lược đồ tùy biến sẽ được hợp nhất với lược đồ ngầm định. Trong ví dụ này, bạn sử dụng 2 lược đồ, một cho đầu vào và lược đồ còn lại cho đầu ra. nhấn Finish.
    Hình 53. Thêm không gian tên đích
    Thêm không gian tên đích
  5. Các lược đồ được thêm vào thư mục XML Schema trong dự án.
    Hình 54. Các lược đồ được thêm vào dự án
    Các lược đồ được thêm vào dự án

Tạo một phép chiếu XML giữa các lược đồ tùy biến và các lược đồ ngầm định

  1. Bây giờ bạn phải tạo ra một phép chiếu XML giữa các lược đồ tùy biến và lược đồ ngầm định được dịch vụ Web chấp nhận. Data Studio Developer 1.2 có khả năng chiếu XML. Để tạo ra phép chiếu, hãy nhấn chuột phải vào dự án và chọn New > XML Mapping
    Hình 55. Khả năng chiếu XML trong Data Studio
    Khả năng chiếu XML trong Data Studio
  2. Chọn dự án và đặt tên phép chiếu NewMAPInput.map do đó bạn có thể phân biệt được phép chiếu đó với phép chiếu dữ liệu đầu ra(input). Nhấn Next.
    Hình 56. tệp phép chiếu đầu vào
    tệp phép chiếu đầu vào
  3. Tiếp theo, định nghĩa phép chiếu giữa XSD tùy biến và tệp XSD ngầm định đã được tạo ra ở trên. Nhấn Add bên cạnh trường “Root inputs”.
    Hình 57. Định nghĩa phép chiếu
    Định nghĩa phép chiếu
  4. Trỏ tới XSD tùy biến đầu vào sẽ được dùng làm đầu vào cho XSD ngầm định.
    Hình 58. Duyệt tới XSD tùy biến
    Duyệt tới XSD tùy biến
  5. Chọn tệp XSD tùy biến đầu vào, rồi nhấn OK.
    Hình 59. Chọn XSD tùy biến đầu vào
    Chọn XSD tùy biến đầu vào
  6. Chọn phần tử đầu vào từ danh sách Global elements and types và nhấn OK.
    Hình 60. Chọn phần tử đầu vào
    Chọn phần tử đầu vào
  7. Nhấn Add Cạnh trường “Root outputs”:
    Hình 61. Định nghĩa phép chiếu
    Định nghĩa phép chiếu
  8. Trỏ tới tệp XSD ngầm định đã được tạo ra ở trên, và nhấn OK.
    Hình 62. Định nghĩa phép chiếu 2
    Định nghĩa phép chiếu 2
  9. XSD ngầm định có 2 phần tử: một cho đầu vào và phần tử còn lại cho đầu ra. Chọn getOneEmp để tạo một phép chiếu cho các thông điệp vào và nhấn OK.
    Hình 63. Chọn phần tử đầu ra
    Chọn phần tử đầu ra
  10. Phép chiếu đầu vào có dạng tương tự như trong Hình 64. nhấn Finish.
    Hình 64. Phép chiếu đầu vào
    Phép chiếu đầu vào
  11. Tiếp theo, tạo phép chiếu thực sự giữa XSD tùy biến và XSD ngầm định. Phép chiếu được tạo ra bằng cách kéo chuột từ bảng bên trái sang bảng bên phải, như trong Hình 65. Để lưu tệp, hãy nhấn Ctrl+S, rồi click Generate XSLT script. Đưa tới Window > Show View > Navigator từ thực đơn chính, khi đó bạn có thể nhìn thấy tệp NewMAPInput.xsl đã được tạo ra.
    Hình 65. Tạo phép chiếu và sinh XSLT tập lệnh
    Tạo phép chiếu và sinh XSLT tập lệnh
  12. Ví dụ dưới đây thể hiện tệp XSL (NewMAPInput.xsl) đã được tạo ra. Hãy dành một chút thời gian để so sánh XSD tùy biến được minh họa ở Ví dụ 7 và tệp này. Bạn có thể thấy rằng empno được gán cho EMPSerial.
    Ví dụ 9. tệp XSL được sinh ra một cách tự động từ phép chiếu giữa XSD tùy biến và XSD ngầm định
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- @generated mapFile="NewMAPInput.map" md5sum="4160833ed98de6b7402c778daaad9541" 
    version="1.0.120" -->
    <!--
    *****************************************************************************
    *   tệp này đã được sinh ra bởi IBM XML Mapping Editor V1.0.120
    *
    *   Mapping file:		NewMAPInput.map
    *   (Các) định nghĩa chiếu:	NewMAPInput
    *   (Các) input file:		NewXMLSchemaInput.xsd
    *   (Các) output file(s):		
    *   DataServerWebServices/MyWebServiceXSLT/MyWebServiceXSLT.getOneEmp.default.xsd
    *
    *   Ghi chú: Không sửa nội dung của tệp này bởi vì nó sẽ bị ghi đè
    *            mỗi khi cập nhật mô hình chiếu (mapping model)
    *****************************************************************************
    -->
    <xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xalan="http://xml.apache.org/xslt"
        xmlns:in="http://www.example.org/HREmpGetInfo"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:out="urn:example"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="in xalan"
        version="1.0">
      <xsl:output method="xml" encoding="UTF-8" indent="yes" xalan:indent-amount="2"/>
      <xsl:strip-space elements="*"/>
    
      <!-- root template  -->
      <xsl:template match="/">
        <xsl:apply-templates select="in:HREmpGetInfo" mode="NewMAPInput"/>
      </xsl:template>
    
    <!--Luật này biểu diễn phép chiếu phần tử: từ 
    "in:HREmpGetInfo" sang "out:getOneEmp".-->
      <xsl:template match="in:HREmpGetInfo"  mode="NewMAPInput">
        <out:getOneEmp>
          <!-- một phép chiếu dữ liệu đơn giản: từ 
          "in:EMPSerial"(String) sang "empno"(String) -->
          <empno> <xsl:value-of select="in:EMPSerial"/> </empno>
        </out:getOneEmp>
      </xsl:template>
    
     <!-- *****************    Utility Templates    ******************  -->
      <!-- copy các khai báo không gian tên từ nguồn sang đích -->
      <xsl:template name="copyNamespaceDeclarations">
        <xsl:param name="root"/>
        <xsl:for-each select="$root/namespace::*">
          <xsl:copy/>
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
  13. Tiếp theo, tạo phép chiếu đầu ra. Để làm điều đó, nhấn chuột phải vào dự án và chọn New > XML Mapping.
    Hình 66. Tạo phép chiếu đầu ra
    Tạo phép chiếu đầu ra
  14. Đặt tên cho phép chiếu NewMAPOutput.map, rồi nhấn Next.
    Hình 67. Đặt tên cho phép chiếu đầu ra
    Đặt tên cho phép chiếu đầu ra
  15. Như ở trên, nhấn Add, rồi trỏ tới XSD ngầm định, bởi vì bạn đang chiếu thông điệp ra của dịch vụ Web sang lược đồ tùy biến của mình, rồi nhấn OK.
    Hình 68. Chọn XSD ngầm định
    Chọn XSD ngầm định
  16. Chọn getOneEmpResponse, bởi vì bạn đang tạo phép chiếu cho các thông điệp ra. nhấn OK.
    Hình 69. Chọn phần tử đầu ra
    Chọn phần tử đầu ra
  17. Lại nhấn Add , và trỏ tới XSD tùy biến, bạn có thể chuyển dạng thông điệp ra ngầm định thành thông điệp ra tùy biến của mình. nhấn OK.
    Hình 70. Chọn tệp XSD tùy biến
    Chọn tệp XSD tùy biến
  18. Chọn getHREmpDetails làm phần tử, rồi nhấn OK.
    Hình 71. Chọn phần tử
    Chọn phần tử
  19. Phép chiếu đầu ra có dạng tương tự như Hình 72. nhấn Finish.
    Hình 72. Phép chiếu đầu ra đã được tạo ra
    Phép chiếu đầu ra đã được tạo ra
  20. Mở rộng phần tử và tạo ra một phép chiếu giữa XSD ngầm định và XSD tùy biến bằng cách kéo con trỏ của bạn từ các phần tử trong bảng ở bên trái sang các phần tử trong bảng ở bên phải. Lưu tệp bằng cách nhấn Ctrl+S, rồi nhấn biểu tượng thanh công cụ Generate XSLT script. Bây giờ thì bạn có thể nhìn thấy tệp NewMAPOutput.xsl đã được tạo ra trong Navigator view.
    Hình 73. Phép chiếu đầu ra
    Phép chiếu đầu ra
    Hình 74. Tệp XSL đã được tạo ra
    tệp XSL đã được tạo ra
  21. Đây là tệp XSL (NewMAPOutput.xsl) đã được tạo ra. Hãy dành một chút thời gian để so sánh XSD tùy biến trong Ví dụ 8 và tệp này.
    Ví dụ 10. tệp XSL được tạo ra một cách tự động từ phép chiếu giữa XSD tùy biến và XSD ngầm định
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- @generated mapFile="NewMAPOutput.map" md5sum="6d0669dbb4a79476379126c435e48f52" 
    version="1.0.120" -->
    <!--
    *****************************************************************************
    *   tệp này đã được tạo ra bởi IBM XML Mapping Editor V1.0.120
    *
    *   Mapping file:		NewMAPOutput.map
    *   (Các) định nghĩa chiếu:	NewMAPOutput
    *   (Các) input file:		
    *   DataServerWebServices/MyWebServiceXSLT/MyWebServiceXSLT.getOneEmp.default.xsd
    *   (Các) output file:		NewXMLSchemaOutput.xsd
    *
    *   Ghi chú: Không sửa nội dung của tệp này bởi vì nó sẽ bị ghi đè
    *            mỗi khi cập nhật mô hình chiếu (mapping model)
    *****************************************************************************
    -->
    <xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xalan="http://xml.apache.org/xslt"
        xmlns:in="urn:example"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:out="http://www.example.org/getHREmpDetails"
        exclude-result-prefixes="in xalan"
        version="1.0">
      <xsl:output method="xml" encoding="UTF-8" indent="yes" xalan:indent-amount="2"/>
      <xsl:strip-space elements="*"/>
    
      <!-- root template  -->
      <xsl:template match="/">
        <xsl:apply-templates select="in:getOneEmpResponse" mode="NewMAPOutput"/>
      </xsl:template>
    
      <!-- Luật này biểu diễn phép chiếu phần tử: 
           từ "in:getOneEmpResponse" sang "out:getHREmpDetails".  -->
      <xsl:template match="in:getOneEmpResponse"  mode="NewMAPOutput">
        <out:getHREmpDetails>
          <out:HREmpPersonalDetails>
            <!-- một phép chiếu dữ liệu đơn giản: 
             từ "row/FIRSTNME"(String) sang "out:EMP_FIRSTNAME"(String) -->
            <out:EMP_FIRSTNAME>
              <xsl:value-of select="row/FIRSTNME"/>
            </out:EMP_FIRSTNAME>
            <!-- một phép chiếu dữ liệu đơn giản: 
             từ "row/MIDINIT"(String) sang "out:EMP_MIDINIT"(String) -->
            <out:EMP_MIDINIT>
              <xsl:value-of select="row/MIDINIT"/>
            </out:EMP_MIDINIT>
            <!-- một phép chiếu dữ liệu đơn giản:  
             từ "row/LASTNAME"(String) sang "out:EMP_LastNAME"(String) -->
            <out:EMP_LastNAME>
              <xsl:value-of select="row/LASTNAME"/>
            </out:EMP_LastNAME>
            <!-- một phép chiếu dữ liệu đơn giản: 
             từ "row/SEX"(String) sang "out:EMP_SEX"(String) -->
            <out:EMP_SEX>
              <xsl:value-of select="row/SEX"/>
            </out:EMP_SEX>
            <!-- một phép chiếu dữ liệu đơn giản:  
             từ "row/BIRTHDATE"(Date) sang "out:EMP_BDATE"(Date) -->
            <out:EMP_BDATE>
              <xsl:value-of select="row/BIRTHDATE"/>
            </out:EMP_BDATE>
          </out:HREmpPersonalDetails>
          <out:HREmpSalaryDetails>
          <!-- một phép chiếu dữ liệu đơn giản:  
             từ "row/EMPNO"(String) sang "out:EMP_SERIAL"(String) -->
            <out:EMP_SERIAL>
              <xsl:value-of select="row/EMPNO"/>
            </out:EMP_SERIAL>
            <!-- một phép chiếu dữ liệu đơn giản:  
             từ "row/SALARY"(Decimal) sang "out:EMP_YEARLY_COMP"(Decimal) -->
            <out:EMP_YEARLY_COMP>
              <xsl:value-of select="row/SALARY"/>
            </out:EMP_YEARLY_COMP>
            <!-- một phép chiếu dữ liệu đơn giản: 
             từ "row/BONUS"(Decimal) sang "out:EMP_MIDYEAR_BONUS"(Decimal) -->
            <out:EMP_MIDYEAR_BONUS>
              <xsl:value-of select="row/BONUS"/>
            </out:EMP_MIDYEAR_BONUS>
            <!-- một phép chiếu dữ liệu đơn giản: 
             từ "row/COMM"(Decimal) sang "out:EMP_YEAREND_BONUS"(Decimal) -->
            <out:EMP_YEAREND_BONUS>
              <xsl:value-of select="row/COMM"/>
            </out:EMP_YEAREND_BONUS>
          </out:HREmpSalaryDetails>
          <out:HREmpWorkDetails>
          <!-- một phép chiếu dữ liệu đơn giản: 
             từ "row/WORKDEPT"(String) sang "out:EMP_DEPT"(String) -->
            <out:EMP_DEPT>
              <xsl:value-of select="row/WORKDEPT"/>
            </out:EMP_DEPT>
            <!-- một phép chiếu dữ liệu đơn giản: 
             từ "row/PHONENO"(String) sang "out:EMP_WORKNO"(String) -->
            <out:EMP_WORKNO>
              <xsl:value-of select="row/PHONENO"/>
            </out:EMP_WORKNO>
            <!-- một phép chiếu dữ liệu đơn giản: 
             từ "row/HIREDATE"(Date) sang "out:EMP_HIREDATE"(Date) -->
            <out:EMP_HIREDATE>
              <xsl:value-of select="row/HIREDATE"/>
            </out:EMP_HIREDATE>
            <!-- một phép chiếu dữ liệu đơn giản:  
             từ "row/JOB"(String) sang "out:EMP_JOBDESC"(String) -->
            <out:EMP_JOBDESC>
              <xsl:value-of select="row/JOB"/>
            </out:EMP_JOBDESC>
            <!-- một phép chiếu dữ liệu đơn giản: 
             từ "row/EDLEVEL"(Short) sang "out:EMP_EDLEVEL"(Short) -->
            <out:EMP_EDLEVEL>
              <xsl:value-of select="row/EDLEVEL"/>
            </out:EMP_EDLEVEL>
          </out:HREmpWorkDetails>
        </out:getHREmpDetails>
      </xsl:template>
    
      <!-- *****************    Utility Templates    ******************  -->
      <!-- copy khai báo không gian tên từ nguồn sang đích -->
      <xsl:template name="copyNamespaceDeclarations">
        <xsl:param name="root"/>
        <xsl:for-each select="$root/namespace::*">
          <xsl:copy/>
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>

Gán XSLT cho các thông điệp vào và ra của các thao tác của bạn

  1. Bây giờ bạn phải trở lại với thao tác của mình và gán một phần tử thông điệp biểu diễn thông điệp vào hoặc ra tùy biến. Để làm điều này, nhấn chuột phải vào thao tác và chọn Manage XSLT. Nếu bạn đã gán một XSLT cho thông điệp vào hoặc ra, bạn có thể kích hoạt tập đó thành một phần tử thông điệp lược đồ bằng cách chọn hộp chọn (check box) Custom XML schema. Giờ thì bạn có thể chọn định nghĩa phần tử trong root element: list (danh sách các phần tử gốc). Danh sách này thể hiện tất cả các định nghĩa phần tử từ tất cả các lược đồ đã được thêm vào:
    Hình 75. Lược đồ XML tùy biến được áp dụng cho các thông điệp vào và ra
    Hình 75. Lược đồ XML tùy biến được áp dụng cho các thông điệp vào và ra
    Hình 76. Chọn phần tử đầu vào qua phần tử gốc
    Chọn phần tử đầu vào qua phần tử gốc
    Hình 77. Chọn phần tử đầu ra qua phần tử gốc
    Chọn phần tử đầu ra qua phần tử gốc
  2. Nhấn Finish.

Xây dựng và triển khai dịch vụ Web

  1. Xây dựng và triển khai dịch vụ Web bằng cách nhấn chuột phải vào dịch vụ Web và chọn Build and Deploy. Chọn các tùy chọn phù hợp như trong Hình 78, rồi nhấn Finish.
    Hình 78. Xây dựng và triển khai dịch vụ
    Xây dựng và triển khai dịch vụ
    Hình 79. Xây dựng và triển khai các tùy chọn
    Xây dựng và triển khai các tùy chọn
  2. Đưa tới cửa sổ trình duyệt dịch vụ Web và kiểm tra tập SOAP. Các XSD thẻ mà chúng ta đã định nghĩa trong Ví dụ 7 (HREmpGetInfo và EMPSerial) được đánh dấu trong Hình 80. Ví dụ, nhập giá trị 000010 vào trường EmpSerial, rồi nhấn Go.
    Hình 80. Các thẻ tùy biến đã được định nghĩa
    Các thẻ tùy biến đã được định nghĩa
  3. Phản hồi của dịch vụ Web có định dạng tùy biến như đã được định nghĩa trong Ví dụ 8.
    Hình 81. Các kết quả trả về của dịch vụ Web
    Các kết quả trả về của dịch vụ Web

    Đây là yêu cầu SOAP được gửi tới dịch vụ:

    Ví dụ 11. Tài liệu yêu cầu
    <?xml version="1.0" encoding="UTF-8" ?> 
     - <soapenv:Envelope xmlns:q0="http://www.example.org/HREmpGetInfo" 
       xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     - <soapenv:Body>
     - <q0:HREmpGetInfo>
       <q0:EMPSerial>000010</q0:EMPSerial>
       </q0:HREmpGetInfo>
       </soapenv:Body>
       </soapenv:Envelope>

    Đây là phản hồi SOAP từ máy chủ:

    Ví dụ 12. Tài liệu phản hồi
    - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    - <soapenv:Body>
    - <out:getHREmpDetails xmlns:out="http://www.example.org/getHREmpDetails" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    - <out:HREmpPersonalDetails>
      <out:EMP_FIRSTNAME>CHRISTINE</out:EMP_FIRSTNAME> 
      <out:EMP_MIDINIT>I</out:EMP_MIDINIT> 
      <out:EMP_LastNAME>HAAS</out:EMP_LastNAME> 
      <out:EMP_SEX>F</out:EMP_SEX> 
      <out:EMP_BDATE>1963-08-24Z</out:EMP_BDATE> 
      </out:HREmpPersonalDetails>
    - <out:HREmpSalaryDetails>
      <out:EMP_SERIAL>000010</out:EMP_SERIAL> 
      <out:EMP_YEARLY_COMP>152750.00</out:EMP_YEARLY_COMP> 
      <out:EMP_MIDYEAR_BONUS>2250.00</out:EMP_MIDYEAR_BONUS> 
      <out:EMP_YEAREND_BONUS>4220.00</out:EMP_YEAREND_BONUS>
      </out:HREmpSalaryDetails>
    - <out:HREmpWorkDetails>
      <out:EMP_DEPT>A00</out:EMP_DEPT> 
      <out:EMP_WORKNO>3978</out:EMP_WORKNO> 
      <out:EMP_HIREDATE>1995-01-01Z</out:EMP_HIREDATE>
      <out:EMP_JOBDESC>PRES</out:EMP_JOBDESC> 
      <out:EMP_EDLEVEL>18</out:EMP_EDLEVEL> 
      </out:HREmpWorkDetails>
      </out:getHREmpDetails>
      </soapenv:Body>
      </soapenv:Envelope>
    Hình 82. Khung nhìn (view) lấy từ một trình duyệt sử dụng kết dính REST
    Khung nhìn(view) lấy từ một trình duyệt sử dụng kết dính REST

Kết luận

Bài viết này đã mô tả cách bạn có thể đặc tính XSLT trong dịch vụ Web dữ liệu. Hãy xem thêm phần Tài nguyên để có thêm thông tin về nhiều các chủ đề khác, các thông tin đó có thể sẽ giúp bạn hiểu hơn bài viết này.

Lời cảm ơn

Các tác giả của bài viết này muốn cảm ơn tất cả các đồng nghiệp đã kiên nhẫn duyệt lại và làm thử tất cả các bước được viết ở đây.


Tải về

Mô tảTênKích thước
Data Studio project với các tệp (file) ví dụ XSLT1XSLTProjectSample.zip190KB

Ghi chú

  1. Đây là dự án minh họa Data Studio với tất cả các tệp(file) lược đồ và XSLT đã được sử dụng trong các ví dụ của bài viết này.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

  • Tải xuống IBM Data Studio để thử làm các bài tập trong bài viết này.
  • Tải xuống IBM product evaluation versions và thao tác trực tiếp trên các công cụ phát triển ứng dụng và các sản phẩm phần mềm trung gian từ DB2®, Lotus®, Rational®, Tivoli®, và WebSphere.

Thảo luận

Tải về thêm

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Information Management, SOA và dịch vụ Web
ArticleID=385521
ArticleTitle=Sử dụng XSLT trong IBM Data Studio Developer để chuyển đổi các thông điệp dịch vụ Web dữ liệu (Data Web Services)
publish-date=05202009