Triển khai các tiêu chuẩn Web Ngữ nghĩa trong trang web của bạn

Khám phá xem những tiêu chuẩn Web Ngữ nghĩa có thể làm gì cho dự án trang web hiện tại hoặc tiếp theo của bạn

Với thông báo gần đây của Yahoo rằng họ sẽ thực hiện hỗ trợ các tiêu chuẩn Web Ngữ nghĩa (Semantic Web) trong công cụ tìm kiếm của mình, nên những lợi ích mà Web Ngữ nghĩa mang lại cho trang web của bạn trở nên rõ ràng hơn bao giờ hết. Ngoài những lợi ích hiện có như nội dung có cấu trúc của bạn đem lại cho bạn một API mở, miễn phí, bây giờ bạn có được cơ hội tăng thứ hạng tìm kiếm và quan trọng hơn, kết quả tìm kiếm tăng thêm do công cụ tìm kiếm có thể hiểu tốt hơn những gì mà nội dung của trang web của bạn đề cập đến. Trong hướng dẫn này, bạn sẽ học cách triển khai một trang web mạng xã hội đơn giản khi sử dụng PHP và MySQL để triển khai các tiêu chuẩn Web Ngữ nghĩa, ví dụ như hCard và FOAF (Bạn của một người bạn) như là một phần của một lược đồ URI (Uniform Resource Identifier - Mã định danh Tài nguyên thống nhất) ngữ nghĩa.

Rob Crowther, Nhà phát triển Web, 自由职业者

Rob Crowther là một nhà phát triển Web từ London và hiện đang là điều phối viên của diễn đàn Khám phá các công nghệ Web Ngữ nghĩa trên developerWorks. Ông có sự quan tâm mãnh liệt về các tiêu chuẩn web và thỉnh thoảng viết blog tại http://www.boogdesign.com/b2evo/.



03 08 2012

Trước khi bạn bắt đầu

Qua hướng dẫn này, bạn sẽ tìm hiểu các chi tiết thực hành về cách triển khai thực hiện một lược đồ URI ngữ nghĩa, cấu trúc thiết kế lôgic của các trang trong trang web của bạn và cách áp dụng các vi định dạng (microformat) và RDFa vào việc đánh dấu để bổ sung giá trị ngữ nghĩa cho các trang web của bạn. Hướng dẫn này sẽ tập trung vào một số khía cạnh nhất định của cấu hình Apache và cách HTML được hiển thị, chứ không phải chính PHP và MySQL, do đó, ngay cả khi bạn chỉ có một sự hiểu biết không nhiều về hai công nghệ này, bạn vẫn có thể cùng làm theo được.

Về hướng dẫn này

Hướng dẫn này giúp cho bạn biết cách sử dụng các công nghệ Web Ngữ nghĩa trong bối cảnh của một trang web mạng xã hội rất đơn giản, SemanticBook (xem Các điều kiện tiên quyết để truy cập vào trang web này). SemanticBook biểu diễn các bạn bè của bạn bằng một URI mà bạn có thể sử dụng trên bất kỳ trang web khác nào, cho phép mạng lưới bạn bè của bạn được nhúng vào trong một mạng rộng lớn hơn qua nhiều trang web. Giả dụ FOAF (Bạn của một người bạn) được sử dụng, dữ liệu của người dùng trở nên di động và có thể dễ dàng được trích ra để sử dụng trong các ứng dụng khác. Ví dụ, SemanticBook cho phép bạn dễ dàng bổ sung các thông tin liên hệ chi tiết bạn bè của bạn vào một ứng dụng khách e-mail chẳng hạn như Yahoo! Mail. Bạn sẽ phát triển mã thực tế để xây dựng các lược đồ URI ngữ nghĩa, chỉ rõ đầu ra HTML của bạn để cho phép các thông tin liên hệ chi tiết của những người dùng của bạn dễ dàng được xuất khẩu từ trang web của họ và chỉ ra các mối quan hệ của những người dùng thông qua các định dạng tiêu chuẩn của Web Ngữ nghĩa.

Các từ viết tắt thông dụng

  • API: Giao diện lập trình ứng dụng
  • DTD: Định nghĩa kiểu tài liệu
  • GRDDL: Các mô tả tài nguyên lượm lặt từ các phương ngữ của các ngôn ngữ
  • HTML: Ngôn ngữ đánh dấu siêu văn bản
  • PHP: Bộ tiền xử lý siêu văn bản PHP
  • RDF: Khung công tác mô tả tài nguyên
  • UI: Giao diện người dùng
  • W3C: Hiệp hội Mạng toàn cầu
  • XHTML: Ngôn ngữ đánh dấu siêu văn bản mở rộng
  • XML: Ngôn ngữ đánh dấu mở rộng

Bạn sẽ bắt đầu với một giới thiệu vắn tắt về Web Ngữ nghĩa trước khi bạn xem cách sử dụng mod_rewrite của Apache để tách các URI của ứng dụng Web của bạn ra khỏi các tệp vật lý thực hiện nó. Để làm điều này, bạn sẽ sử dụng các chỉ dẫn RewriteRuleRewriteCond để xây dựng một lược đồ URI phản ánh mô hình thiết kế lôgic chứ không phải là cách bố trí các tệp của bạn trên đĩa. Sau đó bạn sẽ xem xét việc sử dụng vi định dạng (microformat) hCard để đánh dấu thông tin liên hệ của những người dùng theo cách di động và xem bạn đã có thể sử dụng thông tin đó như thế nào trong các trình duyệt hiện nay cũng như trích ra dữ liệu RDF từ nó bằng cách sử dụng GRDDL. Cuối cùng, bạn sẽ xem xét FOAF, một bảng từ vựng dựa trên RDF để mô tả mọi người và các mối quan hệ và xem bạn có thể kết hợp trực tiếp bảng từ vựng đó vào XHTML của mình như thế nào khi sử dụng RDFa. Các phần chính của hướng dẫn là:

  • Một giới thiệu vắn tắt về Web Ngữ nghĩa.
  • Triển khai một lược đồ URI ngữ nghĩa.
  • Biểu diễn thông tin liên hệ của người dùng bằng hCard.
  • Biểu diễn mạng của người dùng bằng FOAF.

Hướng dẫn này sử dụng hai tiêu chuẩn Web Ngữ nghĩa khác nhau: Các vi định dạng (Microformat) và RDFa/FOAF. Các vi định dạng là một phong trào quần chúng và không được một cơ quan tiêu chuẩn chính thức ủng hộ, nhưng được thiết kế để giải quyết các vấn đề phổ biến cụ thể trong việc biểu diễn dữ liệu ngữ nghĩa. RDFa/FOAF dựa trên các tiêu chuẩn RDF của W3C, một nỗ lực rộng lớn hơn để cho phép biểu diễn bất kỳ tất cả những gì là kiến thức của con người. Vì tôi đã chọn các ví dụ tương đối đơn giản, đó là những người dùng và mạng của họ, để biểu diễn theo ngữ nghĩa trong hướng dẫn này, tôi có thể chỉ dùng hoặc tất cả là vi định dạng hoặc tất cả là RDF. Có những kiểu vi định dạng tương đương với FOAF, trong khi có thể sử dụng chính FOAF cho kiểu dữ liệu tương tự như vi định dạng hCard. Tất nhiên, điểm mấu chốt của hướng dẫn này là để cho bạn tìm hiểu mọi thứ, vì vậy tôi đã sử dụng cả hai tiêu chuẩn trong SemanticBook. Một số khác biệt và lợi thế của từng tiêu chuẩn được thảo luận trong khung bổ sung bên cạnh; sau khi bạn đã có cơ hội để đáp ứng một số các chi tiết triển khai trong bối cảnh của mạng xã hội SemanticBook.

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

Bạn sẽ cần những công cụ sau để làm theo cùng với hướng dẫn này:

  • Công cụ chính cần thiết là một trình soạn thảo văn bản. Một trình soạn thảo văn bản có sự hỗ trợ nào đó cho cú pháp HTML và XML là tốt nhất.
  • PHP— Tôi đã sử dụng Phiên bản 4.4.8 trong hướng dẫn này, nhưng các phiên bản mới hơn cũng làm việc tốt.
  • Máy chủ Apache— Phiên bản 2.0.63.
  • MySQL— Tôi đã sử dụng phiên bản 4.1.22, nhưng bất kỳ phiên bản nào mới hơn đều tốt cả.
  • Kiểm tra các vi định dạng của bạn với Operator Add-On (Phần bổ sung toán tử) cho Firefox.

Tài liệu Cài đặt Apache PHP và MySQL giải thích cách cài đặt mọi thứ trên Windows.

Xem ứng dụng SemanticBook đang hoạt động.


Giới thiệu vắn tắt về Web Ngữ nghĩa

Web Ngữ nghĩa là sản phẩm trí tuệ của Tim Berners-Lee, cha đẻ của Mạng toàn cầu (World Wide Web). Mạng toàn cầu là một mạng các dữ liệu mà con người có thể hiểu được rộng lớn, có thể được thực hiện thông qua định dạng thông tin HTML tương thích. Web Ngữ nghĩa là một phần mở rộng của định dạng này, cả trong ý tưởng lẫn trong thực hiện, để tạo ra một mạng dữ liệu rộng lớn, mà cả người và máy đều có thể hiểu được.

Rõ ràng có một lượng lớn các API có sẵn cho phép các nhà phát triển truy cập vào các trang web cụ thể mà mọi người muốn coi Web như là dữ liệu. Tuy nhiên, các API khác nhau từ các trang web khác nhau không chắc theo cùng một định dạng, ngay cả khi chúng cho phép truy cập vào dữ liệu tương tự. Nếu bạn muốn xây dựng phần mềm có thể diễn giải kết quả của các cuộc gọi API này, bạn phải viết một giao diện riêng cho mỗi API và nếu một trang web mới ra đời, bạn phải viết một giao diện mới. Với Web Ngữ nghĩa, vấn đề đó được loại bỏ và dữ liệu có sẵn theo các định dạng tiêu chuẩn trực tiếp từ trang web, thay vì phải truy cập nó bằng một API. Bạn viết một giao diện theo các tiêu chuẩn Web Ngữ nghĩa và phần mềm của bạn giao tiếp với tất cả các trang web thực hiện các tiêu chuẩn giống nhau này.

RDF, RDFa, các vi định dạng và GRDDL

Các công nghệ Web Ngữ nghĩa chủ yếu trong hướng dẫn này là RDF, RDFa, các vi định dạng và GRDDL.

RDF (Resource Description Framework – Khung công tác mô tả tài nguyên) là tiêu chuẩn cơ sở của các công nghệ Web Ngữ nghĩa. Nó cho phép biểu diễn kiến thức theo một định dạng rõ ràng, mà sau đó có thể được biểu diễn bằng XML (thường gọi là "được tuần tự hóa thành XML") để cho phép các máy tính suy luận về kiến thức đó. Để làm cho trang web của bạn thành một phần của Web Ngữ nghĩa, phải có khả năng trích ra RDF từ nó.

Các vi định dạng không có quá nhiều tiêu chuẩn như các mẫu thiết kế. Nhờ sử dụng HTML tiêu chuẩn và XHTML theo một cách chính thức hóa, giá trị ngữ nghĩa bổ sung có thể được suy ra từ việc đánh dấu đó. Các vi định dạng biểu diễn các tính năng thường có trong các trang web ví dụ như con người (hCard), các sự kiện (hCalendar), các weblog (hAtom), sơ lược lý lịch (hResume) và các đánh giá (hReview). Bạn có thể lấy được RDF từ các vi định dạng bằng GRDDL.

RDFa là kỹ thuật để nhúng RDF vào trong đánh dấu XHTML. Để làm điều này, bạn mở rộng các phần tử XHTML bằng một số thuộc tính bổ sung, rồi sau đó ánh xạ các cấu kiện của RDF trực tiếp vào việc đánh dấu trang. Bạn có thể trực tiếp lấy được RDF từ các tài liệu RDFa hoặc trích nó ra bằng cách sử dụng GRDDL.

Các mô tả tài nguyên lượm lặt từ các phương ngữ của các ngôn ngữ (GRDDL — được phát âm là 'griddle'), cho phép bạn lấy được RDF từ các tài liệu mà chính nó không phải là RDF. Các vi định dạng, với việc sử dụng HTML chính thức hóa, là các đích lý tưởng cho việc này, cũng giống như là RDFa, nhưng có thể viết một phép chuyển đổi cho bất kỳ trang web nào (hoặc một tập hợp các trang web tương tự) để tạo ra một số RDF thích hợp. Ý tưởng của GRDDL là tự khởi động Web Ngữ nghĩa để nhanh chóng lấy được một lượng lớn nội dung Web Ngữ nghĩa quan trọng.

Để biết thêm các chi tiết về các công nghệ Web Ngữ nghĩa này và khác, hãy xem phần Tài nguyên.

Nếu bạn có một số câu hỏi về các công nghệ RDFa, các vi định dạng, GRDDL hay các công nghệ Web Ngữ nghĩa khác, hãy truy cập vào diễn đàn Khám phá các công nghệ Web Ngữ nghĩa trên developerWorks.


Triển khai một Lược đồ URI Ngữ nghĩa (Semantic URI Scheme)

Bản thân URI của một trang Web là một đoạn dữ liệu; nó có thể có cấu trúc truyền đạt các ngữ nghĩa. Trong phần này, bạn sẽ thấy cách tạo ra các URI của mình chuyển tải ý nghĩa, thêm vào đó là trực quan và dễ sử dụng. Vì các trang ứng dụng SemanticBook cũng sẽ là API của bạn, nên bạn cần trình bày một giao diện nhất quán. Vì vậy, bạn cần xem xét nó một cách cẩn thận giống như bạn có thể làm nếu bạn xây dựng một API cho một thư viện phần mềm.

Một Lược đồ URI Ngữ nghĩa là gì?

Ý tưởng đằng sau một lược đồ URI ngữ nghĩa là URI của bạn biểu diễn các phạm trù khái niệm của trang web của bạn thay vì bố trí vật lý phía dưới của các kịch bản lệnh thường dùng để tạo ra các trang web của bạn. Bạn có thể làm điều này với mô đun mod_rewrite của Apache, một phần mở rộng tiêu chuẩn vô cùng mạnh và linh hoạt cho Apache với nhiều tùy chọn, mặc dù điều cơ bản mà bạn sẽ cần cho SemanticBook là thật dễ hiểu.

SemanticBook là một ứng dụng rất đơn giản, vì thế bạn sẽ có một mô hình rất đơn giản. Ứng dụng của bạn có một vài trang đặc biệt, thực hiện các hoạt động chứ không phải là tồn tại như là những người dùng:

  • user.php — Trang này trình bày các thông tin lược tả người dùng và (sau này là) mạng xã hội của họ.
  • index.php — Đây là trang mặc định của ứng dụng SemanticBook. Nó sẽ hiển thị biểu mẫu đăng nhập và đăng ký hoặc một thông báo chào mừng khi một người dùng đã đăng nhập.
  • list.php — Hình 1 cho thấy list.php đang hoạt động với một danh sách của tất cả người dùng đã đăng ký và các liên kết đến các trang lược tả của họ.
    Hình 1. Danh sách người dùng, do trang list.php tạo ra
    Danh sách người dùng, do trang list.php page tạo ra
  • profile.php — Được hiển thị đang hoạt động như trong Hình 2, trang này dành cho người dùng chỉnh sửa các lược tả của họ.
    Hình 2. Trang profile.php để những người dùng chỉnh sửa các thông tin chi tiết của họ
    Trang profile.php để những người dùng chỉnh sửa các thông tin chi tiết của họ
  • login.php — Trang này xử lý đăng nhập của người dùng và thiết lập phiên làm việc, rồi chuyển hướng đến trang index. Trong hoạt động bình thường, người dùng không thực sự nhìn thấy nó.
  • logout.php — Trang này kết thúc phiên làm việc của người dùng và chuyển hướng đến trang index.
  • add-friend.php — Trang này thêm một người bạn vào mạng của người dùng khi người dùng nhấn chuột vào liên kết được cung cấp trên mỗi trang do user.php tạo ra. Một lần nữa, trang này sẽ chuyển hướng sau khi hoàn thành, vì vậy người dùng không bao giờ nhìn thấy nó, nhưng nó sẽ chuyển hướng về lược tả mà nó được gọi từ đó.
  • register.php — Trang này xử lý thiết lập người dùng mới khi họ điền vào biểu mẫu trên trang index.php.

Mặc dù các trang này được triển khai thực hiện như là các trang PHP có phần mở rộng tên tệp, bạn sẽ sử dụng mod_rewrite để ẩn giấu phần mở rộng tên tệp không để cho những người dùng thấy, do đó bạn sẽ kết thúc bằng các URI giống như http://uri/semanticbook/list cho trang list.php. Mọi trang không phải là một trang đặc biệt sẽ là một trang chi tiết của người dùng, ví dụ như http://uri/semanticbook/robertc, mà thực ra do URI http://uri/semanticbook/user.php?user=robertc tạo ra, sẽ là trang của người dùng robertc. Bạn sẽ sử dụng mod_rewrite để chuyển hướng URI đó tới trang người dùng của bạn với tham số thích hợp.

Lưu ý rằng tôi đã nhượng bộ một chút ở đây để cho đơn giản. Vì tôi chỉ có một đối tượng trong SemanticBook, là một người dùng, nên để cho đơn giản tôi đã đặt mọi thứ trong URI gốc của trang web. Nó gần như tương đương với việc đặt tất cả các đối tượng của bạn trong một ứng dụng bình thường trong một vùng tên chung duy nhất thay vì, ví dụ, một hệ thống phân cấp. Nếu đây là một trang web thực sự mà bạn có thể mở rộng trong tương lai, thì bạn có thể thích đặt tất cả những người dùng của mình vào trong một thư mục con user (lưu ý rằng, nhờ mod_rewrite, thư mục con này không có nghĩa là một thư mục con vật lý), sao cho sau này bạn có thể thêm các đối tượng vào đó mà không cần thay đổi lược đồ URI và do đó, cả các API của mình.

Mod_rewrite của Apache

Trước khi bạn bắt đầu, hãy kiểm tra xem bản cài đặt Apache của bạn có mô đun mod_rewrite được kích hoạt chưa. Nếu bạn sử dụng một môi trường lưu trữ chia sẻ trên máy chủ thì nó đã được cấu hình rồi và bạn có thể kiểm tra bằng cách sử dụng hàm php_info(). Nếu bạn đã cài đặt Apache cục bộ riêng của mình, thì bạn cần kiểm tra tệp http.conf của mình để tìm các dòng LoadModule rewrite_module modules/mod_rewrite.soAddModule mod_rewrite.c, và sau đó loại bỏ dấu thăng (#) ở đầu dòng nếu nó tồn tại.

Một số bản phân phối Linux™ có cách xử lý riêng của mình để kích hoạt các mô đun Apache; trên Ubuntu, bạn có thể bật lên mod_rewrite bằng lệnh viết lại sudo a2enmod và sau đó nhập sudo apache2ctl -t -D DUMP_MODULES để xác minh xem nó được nạp chưa.

Sử dụng RewriteRule trong tệp .htaccess

Bây giờ bạn có mod_rewrite đã chạy, bạn có thể đáp ứng các yêu cầu từ một loạt các URI với một kịch bản lệnh duy nhất bằng cách tạo ra một mục hoặc trong tệp httpd.conf hoặc trong tệp .htaccess của bạn (ở đây tôi sẽ tiếp tục với tệp .htaccess sao cho tất cả mọi thứ chạy trôi chảy trên môi trường lưu trữ chia sẻ trên máy chủ). Hãy xem xét một vài ví dụ trước khi bạn chuyển đến SemanticBook để bạn có thể hiểu mọi thứ hoạt động như thế nào. Ví dụ, hãy xem xét một cửa hàng trực tuyến. Thông thường, một kịch bản lệnh dạng nào đó hiển thị thông tin sản phẩm, có quyền truy cập vào một URI như sau:

http://www.myshop.com/product_detail.php?product_id=987654321

Tuy nhiên, bạn muốn có một URI giống thế này hơn:

http://www.myshop.com/product/987654321

hoặc thậm chí tốt hơn, như là:

http://www.myshop.com/products/deluxe-widget

Bây giờ người dùng có thể thấy deluxe-widget là một sản phẩm và sẽ có cơ hội tốt hơn nhiều để nhớ đến URI này và tìm thấy nó trong lịch sử trình duyệt của họ. Và một lợi ích phụ, việc xếp hạng cho từ khóa "deluxe widget" của công cụ tìm kiếm của bạn sẽ tốt hơn do tên sản phẩm xuất hiện trong URI.

Khi dùng mod_rewrite, bạn có thể sử dụng một biểu thức chính quy để làm cho kịch bản lệnh product_detail.php đáp ứng với cả hai URI khác. Để lấy được URI thứ hai ở trên, bạn sử dụng một quy tắc viết lại như sau: RewriteRule /products/([0-9]+) /product_detail.php?product_id=$1.

Quy tắc này cho thấy ba trong số bốn phần của một quy tắc RewriteRule điển hình, được phân cách bằng các khoảng trống. Phần đầu tiên chính là chỉ dẫn này; sau đó là một biểu thức chính quy, đó là một mẫu để so khớp với URI, theo sau là một URI để ánh xạ tới nó, tức là URI thay thế. Ký hiệu $1 trong ánh xạ này tương ứng với bất cứ cái gì khớp với ([0-9] +), có nghĩa là bất kỳ chuỗi các số chữ số nào. Lưu ý rằng bạn đang thực hiện xác nhận hợp lệ đầu vào cơ bản nào đó ở đây; các URI, không phải là các mã định danh (ID) sản phẩm dạng số, sẽ không phù hợp với quy tắc này.

Việc so khớp với URI thứ ba có phức tạp hơn một chút và bạn có hai tùy chọn: Bạn có thể hoặc sửa đổi kịch bản lệnh sản phẩm của mình để làm việc với một tham số tên sản phẩm (hoặc có hai phiên bản của nó) hoặc bạn có thể sử dụng chỉ dẫn RewriteMap. Trong trường hợp đầu tiên, bạn có thể thực hiện một quy tắc bổ sung đơn giản: RewriteRule /products/([a-z]+) /product_detail.php?product_name=$1 [NC].

Lúc này bạn tìm kiếm một chuỗi các ký tự chứ không phải là một chuỗi các chữ số. Bạn cũng sử dụng thành phần tùy chọn thứ tư của một quy tắc viết lại — đó là cờ, trong trường hợp này [NC] nói rằng bỏ qua không phân biệt chữ hoa chữ thường. Bạn có thể dùng nhiều cờ, được phân cách với nhau bằng các dấu phẩy. Ví dụ, [NC, L] nghĩa là bỏ qua không phân biệt chữ hoa chữ thường và không xử lý tiếp các quy tắc nếu quy tắc này đã khớp.

Chỉ dẫn RewriteMap dựa vào một tệp văn bản bổ sung mà bạn tạo ra từ cơ sở dữ liệu của mình (và tái tạo khi bạn thêm sản phẩm mới). Để giải thích cách làm này, hãy tưởng tượng rằng thay vì chỉ đơn giản là tổ chức tất cả người dùng trên SemanticBook như thể họ ở trong cùng thư mục, bạn muốn nhóm họ lại theo tên thành phố mà họ cư trú ở đó. Bạn nhằm đến các URI có phần đuôi giống như /london/robertc mà bạn muốn ánh xạ tới /user.php?uid=987654321 để đưa ra trang thích hợp. Bạn tạo một tệp văn bản với một danh sách các chuỗi văn bản phân cách với nhau bằng khoảng trống, thực sự gồm hai cột văn bản. Với ví dụ của mình, ở cột bên trái, bạn sẽ có 'london/robertc' được ghép thành cặp với id người dùng là '987654321' ở cột bên phải. Sau đó, bạn có thể móc nối nó vào các quy tắc viết lại của mình như trong Liệt kê 1.

Thay vì tiến hành thay thế biến trực tiếp bằng $1, như trong các ví dụ ở trên, Apache lấy đoạn văn bản do biểu thức chính quy tìm ra và tra tìm nó trong cột dữ liệu bên trái trong tệp văn bản của bạn, sau đó nhận được đoạn văn bản từ cột bên phải và thay thế nó vào trong quy tắc. Vì vậy, bạn có thể có 'widgets/deluxe' ở cột bên trái của mình và '987654321' ở cột bên phải của mình và phần london/robertc của URI được ánh xạ tới product_detail.php?product_id=987654321. Trong ứng dụng SemanticBook, bạn chỉ có một thể loại, là những người dùng, do đó một RewriteRule thuần không có RewriteMap sẽ phù hợp hơn, nhưng đây là một kỹ thuật có ích nếu các dự án sau này của bạn đòi hỏi các URI phức tạp hơn.

Liệt kê 1. Sử dụng chỉ dẫn RewriteMap
RewriteMap products txt:/path/to/file/userids.txt
RewriteRule / ^(.*)$ user.php?uid=${products:$1|0}

Sử dụng RewriteCond để tùy chọn xử lý quy tắc

Điều cuối cùng để thảo luận vào lúc này là chỉ dẫn RewriteCond. Chỉ dẫn này cho phép bạn thiết lập các điều kiện tiên quyết cho các quy tắc viết lại của mình. Apache sẽ đánh giá RewriteCond để xác định có hay không cố gắng áp dụng RewriteRule tiếp theo. Với RewriteCond, bạn có thể ngăn không cho áp dụng RewriteRule nếu các điều kiện tiên quyết không được đáp ứng, thậm chí ngay cả khi RewriteRule có thể đã khớp.

Liệt kê 2 gom tất cả các tính năng vừa mới được thảo luận với nhau thành tệp .htaccess của SemanticBook (xem phần Tải về để truy cập vào tất cả các mã ví dụ trong hướng dẫn này).

Liệt kê 2. Các mục nhập vào của tệp .htaccess với lược đồ URI ngữ nghĩa đơn giản của bạn
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9]+)$ user.php?user=$1 [L,QSA]
</IfModule>

Bạn sử dụng RewriteCond để xem liệu URI có yêu cầu một tệp (-f) hoặc thư mục (-d) thực sự có tồn tại không. Việc này tránh cho bạn vô tình mắc phải rắc rối với các vòng lặp vô hạn. Nếu yêu cầu không phải là một tệp hoặc một thư mục thì bạn kiểm tra RewriteRule của mình. Nếu tệp PHP tồn tại, thì bạn chuyển hướng đến nó và dừng xử lý (tùy chọn [L]); nếu nó không tồn tại, bạn cố gắng để khớp với một tên người dùng là các số và các chữ thường.

Liệt kê 3 là một kịch bản lệnh đơn giản để kiểm tra các quy tắc viết lại của bạn trước khi bạn triển khai toàn bộ trang user.php, vì vậy bạn có thể nhìn thấy những tác động của các quy tắc mod_rewrite của mình mà không cần hiển thị tất cả dữ liệu lược tả người dùng. Với tệp .htaccess trong Liệt kê 2 trong cùng thư mục và tham chiếu user.php được thay bằng tên của kịch bản lệnh kiểm tra, bạn có thể yêu cầu các URI như /a0b1c2 hoặc chuyển hướng nó đến kịch bản lệnh này, sau đó báo cáo rằng hoặc RewriteRule của bạn đã làm việc hoặc có một lỗi. Một lỗi với kịch bản lệnh đơn giản trong Liệt kê 3 cho biết rằng bạn đã cấu hình sai mode_rewrite trong Apache. Nếu bạn mắc lỗi ở đây, bạn có thể nhận được sự trợ giúp trong tài liệu hướng dẫn của Apache hoặc bạn có thể thử tìm trên một diễn đàn trực tuyến như Phát triển trang web với Phần mềm nguồn mở trên developerWorks để tìm một số lời khuyên về chuyên môn (xem phần Tài nguyên để biết các liên kết).

Liệt kê 3. Trang kiểm tra viết lại URI đơn giản
<html>
    <head>
        <title>Testing .htaccess</title>
    </head>
    <body>
        <h1>
<?php
if (isset($_GET['user'])) {
    echo "Username passed";
} else {

        echo "Error occurred";

    }
}
?>
        </h1>
    </body>
</html>

Nhiều chi tiết hơn nữa về mod_rewrite nằm ngoài phạm vi của hướng dẫn này, mặc dù có thể nói nhiều hơn nữa về mô đun linh hoạt này (xem phần Tài nguyên để biết các liên kết). Hãy nhớ rằng, ứng dụng của bạn sẽ chấp nhận các URI dưới dạng http://url/[username] (tên người dùng), chuyển hướng đến user.php và nếu được chuyển giao tên của một tệp không có phần mở rộng .php, sẽ chuyển hướng đến tệp PHP có liên quan. Vì vậy, trang index.php của bạn sẽ có thể truy cập được như http://url/index mà không có phần mở rộng của tệp.


Biểu diễn thông tin liên hệ của người dùng với hCard

Một đặc điểm của RDF là các danh từ trong các bộ ba thường được các URI tham chiếu đến. Trong ứng dụng Web ngữ nghĩa xã hội của bạn, trang chủ của người dùng sẽ biểu diễn chúng. Để làm cho nó trở thành một sự biểu diễn có ích, bạn sẽ sử dụng vi định dạng hCard, sao cho khi mọi người xem trang của bạn trên SemanticBook, họ có thể dễ dàng xuất khẩu các chi tiết liên hệ của bạn tới một vCard, sau đó có thể được nhập khẩu trực tiếp bởi nhiều trình quản lý liên hệ phổ biến và các ứng dụng khách thư điện tử (mail). Là cơ sở của các trang người dùng của bạn, bạn sẽ vay mượn hầu hết các trường từ ứng dụng PHP phổ biến, là phpBB, nó cũng sẽ chứng tỏ việc áp dụng vi định dạng hCard cho dữ liệu người dùng trên các trang web hiện có là dễ như thế nào. Hãy tìm kiếm các thông tin chi tiết về RDF và các bộ ba trong bài sau, "Lập kế hoạch một trang Web Ngữ nghĩa: Chuẩn bị trang web của bạn với dữ liệu có cấu trúc" (xem phần Tài nguyên để có một liên kết).

Giới thiệu về hCard

Các trang người dùng của bạn trong SemanticBook sẽ sử dụng vi định dạng hCard để thêm cấu trúc ngữ nghĩa cho thông tin hiển thị về người dùng. hCard là một cách đánh dấu HTML tiêu chuẩn để chỉ ra các tên trường như được quy định trong định dạng thẻ điện tử vCard RFC 2422. Hầu hết các ứng dụng khách thư điện tử phổ biến, cũng như một loạt các ứng dụng khác, đều hiểu vCard, vì vậy nếu bạn muốn xem định dạng đó, bạn có thể thử xuất khẩu các chi tiết liên hệ của mình từ ứng dụng khách thư điện tử của bạn. Liệt kê 4 cho thấy vCard của tôi khi được xuất khẩu từ ứng dụng khách thư điện tử của tôi để bạn có thể xem định dạng của nó trông như thế nào.

Liệt kê 4. Ví dụ về vCard
begin:vcard
fn:Rob Crowther
n:Crowther;Rob
adr:;;;London;;;United Kingdom
email;internet:robert@crowther.info
title:Web Developer
url:http://www.boogdesign.com/
version:2.1
end:vcard

Như bạn có thể thấy, định dạng này rất đơn giản, bao gồm chủ yếu là 'các kiểu' và 'các giá trị' được phân cách với nhau bằng các dấu hai chấm, và nhiều giá trị khác nhau phân cách bằng các dấu chấm phẩy. Ở đây một kiểu cụ thể có thể có thêm các tùy chọn bổ sung, ví dụ như hai tên kiểu xuất hiện trước dấu hai chấm như trong email;internet:.

Vậy thì, một hCard là một biểu diễn của một vCard bằng HTML sử dụng các tên lớp và các phần tử HTML lồng nhau rất tự nhiên để ánh xạ tới các kiểu vCard. Khác với vCard, bạn có thể gán nhiều lớp cho cùng một phần tử để tránh trùng lặp, nhưng ngoài điều này ra HTML trong Liệt kê 5 trông hoàn toàn tương tự.

Liệt kê 5. Ví dụ từ Liệt kê 4 đã mã hóa như hCard
<div class="vcard">
 <a class="url fn" href="http://www.boogdesign.com/">Rob Crowther</a>
 (<span class="title">Web Developer</span>)
 <div>Email: 
   <span class="email">
     <span class="type">internet</span>
     <span class="value">robert@crowther.info</span>
   </span>
 </div>
 <div class="adr">
    <span class="locality">London</span>,  
    <span class="country-name">United Kingdom</span>
 </div>
</div>

Một khi bạn có hCard trong trang của mình, một số công cụ có thể làm những việc có ích với thông tin đó. Ví dụ, phần mở rộng Operator (toán tử) cho Firefox (xem phần Tài nguyên) cung cấp cho bạn một cách nhanh chóng để nhập khẩu địa chỉ liên hệ vào ứng dụng khách thư điện tử của bạn. Tôi sẽ nói về điều này trong phần Nhưng nó có lợi ích gì? sau khi bạn xây dựng PHP để tạo ra đánh dấu hCard trong ứng dụng SemanticBook.

Triển khai hCard

Như bạn có thể thấy trong Liệt kê 4, để triển khai hCard và lồng vào đúng, chủ yếu là bạn thêm các lớp vào bất cứ nơi nào cần thiết và đôi khi chèn một số đánh dấu bổ sung cho các lớp để áp dụng. Hãy xem xét một vài sắc thái trước khi bạn nạp vào mã PHP của SemanticBook. Hãy xem xét kỹ hơn một chút các chi tiết trong đặc tả hCard (xem phần Tài nguyên ) và ví dụ trong Liệt kê 4. Trước hết, đây là toàn bộ danh sách các đặc tính của hCard. Các đặc tính con, lồng trong HTML, nằm trong các dấu ngoặc đơn:

  • fn
  • n (family-name, given-name, additional-name, honorific-prefix, honorific-suffix) -- tên (tên họ, tên, tên bổ sung, tiền tố kính trọng, hậu tố kính trọng)
  • nickname, sort-string -- biệt danh, thứ tự sắp xếp
  • url, email (type, value), tel (type, value) -- địa chỉ url, thư điện tử (kiểu, giá trị), điện thoại (kiểu, giá trị)
  • adr (post-office-box, extended-address, street-address, locality, region, postal-code, country-name, type, value), label -- địa chỉ (hộp thư bưu điện, địa chỉ mở rộng, địa chỉ đường phố, tên địa phương, tên vùng, mã bưu điện, tên nước, kiểu, giá trị), nhãn
  • geo (latitude, longitude), tz -- địa lý (vĩ độ, kinh độ), tz
  • photo, logo, sound, bday -- ảnh, biểu trưng, âm thanh, ngày sinh
  • title, role, org (organization-name, organization-unit) -- tước hiệu, chức vụ, tổ chức (tên tổ chức, phòng ban nào)
  • category, note -- thể loại, ghi chú
  • class, key, mailer, uid, rev -- lớp, khóa, trình thư điện tử, mã định danh người dùng, hiệu chỉnh

hCard chỉ có hai đặc tính bắt buộc: FN và N. Các độc giả tinh mắt sẽ phát hiện ra rằng chỉ FN được chỉ rõ trong Liệt kê 4, nhưng đây vẫn là một hCard hợp lệ. Lý do cho điều này là quy tắc "Implied 'n' Optimization" (Tối ưu hóa 'n' mặc nhiên): nếu N không có mặt, nhưng lại có FN, thì giá trị của N bằng giá trị của FN. Điều này được phép do bản thân các tác giả của RFC 2426 đã quên đưa đặc tính N vào trong nhiều ví dụ của họ và nó cũng là một phần của một tính năng rất có ích trong quá trình định rõ đặc tả vi định dạng — giúp cho các nhà sản xuất nội dung thực hiện dễ dàng. Để giảm sự trùng lặp và làm cho việc tạo nội dung dễ dàng hơn, các đặc tính "nickname" và "org" cũng có quy tắc tối ưu hóa mặc nhiên tương tự. Trong bảng người dùng trong SemanticBook, bạn sẽ chỉ có một trường tên duy nhất, do đó bạn sẽ tận dụng lợi thế của quy tắc tối ưu hóa để giảm bớt một lượng nhỏ mã lệnh mà bạn phải viết.

Một số trường có các kiểu con, đáng chú ý là adr, email và tel. Một trường email, ngoài những thứ khác, có thể có kiểu internet hoặc x400 trong khi một trường tel có thể có kiểu con là work (cơ quan) hay home (nhà riêng) hoặc cell (di động) hoặc fax và trường adr có thể có kiểu con là intl (quốc tế) hoặc postal (bưu điện). Tất cả chúng có thể có kiểu pref nghĩa là được ưa thích. Để biết một danh sách đầy đủ hãy xem hoặc đặc tả hCard hoặc RFC 2426. Trong các trường hợp này, hCard sử dụng một phương thức được gọi là trích giá trị — trường cha mẹ là một phần tử gói chung hai phần tử, một phần tử trong đó sẽ có kiểu như trường đó và một giá trị khác, sẽ là giá trị thực sự được gán cho trường cha mẹ. Bạn có thể nhìn thấy nó đang hoạt động trên trường email trong Liệt kê 5. Bạn sẽ chỉ làm việc với trường email và adr trong SemanticBook và bạn sẽ đưa ra giả định đơn giản hóa là tất cả các địa chỉ email có kiểu internet và là bất kỳ thông tin nào mà bạn có với trường adr là một tên địa phương (locality).

Đây là một thời điểm tốt để nói về triết lý và những nguyên tắc đằng sau các vi định dạng để hiểu rõ hơn tại sao chúng có một tiêu điểm hạn chế hơn so với định dạng biểu diễn kiến thức tổng quát hơn do RDF cung cấp:

  • Giải quyết một vấn đề cụ thể — Trước khi xem xét một vi định dạng mới, cần phải xác định một vấn đề cụ thể. Các vi định dạng không phải là về cách giải quyết các vấn đề theo một cách chung nhất, mà luôn về cách giải quyết các vấn đề cụ thể.
  • Bắt đầu càng đơn giản càng tốt — Nếu vấn đề phức tạp, thì trước tiên hãy giải quyết phần dễ nhất của nó. Đó có thể là tất cả những gì bạn cần cho một giải pháp có ích và nếu không, bạn có thể tiến hóa từ đó.
  • Đầu tiên hãy thiết kế cho con người, máy là thứ hai — Đây là nơi khởi đầu dễ thực hiện cho các nhà sản xuất nội dung. Các vi định dạng nên vừa vặn thoải mái với các mẫu sử dụng hiện có. Phần khác chủ yếu của việc này là không ẩn giấu dữ liệu. Các vi định dạng không bao giờ nên phụ thuộc vào siêu dữ liệu ẩn vì dữ liệu ẩn có nhiều khả năng mất đồng bộ hơn so với dữ liệu thấy được.
  • Sử dụng lại các khối xây dựng của các tiêu chuẩn được chấp nhận rộng rãi — hCard chứng tỏ việc sử dụng lại khi tất cả các tên trường của nó đều lấy từ tiêu chuẩn quốc tế RFC 2426.
  • Tính mô đun và tính nhúng — Chính định dạng hCard là một thành phần then chốt của một vài vi định dạng khác.

Bây giờ hãy xem xét một ví dụ thế giới thực trong ứng dụng SemanticBook. Hãy tưởng tượng bạn có một cơ sở dữ liệu có đủ thông tin người dùng. Bạn sẽ hiển thị cơ sở dữ liệu đó theo định dạng hCard như thế nào? Để chứng tỏ rằng tôi không chỉ làm dễ cho mình bằng cách định nghĩa các trường của hCard như là các cột trong bảng người dùng của SemanticBook, tôi sẽ sử dụng bảng người dùng trong hệ thống bản tin PHP phổ biến, đó là phpBB, làm một mô hình. SQL để tạo ra bảng người dùng cho các ứng dụng của bạn có trong bản tải về. Nó là một phiên bản rút gọn của bảng người dùng phpBB, loại bỏ các tính năng chỉ liên quan đến một diễn đàn. Bảng 1 cho thấy một số trường tiêu chuẩn có ích và cách bạn có thể ánh xạ chúng tới hCard.

Bảng 1. Sử dụng thông tin người dùng phpBB trong hCard
Cột phpBB Đặc tính hCard
usernamefn, n, nickname
user_emailemail
user_birthdaybday
user_fromadr
user_avatarphoto
user_websiteurl
user_occrole

Để chứng tỏ việc xây dựng đánh dấu hCard từ dữ liệu có sẵn trên các trang web hiện có dễ như thế nào, Liệt kê 6 lấy ra các trường đó từ bảng người dùng phpBB rút gọn và chèn chúng trực tiếp vào trong một số mã HTML. Để xây dựng hàng dữ liệu, mã trong Liệt kê 6 truy vấn tên người dùng được chuyển giao qua mod_rewrite của bạn dựa vào cơ sở dữ liệu để trích ra thông tin người dùng chính xác. Hy vọng rằng, trong liệt kê này, bạn có thể thấy những thứ mà kết quả đầu ra của HTML trông giống như vậy; nếu không, bạn có thể kiểm tra các kết quả trong ví dụ trực tuyến. Mã trong Liệt kê 6 lấy từ tệp user.php trong phần tải về.

Liệt kê 6. Dữ liệu Lược tả phpBB thành đánh dấu hCard
<div class="vcard"> 
<?php if ($row['user_avatar']) { ?> 
<img class="photo" src="<?php echo $row['user_avatar']; ?>" alt="" />
<?php } 
if ($row['user_website']) {  
  echo "<h1><a class=\"url fn nickname\" 
               property=\"foaf:name\" rel=\"foaf:homepage\" 
               href=\"".$row['user_website']."\">".$row['username']."</a></h1>"; 
} else { 
  echo "<h1><a class=\"url fn nickname\" 
               property=\"foaf:name\" rel=\"foaf:homepage\" 
               href=\"".$baseURI.$row['username_clean']."\">".
	   $row['username']."</a></h1>"; 
}   
 if ($row['user_occ']) { ?> 
 (<span class="title"><?php echo $row['user_occ']; ?></span>)
<?php } ?> 
 <div>Email:  
   <span class="email"> 
     <span class="type">internet</span> 
     <a class="value" href="mailto:<?php echo $row['user_email']; 
                 ?>"><?php echo $row['user_email']; ?></a> 
   </span> 
 </div> 
<?php if ($row['user_birthday']) { ?> 
 <div>Birthday: 
   <?php list($bday_day, $bday_month, $bday_year) = array_map('strval', 
             explode('-', str_replace(" ", "0", $row['user_birthday']))); ?>
   <abbr title="<?php echo  $bday_year."-".$bday_month."-".$bday_day; ?>" 
             class="bday"> 
   <?php echo $bday_day." ".getmonth($bday_month); ?></abbr> 
 </div> 
<?php } ?> 
<?php if ($row['user_jabber']) { ?> 
 <div>Jabber address:  
   <?php echo $row['user_jabber']; ?> 
 </div> 
<?php } ?> 
<?php if ($row['user_icq']) { ?> 
 <div>ICQ address:  
   <?php echo $row['user_icq']; ?> 
 </div> 
<?php } ?> 
<?php if ($row['user_from']) { ?> 
 <div class="adr">Location: <span class="locality"> 
   <?php echo $row['user_from']; ?> 
 </span></div> 
<?php } ?> 
</div>

Kết quả trực quan của Liệt kê 6 trong trang web nhỏ của bạn được hiển thị trong Hình 3; lưu ý rằng các đánh dấu hCard mà bạn đã bổ sung không tạo ra bất kỳ sự khác biệt có thể nhìn thấy được nào khi trang được biểu thị (trừ khi bạn thêm các quy tắc trong CSS của bạn cho các lớp được dùng trong hCard).

Hình 3. Các lược tả người dùng với hCard được hiển thị trong ứng dụng mạng xã hội của bạn
Các lược tả người dùng với hCard được hiển thị trong ứng dụng mạng xã hội của bạn

Lưu ý rằng bạn hoàn toàn hài lòng bỏ qua các trường nếu không có dữ liệu liên quan trong trường đó. Hãy nhớ rằng các trường bắt buộc duy nhất trong hCard là FN và N, và N được suy ra từ FN. Bạn cũng sẽ thấy rằng chỉ có một mục trong trường địa chỉ của mình, vì phpBB không chia nhỏ tên địa phương ra thành hơn một trường văn bản. Không có các trường riêng biệt cho số nhà hay mã bưu điện như thường có nếu như bạn làm việc với dữ liệu từ một ứng dụng hướng tới địa chỉ liên hệ nhiều hơn. Bạn có thể thử một số phân tích phức tạp để nhận được độ chi tiết tốt hơn không? Có lẽ được, nhưng một trong những nguyên tắc của các vi định dạng là: "Bắt đầu càng đơn giản càng tốt" và một nguyên tắc khác là: "Sự dễ dàng cho tác giả là quan trọng". Các vi định dạng có chủ ý là gọn nhẹ và dễ sử dụng. Xin cứ tự nhiên tận dụng điều đó như bạn đã làm ở đây bằng cách giả định bất cứ thứ gì trong cột user_from của bạn đều là một tên địa phương. Hoàn toàn chấp nhận được việc bao gồm thông tin không liên quan đến hCard, giống như bạn đã bao gồm địa chỉ Jabber trong Liệt kê 6, bạn sẽ tìm thấy địa chỉ đó trong user.php của ứng dụng SemanticBook. Một số dữ liệu người dùng của bạn không phù hợp với các giá trị hCard cũng không quan trọng, miễn là bạn có đủ các trường bắt buộc. Nó vẫn có thể cung cấp một số chức năng có ích thông qua Operator Add-on (Phần bổ sung Toán tử).

Mặc dù trong SemanticBook, các lớp hCard của bạn chủ yếu được áp dụng cho các phần tử div và span trung lập về ngữ nghĩa, nói chung bản thân phần tử nào là không quan trọng. Ví dụ, nếu bạn có một đánh dấu ứng dụng hiện có, sử dụng các phần tử table (bảng), bạn có thể thêm class="hcard" vào phần tử bảng và sử dụng các thuộc tính hCard khác trên các phần tử td. Bạn không phải sao chép mã SemanticBook để vẫn có một hCard hợp lệ.

Một trong những trường hợp ngoại lệ đối với các div và các span trên trang người dùng SemanticBook là việc đánh dấu cho bday — ngày sinh của người dùng. Bất kỳ ngày tháng nào mà bạn muốn biểu diễn trong vi định dạng cần tuân theo định dạng ISO8601 về ngày tháng và thời gian, tiếc là định dạng này không dễ đọc với mắt người, do đó, mã user.php của bạn lợi dụng "Mẫu thiết kế ngày giờ" (Datetime Design Pattern). Ngày tháng dễ đọc với con người được gói trong một phần tử abbr và giá trị thực tế, theo định dạng ISO8601, được đặt trong thuộc tính tiêu đề. Mã của bạn trong Liệt kê 6 sẽ trình bày HTML như sau: <abbr class="bday" title="1971-09-20">20 September</abbr>.

Trích ra RDF từ hCard bằng GRDDL

Trước khi chuyển đến phần một số kết quả thực hành về đánh dấu dữ liệu người dùng của mình với các vi định dạng hCard, bạn sẽ xem nhanh cách dịch các thông tin hCard của mình trên các trang người dùng SemanticBook thành RDF như thế nào. Nếu bạn nhớ lại phần giới thiệu vắn tắt về Web Ngữ nghĩa ở trên, RDF là tiêu chuẩn cơ bản của các công nghệ Web Ngữ nghĩa. Vì vậy, bạn muốn thông tin liên hệ của những người dùng của mình có sẵn dưới dạng RDF để cho các ứng dụng Web Ngữ nghĩa sau này sử dụng dữ liệu và thêm giá trị cho những người dùng của bạn. Điều này cũng giống như với kịch bản ngày tháng di động đã đề cập ở trên và bạn sẽ lại thấy sau này khi bạn xem xét FOAF chi tiết hơn. Khi bạn làm cho dữ liệu người dùng trở nên di động dưới dạng RDF, bạn làm cho SemanticBook có ích hơn cho những người dùng của mình. Nhưng bạn muốn tránh phải tạo ra một phiên bản RDF riêng biệt của trang đó. Bạn có thể làm điều này với GRDDL.

GRDDL cho phép bạn trích ra RDF từ các tài liệu hiện có trên Web, bao gồm những tài liệu đã đánh dấu với vi định dạng hCard. Để cho phép một chương trình đại lý nhận biết GRDDL tự động trích xuất hCard đó trên trang người dùng của bạn thành RDF, bạn cần bổ sung đánh dấu thêm một chút vào phần đầu (head) của tài liệu user.php. Đầu tiên, bạn báo cho chương trình đại lý này là tìm ra một phép chuyển đổi GRDDL, nó có thể thêm một thuộc tính profile (lược tả) vào phần tử head: <head profile="http://www.w3.org/2003/g/data-view http://www.w3.org/2006/03/hcard">.

Bạn đã bổ sung hai URI vào thuộc tính profile của phần tử head trong trang user.php của bạn: URI đầu tiên là lược tả chung của các tài liệu có thể dùng GRDDL và URI thứ hai là để cho chương trình đại lý nhận biết GRDDL biết kiểu thông tin cụ thể được tìm thấy. Tiếp theo, hãy trỏ đến một phép chuyển đổi phù hợp để trích ra thông tin RDF từ tài liệu của bạn. Bạn làm điều này với một phần tử link (liên kết) trong phần đầu của tài liệu, có thuộc tính rel là 'transformation' (phép chuyển đổi). Do hCard là một định dạng phổ biến, nên W3C đã có sẵn một phép chuyển đổi phù hợp để bạn có thể sử dụng ngay: <link rel="transformation" href="http://www.w3.org/2006/vcard/hcard2rdf.xsl" />.

Để kiểm tra GRDDL trong trang user.php của SemanticBook, bạn cần một chương trình đại lý nhận biết GRDDL, một thuật ngữ W3C để chỉ một trình duyệt Web hoặc trình thu thập thông tin hiểu cách áp dụng các chuyển đổi GRDDL để thu được RDF. Do bạn không có một chương trình đại lý riêng của mình, bạn có thể sử dụng chương trình đại lý của W3C ở địa chỉ http://www.w3.org/2007/08/grddl/. Bạn có thể thấy một phần kết quả trong Liệt kê 7.

Liệt kê 7. Đoạn trích mã RDF (của Liệt kê 6) từ GRDDL
  <rdf:Description rdf:nodeID="r1209859928r13405r1">
    <ns0:fn xmlns:ns0="http://www.w3.org/2006/vcard/ns#"> test_user_1 
                                            </ns0:fn>
  </rdf:Description>
  <rdf:Description rdf:nodeID="r1209859928r13405r1">
    <ns0:nickname xmlns:ns0="http://www.w3.org/2006/vcard/ns#">
test_user_1 </ns0:nickname>
  </rdf:Description>
  <rdf:Description rdf:nodeID="r1209859928r13405r1">
    <ns0:url xmlns:ns0="http://www.w3.org/2006/vcard/ns#" 
                             rdf:resource="http://www.boogdesign.com/"/>
  </rdf:Description>

Bạn có thể sử dụng chương trình đại lý GRDDL của W3C để cung cấp cho bạn một phiên bản RDF của trang của bạn bằng cách liên kết tới http://www.w3.org/2007/08/grddl/?docAddr=[our url]&output=rdfxml. Sau đó, bạn có thể sử dụng URI này cho bất kỳ ứng dụng Web Ngữ nghĩa khác nào yêu cầu RDF làm đầu vào.

Các vi định dạng trong thế giới thực

Các vi định dạng không phải là một ứng dụng lý thuyết của các công nghệ Web Ngữ nghĩa. Chúng đã được nhắm tới ngay từ khi bắt đầu các ứng dụng thực tế và có ích. Yahoo! đã công nhận điều này với động thái gần đây của họ nhằm hỗ trợ các vi định dạng để cung cấp các kết quả tìm kiếm tốt hơn. Nội dung được vi định dạng trên trang web của bạn sẽ làm tăng thêm tổng số lưu lượng có liên quan trực tiếp mà bạn nhận được từ Yahoo! bởi vì nó làm cho các mục nhập vào của bạn trong các kết quả tìm kiếm có ích hơn cho người tìm kiếm — nhiều khả năng là dữ liệu có liên quan đến những thứ mà họ đang tìm kiếm. Không thể chứng tỏ điều này bằng ví dụ SemanticBook trong hướng dẫn này vì bạn sẽ cần phải làm cho nó được liệt kê trên các công cụ tìm kiếm với một số thuật ngữ tìm kiếm có liên quan, mà đây lại là một hướng dẫn khác. Bạn có thể làm một số thứ có ích ngay bây giờ với vi định dạng hCard trên các trang người dùng của bạn.

Các trình duyệt hỗ trợ các vi định dạng

Từ lúc khởi đầu, Firefox 3.0 (hiện đang là bản beta) đã lên kế hoạch để hỗ trợ nguyên gốc các hành động của người dùng với các vi định dạng. Bạn có thể thấy một số thứ đã được lên kế hoạch dựa vào Thiết kế trải nghiệm người dùng (User Experience Design) trong blog của Mozilla (xem phần Tài nguyên). Thật tiếc là, các sức ép về thời gian làm cho các thay đổi giao diện người dùng (UI) sẽ không được triển khai trong Firefox 3.0; tuy nhiên, các vi định dạng là một phần nguyên gốc của nền tảng Firefox cơ bản trong Firefox 3.0 và bạn có thể sử dụng chúng thông qua một API nếu bạn là một nhà phát triển phần mở rộng. Một khi Firefox 3.0 được phát hành, có khả năng là các phần mở rộng hiện có, ở nơi thích hợp, sẽ bắt đầu lợi dụng các vi định dạng thông qua API này. Bản beta của Microsoft® Internet Explorer 8 gần đây đã bao gồm sự hỗ trợ cho "Activities" (Các hoạt động) và "WebSlices" (Các lát Web), bao trùm các lĩnh vực với các mục rất gần với các trường hợp sử dụng của các vi định dạng phổ biến. Thật không may, mặc dù WebSlices có dựa lỏng lẻo vào các vi định dạng, cả hai mục này đều không được triển khai thực hiện dựa theo các tiêu chuẩn vi định dạng hiện có. Vào lúc này, Safari vẫn chưa có tin tức nào về sự hỗ trợ nguyên gốc cho các vi định dạng, nhưng hiện có sẵn một trình cắm thêm (xem phần Tài nguyên).

Mặc dù các trình duyệt hiện nay không có nhiều sự hỗ trợ nguyên gốc cho các vi định dạng, nhưng các phần mở rộng đã cho phép bạn làm các nhiệm vụ thực tế với nội dung được vi định dạng (microformatted) mà bạn gặp hiện nay. Phần mở rộng Toán tử (Operator Extension) cho Firefox là một ví dụ tốt (xem phần Tài nguyên). Bạn có thể sử dụng nó hoặc là một thanh công cụ hoặc là một biểu tượng trên thanh trạng thái và, khi nó phát hiện nội dung được vi định dạng trên trang hiện tại, nó sẽ hiển thị các hành động thích hợp.

Bạn có thể xem đánh dấu hCard của mình trong SemanticBook kích hoạt các chức năng có ích cho những người có phần mở rộng Toán tử đã cài đặt như thế nào. Họ nhập khẩu các chi tiết liên hệ trực tiếp vào các sổ địa chỉ của mình mà không phải gõ lại hoặc sao chép và dán các chi tiết. Trong Hình 4, trình duyệt Firefox trỏ tới một trang người dùng trên ứng dụng SemanticBook và Toán tử (Operator) phát hiện ra hCard của người dùng có tên tưởng tượng là test_user1. Biểu tượng Operator (Biểu tượng Toấn tử, dấu cộng xanh) trong thanh trạng thái sáng lên, cho biết sự có mặt của các vi định dạng. Khi nhấn chuột vào biểu tượng này một số hoạt động có thể sẽ hiện ra: xuất khẩu (dưới dạng vCard); tìm trong một dịch vụ bản đồ Web; hoặc trực tiếp thêm vào sổ địa chỉ trực tuyến của tôi. Nếu bạn chọn Export Contact (Xuất khẩu liên hệ), bạn sẽ thấy một hộp thoại để tải về hCard.vcf, là thông tin xuất khẩu của người dùng đó (trong trường hợp này là người dùng test_user1); nếu bạn chọn mở nó bằng Yahoo! Contacts (Danh bạ Yahoo!), các chi tiết từ trang người dùng của bạn trong SemanticBook sẽ tự động được thêm vào sổ địa chỉ của bạn.

Hình 4. Các hoạt động trong Operator Extension của Firefox cho hCard được tạo ra từ phpBB
Các hoạt động trong Operator Extension của Firefox cho hCard được tạo ra từ phpBB

hCardMapper (được hiển thị trong Hình 5) là một ví dụ khác cho phép bạn sử dụng các vi định dạng (xem phần Tài nguyên để có một liên kết). Nó tự động hóa quá trình điền vào các biểu mẫu bằng cách điền trực tiếp vào các trường từ hCard của bạn. Tính năng tiết kiệm thời gian rõ ràng này phụ thuộc vào nhà cung cấp biểu mẫu tạo cấu hình mọi thứ chính xác. Chủ sở hữu biểu mẫu cần cấu hình kịch bản lệnh bằng cách liên kết các ID của các phần tử biểu mẫu với các phần tử khác nhau được định nghĩa trong hCard, sau đó kịch bản lệnh này sẽ tự động điền vào biểu mẫu với hCard tại URI mà bạn cung cấp cho nó. Tất nhiên, URI đã cung cấp có thể là trang lược tả của bạn trên SemanticBook.

Hình 5. hCardMapper đang hoạt động
hCardMapper đang hoạt động

Bây giờ bạn đã xem chi tiết về các vi định dạng thông qua việc triển khai thực hiện các hCard. Bạn đã sẵn sàng để chuyển đến tầm nhìn của W3C về Web Ngữ nghĩa dựa trên việc biểu diễn tri thức khi sử dụng RDF. Bạn sẽ xem xét điều này trong bối cảnh của RDFa, một phương thức nhúng RDF vào các tài liệu XHTML và FOAF, một tiêu chuẩn để biểu diễn các sự kiện về con người và các mối quan hệ bằng RDF (xem diễn đàn Khám phá các công nghệ Web Ngữ nghĩa) để đăng lên bất kỳ câu hỏi nào mà bạn có thể có.


Biểu diễn mạng của người dùng bằng FOAF

Trang mạng xã hội của bạn sẽ không được sử dụng nhiều nếu nó không có khả năng nối mạng cho những người dùng — thêm các bạn bè và xem các bạn bè của họ và v.v.. Để làm điều này, bạn sẽ sử dụng FOAF của công nghệ Web Ngữ nghĩa để đánh dấu các danh sách bạn bè của những người dùng của bạn. FOAF cung cấp một số lợi ích cho bạn và những người dùng của bạn: danh sách bạn bè của họ dễ hiểu với các trình thu thập dữ liệu Web Ngữ nghĩa và các ứng dụng Web Ngữ nghĩa khác và bạn không cần viết một API riêng để cho các ứng dụng web khác truy cập vào dữ liệu bạn bè. Một hệ quả của việc này là dữ liệu của những người dùng trở nên di động. Họ có thể dễ dàng trích ra danh sách bạn bè của họ từ SemanticBook và sử dụng nó trên các trang web mạng xã hội khác (xem phần Tài nguyên để biết về dự án Tính di động dữ liệu). Cuối cùng, FOAF cho phép một điều gì đó mà không có trang Web mạng xã hộ3i đơn lẻ nào khác có được, đó là một danh sách bạn bè phân tán. Vì bên trong FOAF, một URI tham chiếu các bạn bè của bạn và URI tham chiếu chúng có thể tự trả về FOAF, một ứng dụng Web Ngữ nghĩa có thể đi theo đường dẫn thông qua các tệp FOAF của các bạn bè của bạn, tới các bạn bè của các bạn bè của bạn và cứ tiếp tục như thế. Các URI có thể tham khảo bất kỳ vị trí nào trên web, vì vậy mạng của bạn có thể mở rộng trên Internet.

FOAF cho những người dùng SemanticBook

Vậy là, khi những người dùng của bạn duyệt đến trang của một người dùng khác, họ sẽ thấy một liên kết Add Friend (Thêm bạn bè). Khi một người dùng nhấn chuột vào Add Friend để chèn một hàng vào bảng sb_friends của bạn trong MySQL. Sau đó, trên trang lược tả của họ, bạn đưa ra một danh sách các bạn bè của người dùng được đánh dấu bằng FOAF, sử dụng RDFa. Khi họ thêm các bạn bè vào danh sách cho phép FOAF của mình trên SemanticBook, họ sẽ có thể lợi dụng các tính năng được mô tả trong phần trước— dữ liệu của họ sẽ có sẵn theo một định dạng tiêu chuẩn, di động để dùng trực tiếp trong các trang web cho phép FOAF khác mà họ duyệt qua.

Để trình diễn xem điều này hoạt động như thế nào, trước tiên hãy kiểm tra xem FOAF trông giống cái gì trong RDF, rồi bạn sẽ thấy cách tạo đánh dấu để biểu diễn RDF đó trên trang người dùng SemanticBook của bạn với RDFa. Sau đó bạn sẽ sử dụng W3C RDFa Distiller để trích RDF ra khỏi trang của bạn để chứng tỏ rằng bạn đã làm đúng. Cuối cùng, bạn sẽ xem xét cách FOAF trong RDFa và vi định dạng hCard có thể chia sẻ chung cách đánh dấu như nhau sao cho bạn không phải lặp lại thông tin trên trang người dùng của mình.

FOAF là viết tắt của "Friend Of A Friend - Bạn của Một người bạn". Như bạn có thể đoán ra, đó là một cách để mô tả mọi người và các mối quan hệ của họ. Mặc dù nó có thể được sử dụng để mô tả các cá nhân theo một cách tương tự như hCard, nhưng với các mục đích của hướng dẫn này, mối quan tâm chính của bạn về FOAF là các khía cạnh về mối quan hệ.

Liên kết những người dùng của bạn với nhau bằng FOAF

Vùng tên FOAF thêm nhiều phần tử để mô tả mọi người và các mối quan hệ của họ. Liệt kê 8 cho thấy một tệp FOAF ví dụ cho một cá nhân là foaf:Person. Bạn đã liên kết vùng tên FOAF, được định nghĩa bởi URI http://xmlns.com/foaf/0.1/, với foaf, sao cho tất cả các phần tử FOAF của bạn bắt đầu với foaf. foaf:Person có ba đặc tính: foaf:Name, foaf:homepagefoaf:knows. Đặc tính cuối cùng này cho phép bạn định nghĩa các mối quan hệ, bằng cách lồng nhau, giống như bạn đã làm với hCard trước đó; trong trường hợp này, hai người trong đặc tính foaf:knows của Rob là Alice và Bob.

Liệt kê 8. Một ví dụ về FOAF
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:foaf="http://xmlns.com/foaf/0.1/">
  <foaf:Person rdf:about="#me">
    <foaf:name>Rob</foaf:name>
    <foaf:homepage rdf:resource="http://url/semanticbook/rob" />
    <foaf:knows>
      <foaf:Person>
        <foaf:name>Alice</foaf:name>
        <foaf:homepage rdf:resource="http://url/semanticbook/alice" />
      </foaf:Person>
      <foaf:Person>
        <foaf:name>Bob</foaf:name>
        <foaf:homepage rdf:resource="http://url/semanticbook/bob" />
      </foaf:Person>
    </foaf:knows>
  </foaf:Person>
</rdf:RDF>

Mặc dù hơi dài dòng một chút, cách biểu diễn này là khá dễ hiểu, nhưng không phải là thứ gì đó mà bạn mong đợi để hiển thị cho một người dùng bình thường. Mặc dù bạn có thể cung cấp các phiên bản RDF của tất cả nội dung của bạn để đạt được những lợi ích nhờ liên kết đến Web Ngữ nghĩa, bạn không thực sự muốn cung cấp các phiên bản HTML và RDF riêng rẽ. Ngay cả khi mọi thứ đã được tạo ra từ các khuôn mẫu, một nhầm lẫn nào đó có thể dễ dàng làm cho hai phiên bản của bạn mất đồng bộ. Đây nơi mà RDFa có mặt, nó cho phép bạn trực tiếp thêm RDF vào đánh dấu XHTML trong SemanticBook.

Biểu diễn các mối quan hệ FOAF bằng RDFa

Bạn đã thấy trong Liệt kê 45 rằng bạn có thể biểu diễn vCard bằng HTML khi sử dụng định dạng hCard. Bây giờ bạn sẽ biểu diễn FOAF bằng XHTML khi sử dụng RDFa. Điều này có nghĩa là bạn có thể bao gồm thêm đánh dấu vào trong trang user.php hiện có của bạn. Như đã được thảo luận trong phần trước, làm thế dễ bảo trì hơn so với tạo một phiên bản RDF riêng biệt của các dữ liệu đã có trên trang user.php.

RDFa là một phần mở rộng cho XHTML, cho phép bạn nhúng thông tin RDF. Lưu ý rằng nó phải là XHTML chứ không phải là HTML, vì RDFa dựa trên cơ sở XML có thể mở rộng được của XHTML. RDFa mở rộng XHTML với một số thuộc tính bổ sung và làm cho việc sử dụng một số thuộc tính đã có thành chính quy hơn. Các thuộc tính XHTML chủ yếu hiện có là rel, rev, name, content, href và src. Các thuộc tính bổ sung thêm vào RDFa là about, property (đặc tính), resource (tài nguyên), datatype (kiểu dữ liệu) và typeof. Bạn có thể tra tìm các định nghĩa của các thuộc tính này trong tài liệu "RDFa trong XHTML: Cú pháp và Xử lý", xem phần Tài nguyên, nhưng chúng sẽ dễ hiểu hơn nhiều nếu bạn có một ví dụ để xem xét, vì vậy hãy xây dựng một ví dụ ngay bây giờ. Một khi bạn thấy kết quả cuối cùng của XHTML sẽ trông như thế nào, thì sẽ khá dễ dàng điều chỉnh trang user.php để tạo ra nó.

Để sử dụng các thuộc tính RDFa vừa nói trên, bạn phải sử dụng một DTD cụ thể và các vùng tên cho tài liệu của mình, mà bạn có thể thấy trong Liệt kê 9.

Liệt kê 9. Tiêu đề của tài liệu cho XHTML + RDFa
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
    "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:foaf="http://xmlns.com/foaf/0.1/">

Liệt kê 10 cho thấy tệp FOAF ví dụ của bạn trong Liệt kê 8 được đánh dấu bằng cách sử dụng RDFa trong tài liệu XHTML của bạn. Đây sẽ giống như kết quả đầu ra của trang user.php trong SemanticBook. Ngay lập tức, bạn có thể thấy rằng nó rất giống nhau, với cấu trúc lồng nhau. Các phần tử có vùng tên FOAF bây giờ ở trong các thuộc tính của các phần tử XHTML tiêu chuẩn và sự biểu diễn này là gọn hơn so với RDF ban đầu vì bạn có thể gộp chung một số phần tử trong RDF vào trong một phần tử XHTML duy nhất, nếu có thể nói như vậy.

Liệt kê 10. FOAF trong RDFa
<div typeof="foaf:Person">
   <a property="foaf:name" rel="foaf:homepage" 
              href="http://url/semanticbook/rob">Rob</a>
   <div class="social-network" about="#me" rel="foaf:knows">
        <ul>
           <li typeof="foaf:Person">
             <a property="foaf:name" rel="foaf:homepage" 
               href="http://url/semanticbook/alice">Alice</a>
           </li>
           <li typeof="foaf:Person">
             <a property="foaf:name" rel="foaf:homepage" 
               href="http://url/semanticbook/bob">Bob</a>
           </li>
        </ul>
    </div>
</div>

Trong Liệt kê 10, bạn đã sử dụng 5 thuộc tính có ý nghĩa trong RDFa và chúng được liệt kê trong Bảng 2.

Bảng 2. Ý nghĩa của các thuộc tính trong RDFa
Thuộc tínhRDFa
typeofThuộc tính này là tương đương với rdf:type trong RDF. Thuộc tính cho biết lớp các sự vật được biểu diễn bởi đối tượng chứa trong nó.
propertyMột thuộc tính định nghĩa một mối quan hệ giữa một sự vật (chứa thuộc tính này) và một đoạn văn bản bằng chữ.
relThuộc tính rel định nghĩa một mối quan hệ giữa sự vật này và sự vật khác.
aboutThuộc tính này tương đương với rdf:subject trong RDF. Nó chỉ rõ chủ thể của các con cháu của phần tử đang xét.
hrefThuộc tính href dùng với rel để trỏ tới sự vật thực tế mà rel định nghĩa mối quan hệ đang xét. Thuộc tính này là tương đương với rdf:subject trong RDF.

Để kiểm tra RDFa của bạn, hãy gửi nó tới W3C RDFa Distiller. Liệt kê 11 cho thấy kết quả đầu ra. Để tạo ra kết quả này, tôi dán URI của trang rob của mình trong SemanticBook vào trường trên trang RDFa Distiller (mà bạn sẽ tìm thấy một liên kết đến trang đó trong phần Tài nguyên). Rõ ràng để trang này làm việc cho bạn, bạn cần thiết lập ứng dụng SemanticBook trên một trang web có thể truy cập rộng rãi. Bạn có thể xem ví dụ của tôi tại http://www.boogdesign.com/semanticbook. Khi bạn so sánh nó với nơi mà bạn đã bắt đầu trong Liệt kê 8, bạn chỉ tìm thấy một vài sự khác biệt cú pháp rất nhỏ và một sự thay đổi thứ tự không đáng kể, nhưng rõ ràng là bạn không mất bất cứ thứ gì do việc lựa chọn sử dụng RDFa.

Liệt kê 11. RDF được tạo ra từ đánh dấu RDFa của bạn. So sánh với Liệt kê 8
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
  xmlns:foaf="http://xmlns.com/foaf/0.1/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about="http://url/semanticbook/network/rob#me">
    <foaf:knows>
      <foaf:Person>
        <foaf:homepage rdf:resource="http://url/semanticbook/bob"/>
        <foaf:name>Bob</foaf:name>
      </foaf:Person>
    </foaf:knows>
    <foaf:knows>
      <foaf:Person>
        <foaf:homepage rdf:resource="http://url/semanticbook/alice"/>
        <foaf:name>Alice</foaf:name>
      </foaf:Person>
    </foaf:knows>
  </rdf:Description>
  <foaf:Person>
    <foaf:homepage rdf:resource="http://url/semanticbook/rob"/>
    <foaf:name>Rob</foaf:name>
  </foaf:Person>
</rdf:RDF>

Kết hợp FOAF với hCard

Các vi định dạng hay RDFa?

Nếu bạn đã xem qua một số các liên kết FOAF trong phần Tài nguyên, bạn có thể tự hỏi tại sao không sử dụng FOAF đó thay cho hCard để biểu diễn thông tin cá nhân. Câu trả lời trong trường hợp này là: Đây là một bài hướng dẫn và tôi muốn trình bày cả hai, cả vi định dạng lẫn RDFa. Khi mà bạn có thể chọn giữa các vi định dạng và biểu diễn dựa trên RDFa, bạn nên sử dụng cái nào?

  • Ngay từ đầu, các vi định dạng được thiết kế để làm việc với đánh dấu hiện có nhằm tăng thêm giá trị ngữ nghĩa cho các trường hợp sử dụng cụ thể. Nếu bạn có dữ liệu trên một trang web hiện tại mà bạn muốn làm cho nó có ích hơn cho những người dùng của mình, thông thường điều dễ nhất là áp dụng vi định dạng cho nó.
  • RDFa có cấu trúc hơn, có mối quan hệ với các công nghệ khác của Web Ngữ nghĩa được định nghĩa rõ ràng, và tuân theo việc xác nhận hợp lệ tự động dễ hơn nhiều. Nếu ứng dụng của bạn sẽ thực hiện suy luận hình thức hoặc phân tán, hoặc nếu nó sẽ xử lý dữ liệu tạp nham hơn, một phần nằm ngoài các trường hợp sử dụng vi định dạng được định nghĩa chặt chẽ, thì RDFa có lẽ là một lựa chọn tốt hơn.

Tuy nhiên, giữa hai thái cực nói trên là một vùng lựa chọn ở giữa khá rộng rãi mà chủ yếu được chọn theo sở thích cá nhân. Thông thường, như được thảo luận ở gần cuối của hướng dẫn này, bạn có thể sử dụng cả hai cách tiếp cận cùng một lúc.

Thực sự bạn không muốn có một trang hoàn toàn riêng biệt cho mạng những người dùng của mình. Sẽ thật tốt khi hiển thị các mạng của họ như là một phần của các trang người dùng của họ. Sau đó, các trình thu thập dữ liệu Web Ngữ nghĩa hiểu FOAF có thể đi theo mạng của các bạn bè từ trang này đến trang khác, kể cả đi tới các trang web khác nếu một phiên bản tương lai của SemanticBook cho phép thêm vào những người dùng có các URI từ bên ngoài làm bạn bè. Có khả năng kết hợp đánh dấu hCard và FOAF trên cùng một trang. Các trang người dùng của bạn có thể chứa đánh dấu cần thiết cho FOAF và, vì FOAF sử dụng các trang bạn bè của bạn trên SemanticBook để biểu diễn chúng, bạn sẽ kết thúc bằng các tham chiếu trong FOAF trên trang của bạn đang liên kết đến FOAF bạn bè của bạn trên trang của họ. Liệt kê 12 cho thấy cách bạn kết hợp DOCTYPE của RDFa với lược tả cần thiết cho phép chuyển đổi GRDDL của hCard trong trang user.php của ứng dụng SemanticBook. Để giữ cho mọi thứ đơn giản, tôi hiển thị kết quả đầu ra HTML chứ không phải là mã nguồn PHP, nhưng nếu bạn nhìn vào tệp user.php, bạn sẽ thấy không yêu cầu thứ gì quá khó.

Liệt kê 12. Các tiêu đề tài liệu cho FOAF được kết hợp với hCard và GRDDL
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
    "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:foaf="http://xmlns.com/foaf/0.1/">
<head profile="http://www.w3.org/2003/g/data-view http://www.w3.org/2006/03/hcard">
    <link rel="transformation" href="http://www.w3.org/2006/vcard/hcard2rdf.xsl" />

Bạn không muốn lặp lại những chỗ hCard và FOAF có giá trị như nhau, do đó, chỉ cần kết hợp mọi thứ vào trong cùng phần tử HTML như trong Liệt kê 13.

Liệt kê 13. Các phần tử chia sẻ hCard và FOAF
<div class="vcard" typeof="foaf:Person">
<h1><a class="url fn nickname" property="foaf:name" rel="foaf:homepage"
 href="http://url/semanticbook/network/rob#me">robertc</a></h1>

Bạn không cần bao gồm hai lần tên của người dùng trên trang này, vì vậy bạn có thể sử dụng cùng một phần tử cho thuộc tính fn của hCard và cho foaf:name. Đừng Lặp lại Chính mình là cách thực hành tốt nhất rất quen thuộc trong giới lập trình mà bạn đang thích nghi với cách đánh dấu SemanticBook của bạn.

Sau đó, bạn có thể bao gồm phần tử foaf:knows bất cứ ở đâu trong cùng một phần tử div, hãy xem kết quả cuối cùng trong Hình 6. Toàn bộ tài liệu sẽ là hợp lệ nhưng, nếu bạn thử với các mã này, bạn có thể sẽ thấy một cảnh báo về kiểu tài liệu MIME là text/html. Kiểu MIME đúng phải là application/xhtml+xml. Thật tiếc là, Internet Explorer không đáp ứng tốt khi phục vụ các tài liệu kiểu này. Vì hầu hết các trình duyệt khác xử lý trang này tốt như nhau, nên bạn sẽ cho qua cảnh báo đó trong tình huống này.

Hình 6. Toàn bộ trang người dùng
Toàn bộ trang người dùng

Nhưng nó có lợi ích gì?

Lợi ích chính cho những người dùng của bạn khi đánh dấu danh sách bạn bè của họ bằng RDFa/FOAF là nó làm cho thông tin đó có thể sử dụng được bên ngoài ứng dụng xã hội của bạn mà không cần làm thêm bất cứ việc gì nữa. Hãy tưởng tượng xem nếu thay vì thế bạn phải viết một thường trình để xuất khẩu hoặc một số loại API, hoặc là những người dùng của bạn phải tự mình trích ra dữ liệu của họ, hoặc là các nhà phát triển web tại một trang web khác có thể phải viết một số chức năng trong trang web của họ để truy cập API của bạn. Điều này với bạn dường như cũng dễ thực hiện thôi, đúng như những gì mà bạn đã làm trong hướng dẫn này, nhưng có một số nhược điểm.

  • Đầu tiên, trừ khi bạn đã có một mạng xã hội lớn, ít có khả năng các nhà phát triển các trang khác sẽ dành nhiều thời gian để ghép nối vào API của bạn hoặc tìm hiểu định dạng tệp xuất khẩu của bạn. Với RDFa và FOAF, các trang web của bạn đã trình bày dữ liệu theo một định dạng tiêu chuẩn.
  • Thứ hai, một nhân tố chính của Web Ngữ nghĩa là tính chất phân tán của nó. Mặc dù tất cả các URI trong ví dụ của bạn chỉ tham chiếu tài nguyên trong trang đó, nhưng chúng có thể trỏ đến bất cứ nơi nào trên Internet. Điều này có nghĩa là, không giống như các mạng xã hội không–theo Ngữ nghĩa, nơi mà tất cả bạn bè của bạn cũng phải là những người dùng, những người dùng có thể thêm hầu như bất cứ ai làm một người bạn, có nghĩa là họ có nhiều khả năng để tiếp tục sử dụng trang của bạn ngay cả khi không phải tất cả bạn bè của họ tham gia.

Một số trang web lớn đã tạo sẵn cho mạng xã hội của những người dùng của họ bằng FOAF, ví dụ như LiveJournal. Ngoài ra, nhiều blog phổ biến và các công cụ cổng thông tin có các trình cắm thêm FOAF cộng với một số lượng lớn các chủ blog (blogger) đã viết mã danh sách blog ưa thích (blogroll) của họ theo định dạng FOAF. Bạn có thể liên kết FOAF trên SemanticBook vào bất kỳ các nguồn FOAF hiện có này bằng cách bao gồm URI của một trong các trang người dùng của bạn.


Phần tóm tắt

Tóm lược

Trong hướng dẫn này, bạn đã có một chuyến du lịch ngắn, xem qua một số tiêu chuẩn Web Ngữ nghĩa và xem xét tại sao bạn lại muốn triển khai thực hiện chúng trên trang web của mình. Bạn bắt đầu với các URI và cách chuyển tải thông tin ngữ nghĩa trực tiếp cùng với chúng sau khi tách chúng ra khỏi các kịch bản lệnh tạo trang web cơ bản của bạn bằng cách sử dụng mod_rewrite trong Apache. Tiếp theo, bạn đã xem xét hai cách tiếp cận để bổ sung giá trị ngữ nghĩa vào các trang web của mình: các vi định dạng và RDFa. Bạn đã thấy cách đánh dấu thông tin liên hệ của những người dùng của bạn bằng vi định dạng hCard và để áp dụng vi định dạng đó cho dữ liệu người dùng trong một hệ thống hiện có là dễ như thế nào. Sau đó, bạn đã thấy thông tin đó đã có ích cho những người dùng như thế nào với các trình duyệt nhận biết vi định dạng, cũng như cách bạn có thể trình bày nó như là một tài nguyên RDF khi sử dụng các công cụ GRDDL tiêu chuẩn của W3C. Cuối cùng, bạn đã xem xét FOAF dưới dạng RDF nguyên gốc của nó, đã áp dụng nó vào đánh dấu trang của bạn bằng cách sử dụng RDFa, sau đó chứng tỏ bạn đã thực hiện đúng bằng cách sử dụng một công cụ W3C tiêu chuẩn để biến nó trở lại thành RDF một lần nữa. Bạn đã kết thúc bằng một số cuộc thảo luận về những lợi ích mà FOAF đã cho phép: dữ liệu người dùng di động cũng như khả năng của các mạng xã hội phân tán.

Bây giờ chắc là bạn có đủ kiến thức để triển khai thực hiện một số tiêu chuẩn Web Ngữ nghĩa trên Web dự án tiếp theo của mình. Mặc dù bạn chỉ mới xem xét hCard và FOAF thôi, nhưng các nguyên tắc tương tự cũng áp dụng cho các vi định dạng và các cách biểu diễn khác, vì vậy chắc là bạn có khả năng thích ứng với chúng khá nhanh.


Tải về

Mô tảTênKích thước
Example source codesemanticbook.tar.gz31KB

Tài nguyên

Học tập

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

Thảo luận

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=Nguồn mở
ArticleID=828784
ArticleTitle=Triển khai các tiêu chuẩn Web Ngữ nghĩa trong trang web của bạn
publish-date=08032012