简介大型组织往往会投资开发那些大型的、集中的、标准化的 IT 系统,例如整体 CMS,然后竭尽所能让所有人都能够使用这样的系统。遗憾的是,保证所有人按照正确的方式使用系统是一项艰巨的挑战。投资开发一刀切的方法很难交付承诺的生产力收益。标准化或者控制松散耦合的组织尤为艰难,因为这种组织中的团队很少交互,往往分别制定决策。松散耦合的组织示例包括:
在本系列的 使 HTML5 微数据发挥作用,第 1 部分:在微数据之上使用 jQuery 中,我们学习了如何在微数据的基础之上使用通用脚本。我们编写了一个 HTML 片段,提供交互式事件地图,并使 Google、Bing 和 Yahoo 能够使用 Rich Snippet 在搜索结果中更好地显示您的页面。 常用缩写
在本文中,您将学习如何利用微数据,支持协作小组轻松将其站点挂接到一个集中的小组站点上,并共享内容。通过商定在 HTML 标记中设置的一组属性,松散耦合的组织便可维护其信息系统的独立性,同时仍然能够构建联合项目。 场景:为 Drupal 创建一个分散的文档系统许多开放源码项目都难以为其软件维护健壮的、最新的文档。与此同时,项目的贡献者利用博客文章分享具体的技术说明,这些博客文章往往在 Planet 中聚合。Planet 就是一种博客聚合器,能够获取选定作者的博客文章(请参见 参考资料 部分)。 Planet 是参与社区最新活动和讨论的有效方法,但无法发挥作为协作技术的潜力。它难以筛选 Planet 文章的存档,因为其中包含大量原始结构化数据。即使聚合文章确实包含有用的结构化数据(如标签),来自不同站点的文章往往也不会共享相同的术语,它们或许会使用术语的不同拼写方法。因此,无法有效地对文章进行排序。 通过创建获取博客文章及有关文章的额外重要信息的聚合器,可以解决这样的问题。可以使用聚合器来浏览文章,并将其放置在项目主站点内的相关位置。 假想的系统将归档 Drupal。我们的博客文章中充分说明了某些广泛应用的子系统(在 Drupal 中称为模块),但 Drupal.org 手册中缺少良好的文档。我们的目标在于将 Planet 中的出色文档转入 Drupal.org 便捷的可搜索结构之中。 规划系统第一项任务是确定希望将博客文章中的哪些信息传递到中心归档系统。例如,您希望指明该文章讨论的是哪些模块。通常情况下,模块的各主要版本往往会采用不同的工作方式,因此最好指明教程是否与特定的模块版本相关。 Drupal 中有多种角色,从内容编辑到后台开发。指明哪些角色认为文章有帮助是非常有价值的。图 1 中的文档记录显示了标题、读者和相关模块。 图 1. 示例文档记录![]() 该场景中的数据共享需求非常简单。您仅需将源博客文章中的以下信息传递到站点即可:
标题、摘要和 URL 已经通过 RSS 实现了结构化的格式。您需要找到一种解决方案,获取有关目标读者和模块的结构化数据。为此,可以使用微数据。开始使用微数据之前,您需要设置测试使用的源和目标站点。 源站点为了解析和处理传入的文章,您需要使用 Microdata Import 模块。该模块接收一个源 URL,因此源必须能够输出 RSS 或者 Atom。 可以使用 Drupal 这样的 CMS,其中包含的工具能够自动化放置微数据,您也可以选择使用另外一个博客系统(只要该系统不会删除微数据属性即可)。对于 Microdata Import 模块,所导入的每个项目都必须与一个源项相关联,保证每份教程都使用自己的页面。 该场景使用托管的博客平台 Blogger 和 Drupal Gardens。您可以设置自己的源,或者使用以下源: 所有必要的信息均直接处于 HTML 标记之中,因此您可以为源使用任何工具。HTML 中的微数据作为标准、只读的 API,与生成它的后台代码无关。 设置目标站点有了用于测试的源之后,即可开始设置聚合站点。首先是基本设置:
配置在获取源时需要使用的导入设置:
图 4. 从源映射到目标![]() 为了进行测试,您可以导入相关内容:
图 5. 从源中导入的节点![]() 转到主页,查看已经导入的文章。由于已经导入了完整的文章,因此您可能无法清除地认识到下面要做些什么。但由于您并未保留原始文章结构,因此现在还无法根据目标读者或者模块筛选文章。此时就会用到微数据。 图 6. 已经导入的一个节点![]() 标记源内容以便使用它们既然已经能够正确获取源,下面就可以开始将微数据添加到标记中,并通过文章引入微数据。清单 1 展示了一篇博客文章的基本标记。 清单 1. 一篇文章的基本 HTML 标记<h2>Building modules on top of SPARQL Views</h2> <div> <p>This video demonstrates how you can build a module that installs a View powered by a SPARQL query whenever it is enabled.</p> <b>Audience:</b> Developer <br /> <b>Modules:</b> <ul> <li>Views</li> <li>SPARQL Views</li> </ul> </div> 您需要指明该内容属于文章。该场景使用 Schema.org 词汇表标记文章,因为 Schema.org 中包含需要注释的大多数内容所需的术语(请参见 参考资料 部分)。只有在所有协作作者都同意的情况下,才应使用其他词汇表。[在 “结合使用 Drupal、HTML5 和微数据”(请参见 参考资料 部分)中,我更加深入地探讨了如何放置微数据。本文中介绍了如何手动添加微数据,如何利用 Microdata 模块自动化此过程。] 您需要从 RSS 源中获取标题,因此不必为标题使用标记。但标记标题能使其他用户更轻松地重用数据。您可以使用 清单 2. 为文章添加基本的微数据<h2>Building modules on top of SPARQL Views</h2> <div itemscope="" itemtype="http:///Article"> <meta itemprop="name" content="Building modules on top of SPARQL Views" /> <p itemprop="description">This video demonstrates how you can build a module that installs a View powered by a SPARQL query whenever it is enabled.</p> ... </div> 更新描述上面,我们已经使用微数据进行了标记,下面即可仅获取文本中的描述。这将从描述中排除目标读者和相关模块,这种做法非常好,稍后即可将这些信息纳入其自己的字段。将映射更改为使用微数据描述,而非 RSS 描述。
更新不仅会删除描述中您不需要的内容。还会对全部导入信息执行完整更新。如果对源文章的措辞做出了修改,新的措辞也会显示在这里。将更新功能配置为 Cron 定期运行,因此无需手动触发即可获得定期更新。这里可以看到 Feeds 系统的强大力量。它能实现打造有效的协作站点网络所必不可少的轻松而自动化的同步。 添加目标读者角色至此,您已经标记了所有文章共有的一些信息片段:标题和描述。在这一节中,您将转到场景特有的信息。此时有必要与协作团队配合工作,了解他们如何看待他们所提供的内容。信息应该反映协作人员的心理模式(而非遵照外部的理想做法)。 Drupal 社区已经定义了一组成熟的角色,表示为会议中的分工轨迹。Drupal Skill Map 项目将这些角色定义为:
您需要按照上述八个分组来表示文章的目标读者。遗憾的是,Schema.org 词汇表并没有目标读者的概念,因此您在处理
对于这个场景,我们将采用第一个选择,扩展 Schema.org。如果您正在手动放置微数据,请将 清单 3 复制粘贴到正文中。如果您正在使用 Drupal 自动在源站点中放置微数据,您可以在文章中创建一个 使用目标读者角色为将目标读者元素纳入使用站点的内容中,您需要为其创建一个内容类型字段,随后为该字段创建映射。
图 11. 包含目标读者的更新后节点(完整节点视图)![]() 添加相关模块可以证明,使用字符串足以按照文章的目标读者对文章进行分类。目标读者角色数量有限,而且不会频繁发生变化。如果出现变化,比如添加新角色,要求人们更新期目标读者字段设置并不是很困难。 但按照相关模块分类则截然不同。Drupal 拥有 14,000 个模块,大多数都有多个版本。至少这意味着 14,000 个不同的标签。标签的格式也是丰富多变的。此外,数以千计的模块维护者可能会随时更改其模块的名称。 为了引用模块,必须使用比字符串更加稳定的一些信息。一种不会经常发生变化的标识符就是 Drupal.org 中的模块 URL(例如,Views 模块的 http:///project/views)。可以使用它作为模块的一致标识符。 要添加模块的版本,您应添加模块项的一个属性。然而,对于这个场景,为各版本使用不同的 ID 更加容易。例如,要标识 Views 7.x-3.x,可以使用 URL 要为该值使用字符串而非 ID,可以使用微数据的 可见的内容将仍然是名称字符串。您不会用到它,但应该尽可能简化它,以便其他用户能够更容易地使用您的数据。将其公开为模块的 清单 3. 为相关模块添加微数据<p>Modules: <ul> <li itemprop="about" itemscope="" itemtype="http:///SoftwareApplication" itemid="http:///project/views/7/3"> <span itemprop="name">Views</span> </li> <li itemprop="about" itemscope="" itemtype="http:///SoftwareApplication" itemid="http:///project/sparql_views/7/2"> <span itemprop="name">SPARQL Views</span> </li> </ul> </p> 手动添加所有这些数据并不容易。如果有可能,您需要使用能提供帮助的工具。如果对源使用 Drupal,则可以使用 Web Taxonomy 模块,帮助内容作者标记其文章。利用 Web Taxonomy,Web 上的某种分类法将提供自动完成结果。选择术语时,应该将其导入您的站点。这意味着您必须访问 Drupal 项目词汇表中数以万计的术语,而不要将其存储在您的数据库中。添加新标签、更改标记时,自动完成字段有权访问这些数据,您甚至不必去考虑它们。 您还可以使用 Web Taxonomy 来使用相关模块,因此需要在目标站点上进行相应的配置。 为相关模块配置 Web Taxonomy下载并启用 Web Taxonomy。要配置 Web Taxonomy,您还需要使用一个模块来定义要使用哪种外部分类法,以及如何访问它。Drupal Full 项目的模块可以在 http:///sandbox/linclark/1363774 中获得。启用该模块时,一个新的 Drupal Full 项目词汇表将添加到您的站点中。 在目标和源站点中对 Web Taxonomy 进行相同的配置:
现在,您可以编辑教程并键入模块名称,测试字段。自动完成字段会提供建议,如 图 13 所示。如果选择其中的一项建议并保存教程,那么在查看该教程时就可以看到该标签。如果单击浏览术语页面,您为 ID 使用的 URL 会显示在该术语中。 图 13. Drupal Full 项目的 Web Taxonomy 自动完成![]() 如果您正在为源中的字段配置字段,请下载并启用提供的 Token 模块,更改指派给该术语的 使用相关模块至此,您已经得到并测试了 Web Taxonomy 字段。下面可以开始向其导入内容。
图 14. 使用相关模块更新节点![]() 现在,您已经完整地配置了导入设置,接下来就可以创建多个 Tutorial Import 节点,从多个站点导入数据。(创建一个 Tutorial import 节点,并添加 Source 2 源。)所导入的全部数据现在都采用 Drupal 能够理解的一种结构化方式。您可以轻松设置用户界面,从而浏览整个教程集合的各个方面。 超越 Microdata ImportMicrodata Import 有助于跨组织边界共享知识。然而,有时仅仅使用用 Microdata Import 还不够。Microdata Import 假设您正在导入的页面与您的站点中的页面之间存在一对一的关系。这适用于上述场景,因为您只需要使用教程页面本身提供的教程相关信息。 然而,在某些时候,您可能希望在不同的站点中发布内容的不同人员能够添加关于同一项目的一些信息。例如,如果一所大学内的某位教授兼任两个系中的职务,每个系都应能在其自己的站点中添加有关该教授的信息,而且无需与另外一个系协调。尽管您可以配置源代码和源导入器,通过 Microdata Import 来实现此操作,但还有更便捷的实现方法。 方法之一就是将微数据转为 RDF。HTML Data Task Force 目前正在最终敲定微数据映射到 RDF 的规范草案。这样的映射会使 MicrodataPHP 库等解析器能够以可靠的方式通过微数据标记的页面生成 RDF。Gregg Kellogg(负责领导制定映射规范的工作)开发的 RDF Distiller 工具已经实现了此映射。RDF distiller 是以 Ruby gem 的形式提供的。Kellogg 也在他的网站中发布了一个 API。 结束语确定如何跨组织和技术边界启用协作式 Web 内容创作是 IT 面临的主要挑战之一。通过在 HTML 本身之中嵌入内容的结构,微数据可以帮助松散耦合的人员和组织就联合项目进行协调。最重要的是,协作者可以为通用产品做出贡献,而且不会失去选择自己的框架的自由度,即便该框架仅仅是手动编码的 HTML 也是如此。 |
|