<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.jabbercn.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.jabbercn.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chruse+arroyo</id>
		<title>Jabber/XMPP中文翻译计划 - 用户贡献 [zh-cn]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.jabbercn.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chruse+arroyo"/>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Chruse_arroyo"/>
		<updated>2026-04-23T21:41:12Z</updated>
		<subtitle>用户贡献</subtitle>
		<generator>MediaWiki 1.18.2</generator>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0060</id>
		<title>XEP-0060</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0060"/>
				<updated>2011-12-12T18:03:44Z</updated>
		
		<summary type="html">&lt;p&gt;Chruse arroyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0060.html XEP-0060]&lt;br /&gt;
&lt;br /&gt;
'''XEP-0060: 发布-订阅'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP协议扩展来实现实现通用的 发布-订阅 功能。这个协议使 XMPP实体能在一个pubsub服务创建节点(主题)并发布信息到那些节点上；然后一个事件通知被广播到所有订阅了该节点的实体. PubSub因此坚持了经典的观察者设计模式，并可以作为广泛应用的服务基础，包括新闻提要，内容整合，富出席信息，地理位置，工作流系统，网络管理系统，以及任何其他需要事件通知的应用。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Millard, Peter Saint-Andre, Ralph Meijer&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0060#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.13rc6&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 进展中，2009-10-01&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''草案标准'''.对本协议的执行是被鼓励的,也适于布署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
===概览===&lt;br /&gt;
&lt;br /&gt;
本文定义的XMPP 发布-订阅 扩展提供了一个框架用于广泛的应用, 包括新闻摘要, 内容整合, 扩展的出席信息, 地理位置, 头像管理, 共享的标签, 拍卖和贸易系统, 工作流系统, 网络管理系统, NNTP网关, 资料管理, 以及任何其他需要事件通知的应用.&lt;br /&gt;
&lt;br /&gt;
这个技术使用了经典的 &amp;quot;发布-订阅&amp;quot; 或曰 &amp;quot;观察者&amp;quot; 设计模式: 一个人或应用发布信息, 同时一个事件通知 (包含或不包含有效载荷) 被广播到所有授权的订阅者. 通常, 发布者和订阅者之间的联系是由一个服务来调节的,这个服务接收发布请求，广播事件通知到订阅者, 并使有权限的实体能够管理被授权发布或订阅的人员或应用列表. 对于发布和订阅的焦点是一个节点 &amp;quot;node&amp;quot; ，它是发布者发送数据的目的地，也是订阅者接收通知的目的地. 节点也维护一个事件历史并提供其他服务以补充纯的 pubsub 模式.&lt;br /&gt;
&lt;br /&gt;
本文定义一个通用的协议，所有 pubsub 应用都能使用. 兼容的实现不需要实现这里定义的所有特性 (参见 [[XEP-0060#特性汇总|特性汇总]].)  其他协议可以定义 发布-订阅 的子集 &amp;quot;subsets&amp;quot; 或范本 &amp;quot;profiles&amp;quot; 用于特定的场合, 但是这些范本超过了本文的范围.&lt;br /&gt;
&lt;br /&gt;
===它如何工作===&lt;br /&gt;
&lt;br /&gt;
尽管本协议很大，因为它定义了很多方面的用例, 基本的思路是简单的:&lt;br /&gt;
&lt;br /&gt;
# 一个实体发布信息到一个 发布-订阅 服务上的一个节点.&lt;br /&gt;
# pubsub服务推送一个通知到所有被授权可以得知该发布信息的实体.&lt;br /&gt;
&lt;br /&gt;
可能最流行的 发布-订阅 功能的应用是内容联合, 它常见于和博客，新闻网站，以及其他互联网可用的经常更新的信息相关联的 RSS 和 Atom ([http://tools.ietf.org/html/rfc4287 RFC 4287] [[XEP-0060#附录G:备注|1]]) 种子. 设想一个&amp;lt;hamlet@denmark.lit&amp;gt;的博客发布例子. 当 Hamlet 写下一篇新博文, 他的博客软件发布该文到一个位于&amp;lt;pubsub.shakespeare.lit&amp;gt;的pubsub节点:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 发布者发布一篇新博文'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='pub1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所以那就是 发布-订阅 的发布 &amp;quot;pub&amp;quot; 部分.&lt;br /&gt;
&lt;br /&gt;
现在 pubsub 服务通知所有订阅者新博文:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务通知订阅者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bard@shakespeare.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这里是一个甚至更简单的例子: 一个临时的节点只发送通知而不带有效载荷:&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 一个临时通知'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='elsinore/doorbell'/&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
自然, 涉及的实体为了得到完整的 pubsub 功能可能需要完成其他用例 -- 例如, 发布者可能需要建立一个节点 (见 [[XEP-0060#新建节点|新建节点]]) 并且订阅者可能需要为通知报名(见  [[XEP-0060#订阅节点|订阅节点]]). 这些用例在本文的 the remainder 有完整的描述. (关于哪些特性是必需的，哪些是推荐的活可选的信息, 参考 [[XEP-0060#特性汇总|特性汇总]].)&lt;br /&gt;
&lt;br /&gt;
==术语表===&lt;br /&gt;
&lt;br /&gt;
以下术语用于本文中涉及的pubsub服务中的元素，对象，或动作.(注意: 本文的一些术语在正文中有更详细的解释.)&lt;br /&gt;
&lt;br /&gt;
'''表 1: 出版-订阅 术语'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!术语	!! 译文	!! 术语解释&lt;br /&gt;
|-&lt;br /&gt;
|Authorize Access Model	|| 授权访问模式	|| 一个节点访问模式,一个实体只能在所有者批准了订阅申请之后才能订阅(订阅申请被接受但是只是临时的),并且只有订阅者可以接收项目.&lt;br /&gt;
|-&lt;br /&gt;
|Address	|| 地址	|| (1) 一个 JID (定义在 XMPP Core [2])中, 或 (2) 一个JID和一个服务发现的联合 3 节点.&lt;br /&gt;
|-&lt;br /&gt;
|Collection Node	|| 集合节点	|| 一个节点类型，它包含很多节点 和/或 其他集合，但是不出版项目。集合使得多级节点结构成为可能&lt;br /&gt;
|-&lt;br /&gt;
|Entity	|| 实体	|| 一个以JID为地址的实体 (客户端，服务，应用程序等).&lt;br /&gt;
|-&lt;br /&gt;
|Event	|| 事件	|| 一个节点状态的一次变更&lt;br /&gt;
|-&lt;br /&gt;
|Instant Node	|| 即时节点 || 一个节点，它的NodeID由pubsub服务自动生成&lt;br /&gt;
|-&lt;br /&gt;
|Item	|| 条目 || 一个XML片段，它由一个节点发布, 从而生成一个事件&lt;br /&gt;
|-&lt;br /&gt;
|ItemID	|| 条目ID	||在一个一特定的节点中一个项目的唯一标识符&lt;br /&gt;
|-&lt;br /&gt;
|Leaf Node	|| 叶子节点	|| 一个节点类型，它仅包含已出版的项目. 它不是其他节点的一个容器&lt;br /&gt;
|-&lt;br /&gt;
|Node	|| 节点	|| 一个虚拟的位置，它的信息可以被发布，并且它的事件通知 和/或 有效载荷可以被接收（在其他pubsub系统中，可能被称为“topic”（主题））&lt;br /&gt;
|-&lt;br /&gt;
|NodeID	|| 节点ID	|| 在一个特定的pubsub服务中一个节点的唯一标识符，节点ID既由节点创建者提供，也由pubsub服务生成（如果节点创建者请求一个即时节点）。节点ID可以（MAY）有语义但是它的含义是可选的（OPTIONAL）.&lt;br /&gt;
|-&lt;br /&gt;
|Notification	|| 通知	|| 一个发送给订阅者的消息通知他们一个事件&lt;br /&gt;
|-&lt;br /&gt;
|Outcast	|| 被驱逐者	|| 一个不被允许订阅或出版一个节点的实体&lt;br /&gt;
|-&lt;br /&gt;
|Owner	|| 所有者	|| 一个节点的管理者，可能不止一个; 经常（但不是必要的）是节点创建者&lt;br /&gt;
|-&lt;br /&gt;
|Payload	|| 有效载荷	|| 和一个事件相关的所有数据而不仅是事件通知本身.&lt;br /&gt;
|-&lt;br /&gt;
|Open Access Model	|| 公开访问模式	|| 一个节点访问模式，任何实体可以不用申请订阅和接收项目&lt;br /&gt;
|-&lt;br /&gt;
|Personal Eventing	|| 私人事件	|| 出版-订阅的一个简化的子集，用于即时消息和出席信息应用程序，每个用户的JID是一个虚拟的pubsub服务； 细节请看 Personal Eventing via Pubsub [4].&lt;br /&gt;
|-&lt;br /&gt;
|Presence Access Model	|| 出席信息访问模式	|| 一个访问模式，任何订阅了所有者出席信息（以类型&amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;订阅）的实体，可以订阅一个节点并从节点接收项目；这个访问模式主要应用于即时消息系统。&lt;br /&gt;
|-&lt;br /&gt;
|Publisher	|| 出版者	|| 一个实体，被允许出版项目给一个节点&lt;br /&gt;
|-&lt;br /&gt;
|Pubsub Service	|| 出版服务	|| 一个遵循本文所定义的协议的 XMPP 服务器或组件&lt;br /&gt;
|-&lt;br /&gt;
|Roster Access Model	|| 好友访问模式	|| 一个节点访问模式，一个实体的出席信息被订阅了，只有特定的好友 组成员可以从节点订阅和接收项目；这个访问模式主要用于即时消息系统&lt;br /&gt;
|-&lt;br /&gt;
|Subscriber	|| 订阅者	|| 订阅了某个节点的一个实体&lt;br /&gt;
|-&lt;br /&gt;
|Whitelist Access Model	|| 白名单访问模式	|| 一个节点访问模式，一个实体只能被所有者为其添加订阅 ，并且只有订阅者可以接收项目&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
pubsub服务的需求可能是由终端用户的需要驱动的，也包括其他可能使用这项服务的组件或服务器。首先，一个用Jabber实现的pubsub服务必须（MUST）提供基本的特性来实现一个纯的 出版-订阅 模式:&lt;br /&gt;
&lt;br /&gt;
* 一个实体必须（MUST）能够发布事件给一个服务，这样所有某个节点的订阅者能接收到事件通知.&lt;br /&gt;
&lt;br /&gt;
* 一个实体必须（MUST）被允许和一个节点从属。被允许的从属关系包括所有者(owner)、出版者(publisher)、无(none)、排斥者(outcast)。具体实现的时候，必须（MUST）支持所有者和无的关联，可以（MAY）支持排斥者和出版者的从属关系。&lt;br /&gt;
&lt;br /&gt;
* 一个实体必须（MUST）被允许查询一个pubsub服务（或一个指定的节点）以确定那些服务提供了本文定义的哪些可选的特性。这个查询必须（MUST）使用服务发现(disco#info)协议.&lt;br /&gt;
&lt;br /&gt;
* 一个实体必须（MUST）被允许查询一个节点以确定关于那个节点的非特性相关的信息(比如, 服务发现中的 类别和类型（category+type）). 这个查询必须使用服务发现 (disco#info) 协议.&lt;br /&gt;
&lt;br /&gt;
一些基于Jabber的pubsub服务可能需要使用其他特性，但是这些特性是可选的（OPTIONAL）所以不是和本协议强制兼容的。无论如何，如果以下这些特性被实现了，它们必须（MUST）按照此处本协议的规定来保证兼容性。这些特性包括:&lt;br /&gt;
&lt;br /&gt;
* 一个服务可以（MAY）对一个节点缓存最近一次出版的项目（甚至即使&amp;quot;persistent-items&amp;quot;未被设置成true）；如果它确实把缺省的 &amp;quot;cache-last-item&amp;quot; 设置成 true，它应该（SHOULD）按照&amp;quot;send_last_published_item&amp;quot;的配置发送最近出版的项目（或关于它的通知）给订阅的实体。&lt;br /&gt;
&lt;br /&gt;
* 一个节点所有者应该（SHOULD）能够指定谁可以订阅这个节点.&lt;br /&gt;
&lt;br /&gt;
* 一个节点所有者应该（SHOULD）能够指定谁可以发布项目到这个节点.&lt;br /&gt;
&lt;br /&gt;
* 一个节点可以（MAY）被配置成在事件通知内交付已出版的有效载荷。&lt;br /&gt;
&lt;br /&gt;
* 一个节点可以（MAY）被配置成持续发布项目给一些持久存储机制.&lt;br /&gt;
&lt;br /&gt;
* 一个节点可以（MAY）被配置成持续发布有限次数的项目.&lt;br /&gt;
&lt;br /&gt;
* 一个服务可以（MAY）支持集合.&lt;br /&gt;
&lt;br /&gt;
* 一个服务或节点可以（MAY）支持扩展的服务发现信息(meta-data).&lt;br /&gt;
&lt;br /&gt;
==预备==&lt;br /&gt;
&lt;br /&gt;
===从属关系===&lt;br /&gt;
&lt;br /&gt;
为了管理许可，在这里协议定义了一个层次从属关系，类似多用户聊天系统中所采用的（Multi-User Chat 6）.&lt;br /&gt;
&lt;br /&gt;
对于 &amp;quot;owner&amp;quot; 和 &amp;quot;none&amp;quot; 的从属关系的支持是必需的（REQUIRED）。其他所有的从属关系的支持是建议的（RECOMMENDED）。特殊种类的pubsub服务可以（MAY）强制额外的需求。&lt;br /&gt;
&lt;br /&gt;
'''表 2: 从属关系和他们的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!从属关系	!! 订阅	!! 发布项目	!! 清理项目	!! 配置节点	!! 删除节点	!! 删除项目&lt;br /&gt;
|-&lt;br /&gt;
|所有者	|| Yes	|| Yes || Yes || Yes	|| Yes	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
|Publisher || Yes || Yes || No	|| No || No	|| Yes/No *&lt;br /&gt;
|-&lt;br /&gt;
|None	||Yes	|| No	|| No	|| No	|| No	|| No&lt;br /&gt;
|-&lt;br /&gt;
|Outcast || No	|| No	|| No	|| No	|| No	|| No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 注意: 一旦一个项目已经出版给某个节点，那个服务可以（MAY）允许任何出版者删除任何项目而不是只允许原始的出版者删除它（这是一个可发现的服务，通过&amp;quot;pubsub#delete-any&amp;quot;特性）。&lt;br /&gt;
&lt;br /&gt;
实体如何变更它和节点的从属关系是很明确的。一般来讲，一个从属关系状态的改变需要所有者的动作。从属关系改变和他们的触发动作定义在下表中。&lt;br /&gt;
&lt;br /&gt;
'''表 3: 从属关系状态图'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|--&amp;gt;	||Outcast	||None	||Publisher	||Owner&lt;br /&gt;
|-&lt;br /&gt;
|Outcast	||--	||所有者移除禁令	||所有者添加实体到出版者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|None	||所有者禁止实体	||--	||所有者添加实体到出版者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Publisher	||所有者禁止实体	||所有者从出版者列表中移除实体	||--	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Owner	||n/a	||所有者辞职	||n/a	||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===订阅状态===&lt;br /&gt;
&lt;br /&gt;
订阅某个节点可以有很多状态&lt;br /&gt;
&lt;br /&gt;
'''表 4: 订阅状态'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!订阅状态	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|无	|| 节点不能（MUST NOT）发送事件通知或有效载荷给实体.&lt;br /&gt;
|-&lt;br /&gt;
|未决的	|| 一个实体已经申请订阅一个节点，但是这个申请还没被节点所有者批准。节点在处于这个状态时不能（MUST NOT）发送事件通知或有效载荷给实体。&lt;br /&gt;
|-&lt;br /&gt;
|未配置的	|| 一个节点已经订阅但是它的订阅选项还没有配置。节点在这个状态时可以（MAY）发送事件通知或有效载荷给实体。 服务可以（MAY）让未配置的订阅过期作废。&lt;br /&gt;
|-&lt;br /&gt;
|已订阅的	|| 一个实体已经订阅了一个节点。节点在这个状态下必须（MUST）发送所有事件通知（和有效载荷，如果配置了的话）给实体。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===事件类型===&lt;br /&gt;
&lt;br /&gt;
出版-订阅协议需要两个主要的尺度来使我们能够衡量一个事件：持久性和临时性，纯的通知和包含有效载荷的通知。协议的实现应该（SHOULD）让所有者能够从两个尺度都可以配置一个节点。&lt;br /&gt;
&lt;br /&gt;
无论一个节点是否配置成持久性或者临时性的事件，一个服务可以（MAY）缓存最后一个发布到节点的项目，在这种情况下，它应该（SHOULD）根据&amp;quot;send_last_published_item&amp;quot;选项(参见本文的 项目缓存 章节)的配置情况发送那个项目给订阅者。&lt;br /&gt;
&lt;br /&gt;
一个pubsub服务必须（MUST）确认发布请求在这两个方面都满足节点的配置。(参见本文的 发布一个项目到一个节点 章节了解相关的出错条件)。&lt;br /&gt;
&lt;br /&gt;
是否一个项目必须由一个出版者提供，以及是否一个项目ID由出版者提供还是有pubsub服务生成，取决于被发布的事件的类型。我们在下表中概述相关的规则:&lt;br /&gt;
&lt;br /&gt;
'''表 5: 事件类型，项目，项目ID'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|--&amp;gt;	|| 通知	|| 有效载荷&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，它可以（MAY）是空的或者包含有效载荷；如果项目 ID 不是由发布者提供，它必须（MUST）由pubsub服务生成	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷；如果项目 ID 没有被发布者提供，它必须（MUST）由pubsub服务生成&lt;br /&gt;
|-&lt;br /&gt;
|临时的	|| 发布者不能（MUST NOT）包含一个 &amp;lt;item/&amp;gt; 元素(所以项目 ID 不需要提供也不需要生成) 但是通知将包含一个空的 &amp;lt;items/&amp;gt; 元素	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷，但是项目 ID 是可选的（OPTIONAL）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点类型===&lt;br /&gt;
&lt;br /&gt;
有两个节点类型:&lt;br /&gt;
&lt;br /&gt;
'''表 6: 节点类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!节点类型	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|叶节点	|| 一个仅包含发布的项目的节点。它不包含任何其他节点。这是最常见的节点类型。&lt;br /&gt;
|-&lt;br /&gt;
|集合节点	|| 一个包含节点和/或其他集合但是不包含出版项目的节点。集合可以实现多层次的节点结构。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点访问模式===&lt;br /&gt;
&lt;br /&gt;
为了使节点建立对客户更简单，我们定义了以下节点访问模式(为了公开性):&lt;br /&gt;
&lt;br /&gt;
'''表 7: 节点访问模式'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!访问模式	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|开放的	|| 任何实体可以订阅这个节点(比如, 订阅不需要批准) ，以及任何实体可以从这个节点接收项目(比如，不需要被订阅)；这应该（SHOULD）是一般pubsub幅服务的缺省访问模式。&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 任何拥有&amp;quot;from&amp;quot;或&amp;quot;both&amp;quot;类型的订阅的实体可以向节点订阅和接收项目；这个访问模式主要应用于即时消息系统 (参见 RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|名册	|| 任何处于指定名册组中的实体可以向节点订阅和接收项目；这种访问模式主要用于即时消息系统 (参见see RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|授权的	|| 节点所有者必须批准所有订阅请求，并且只有订阅者可以从节点接收项目.&lt;br /&gt;
|-&lt;br /&gt;
|白名单	|| 一个实体仅仅在被节点所有者加入白名单的时候才可以被订阅（主动提出的订阅请求会被拒绝），并且只有订阅者可以从节点接收项目。换句话说，缺省的从属关系是排斥的。节点所有者必须（MUST）自动进入白名单。为了添加实体进入白名单，节点所有者应该（SHOULD）使用本文的 管理从属关系实体章节中所定义的方式。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
尽管专门的出版-订阅 系统实施可以（MAY）只支持访问模式的一个子集，但一般来说 出版-订阅系统实施应该（SHOULD）支持所有已定义的访问模式。在一个专门部署的系统中，系统服务提供哪些访问模式是一个问题（比如，一些受限的系统部署可能希望锁定许可从而只提供“被授权的”和&amp;quot;白名单&amp;quot;的访问模式,或甚至只提供&amp;quot;白名单&amp;quot;的访问模式）。&lt;br /&gt;
&lt;br /&gt;
为了使一个节点创建者或所有者指定访问模式,使用了'pubsub#access_model'配置域(参见本文的Create a Node With Default Configuration and Configure a Node(以缺省配置创建一个节点和配置一个节点)章节).&lt;br /&gt;
&lt;br /&gt;
===寻址===&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点是可设定地址的，它必须（MUST）被设定为一个JID或一个JID和一个节点的组合。\[7\]&lt;br /&gt;
&lt;br /&gt;
====JID====&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点的地址被设定成一个JID，节点ID必须（MUST）是资源ID，并且节点ID不能（MUST NOT）是JID中的&amp;quot;user&amp;quot;部分（如&amp;quot;domain.tld/NodeID&amp;quot; 和 &amp;quot;user@domain.tld/NodeID&amp;quot; 是被允许的; &amp;quot;NodeID@domain.tld&amp;quot; 是不允许的）。JID 寻址应该(SHOULD)在使用不支持节点属性的协议和一个 pubsub 节点互动的时候使用.例如,当一个服务允许实体向节点订阅出席信息,它会把节点地址设成JID。如果一个 pubsub 节点可以被设置成 JID ，pubsub 服务必须（MUST）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，pubsub服务定位于主机名 pubsub.shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 4. 节点地址设定为 domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub.shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在再考虑以下例子, pubsub 服务定位于 pubsub@shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 5. 节点地址设定为 user@domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub@shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====JID+NodeID====&lt;br /&gt;
&lt;br /&gt;
如果一个pubsub服务地址可以被设成一个JID加一个节点，这个节点ID必须（MUST）是发现服务中的'node'属性值，同时也是pubsub服务的'node'属性值；用于发现服务时，一个pubsub节点等同于一个发现服务的节点。如果一个pubsub节点可以被设置成 JID 加 node，这个pubsub服务应该（SHOULD）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，（虚拟的）pubsub服务定位于 hamlet@denmark.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 6. 节点地址设为 JID+NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='hamlet@denmark.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;query node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
本章规定了使用案例，用于任何希望和出版-订阅服务互动的实体使用的协议，主要集中于发现服务的使用案例。&lt;br /&gt;
&lt;br /&gt;
===发现特性===&lt;br /&gt;
&lt;br /&gt;
一个服务必须(MUST)回应符合名字空间'http://jabber.org/protocol/disco#info'的发现服务信息请求。由pubsub服务返回的&amp;quot;disco#info&amp;quot;结果必须（MUST）表明服务的标识符以及支持哪些pubsub特性。&lt;br /&gt;
&lt;br /&gt;
'''案例 7. 实体查询 Pubsub 服务支持的特性'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''案例 8. Pubsub 服务返回支持的特性组'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
       &amp;lt;identity category='pubsub' type='service'/&amp;gt;&lt;br /&gt;
       &amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能存在的 pubsub 特性在本文中到处都是，并且它们都已经在本文的 XMPP资源注册事项 章节描述了。想了解哪个特性是必需的，建议的，可选的，参见本文的 特性总结 章节。&lt;br /&gt;
&lt;br /&gt;
===5.2 发现节点===&lt;br /&gt;
&lt;br /&gt;
如果一个服务实现了一个多层次节点（也就是 集合节点），它必须（MUST）也要让实体能够通过 服务发现协议发现这些多层次节点，在结果集很大的时候遵照 XEP-0030 的建议(这时候应该(SHOULD)使用Jabber search或一些其他协议).以下例子展示在一个多层次 pubsub 服务中如何使用 服务发现 来发现可用的节点.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点层次和集合节点是可选的(OPTIONAL). 详细情况参照本文的 节点ID术语 和 集合节点章节.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在第一个例子中,一个实体向一个根节点(比如服务本身)发送一个服务发现条目(&amp;quot;disco#items&amp;quot;)请求,它是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 9. 实体请求所有一级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 10. 服务返回所有一级节点__ {anchor:xml}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='blogs' name='Weblog updates'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='news' name='News and announcements'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二个例子中,一个实体发送一个 disco#items 请求给其中一个一级节点,它也是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 11. 实体请求二级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__案例 12. 服务返回二级节点__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='kingly_ravings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='starcrossed_stories'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='moorish_meanderings'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个叶子节点不仅是一个集合节点,它本身也有条目发行,这个服务可以(MAY)为每一个已出版的条目返回一个 &amp;lt;item/&amp;gt; 元素(参见本文的 从一个节点发现条目 章节),无论如何这些条目一定不能(MUST NOT)包含一个 'node' 属性(因为它们是已发行的条目,不是节点).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.3 发现节点信息__ {anchor:发现节点信息}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个 pubsub 服务必须（MUST）允许实体去查询每个单独的节点来获得该节点的相关信息。必须（MUST）使用服务发现协议来查询这些信息。&amp;quot;disco#info&amp;quot; 结果必须（MUST）包含一个ID，其类别是“pubsub”，类型是“leaf”或“collection”。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 如果一个节点的 id 类型为“leaf”，它一定不能（MUST NOT）包含其它的节点或集合（只有条目）；如果一个节点的ID类型是“collection”，它一定不能（MUST NOT）包含条目（只有其它节点或集合）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 13. 实体查询集合节点的信息__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='info2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 14. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='collection'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 15. 实体查询叶子节点信息__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 16. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.4 发现节点元数据__ {anchor:发现节点元数据}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disco#info&amp;quot; 结果可以（MAY）包含节点的详细元数据，封装在数据窗体[第九章]中，其格式参见Service Discovery Extensions（服务发现扩展） [第十章]。数据窗体上下文由 &amp;quot;http://jabber.org/protocol/pubsub#meta-data&amp;quot; 中的 FORM_TYPE 定义，并符合Field Standardization for Data Forms（数据窗体的字段标准化）[第十一章]。如果元数据被提供了，它应该（SHOULD）所有已配置的选项值，像&amp;quot;automatic&amp;quot; 信息一样，比如节点创建日期，出版者列表以及类似的信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 17. 实体查询一个节点的信息__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 18. 服务应答信息和元数据__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#meta-data&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#type' label='Payload type'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://www.w3.org/2005/Atom&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creator' label='Node creator'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creation_date' label='Creation date'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;2003-07-29T22:56Z&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#title' label='A short name for the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Princely Musings (Atom)&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#description' label='A description of the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Updates for Hamlet's Princely Musings weblog.&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#language' label='Default language'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#contact' label='People to contact with questions'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;bard@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#owner' label='Node owners'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#publisher' label='Publishers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#num_subscribers' label='Number of subscribers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;1066&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点元数据可以用多种方法设置。一些是基于节点配置（如所有者的JID），也有的是动态的（如订阅者的号码）。任何在节点元数据中提供的静态信息应该（SHOULD）在节点配置窗体中以字段形式提供。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的元数据直接由节点映射表中特定的元数据属性提供。参见Dublin Core Metadata Initiative (DCMI) [第十二章]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__表 8: Dublin Core Meta-Data Mapping（Dulbin 核心元数据映射表）__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
Pubsub Field	|Dublin Core Meta-Data Attribute&lt;br /&gt;
&lt;br /&gt;
pubsub#creation_date	|Date [第十三章]&lt;br /&gt;
&lt;br /&gt;
pubsub#creator	|Creator&lt;br /&gt;
&lt;br /&gt;
pubsub#description	|Description&lt;br /&gt;
&lt;br /&gt;
pubsub#language	|Language&lt;br /&gt;
&lt;br /&gt;
pubsub#publisher	|Publisher&lt;br /&gt;
&lt;br /&gt;
pubsub#title	|Title&lt;br /&gt;
&lt;br /&gt;
pubsub#type	|Type [第十四章]&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.5 从一个节点查询条目__ {anchor:从一个节点查询条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了查询服务中特定节点的已出版条目，一个实体可以（MAY）发送&amp;quot;disco#items&amp;quot;请求给节点本身，服务可以（MAY）通过&amp;lt; item/&amp;gt;返回每个条目。每个条目的'name'属性必须（MUST）包括它的ItemID，并且条目不能（MUST NOT）有'node'属性。这个 ItemID 可以（MAY）用于接收条目（参见本协议文档中Retrieve Items from a Node（从一个节点接收条目） 章节 ）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 19. 实体请求一个节点的所有条目__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='3300659945416e274474e469a1f0154c'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.6 找回订阅__ {anchor:找回订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许实体查询服务以找回它对服务中所有节点的订阅。为了做出这些查询，请求的实体必须（MUST）发送一个 IQ-get 消息，这个消息的　&amp;lt;pubsub/&amp;gt; 子元素包含一个没有属性的空&amp;lt;subscriptions/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 20. 实体请求所有当前的订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个订阅列表，它必须（MUST）返回所有和请求消息中'from'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)　匹配的 JIDs的信息．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个订阅, 返回一个 &amp;lt;subscription/&amp;gt; 元素以指明 NodeID, 以及这个节点ID相关联的 JID(可以包含资源，视实体如何订阅而定)，目前的订阅状态。如果服务支持订阅ID(subscription identifier)，'subid' 属性也必须（MUST）出现.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 21. 服务返回所有当前订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node1' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node2' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node5' jid='francisco@denmark.lit' subscription='unconfigured'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node6' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有订阅，pubsub 服务必须（MUST）返回一个空的 &amp;lt;subscriptions/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 22. 没有订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持订阅找回,服务必须（MUST）应答一个&amp;lt;feature-not-implemented/&amp;gt; 错误, 指出 pubsub-specific 的错误条件 &amp;lt;unsupported/&amp;gt; 以及特性 &amp;quot;retrieve-subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 23. 不支持订阅找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-subscriptions'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.7 找回加入__ {anchor:找回加入}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许一个实体查询这个服务以找回它在所有节点的加入信息。为了做出这些请求，实体要在请求消息中包含一个没有属性的空 &amp;lt;affiliations/&amp;gt; 元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 24. 实体请求所有当前加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个加入的列表，它必须（MUST）返回所有和请求的'form'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)相匹配的JID的加入信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个加入信息, 返回一个 &amp;lt;affiliation/&amp;gt; 元素，包含　NodeID 和加入状态 (所有这owner, 发布者publisher, or 流浪者outcast).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 25. 服务应答所有当前加入__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node1' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node2' affiliation='publisher'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node5' affiliation='outcast'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node6' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有加入, pubsub 服务必须（MUST）返回一个空的 &amp;lt;affiliations/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 26. 没有加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持加入找回, 服务必须（MUST）应答一个 &amp;lt;feature-not-implemented/&amp;gt; 错误, 指明一个 &amp;lt;unsupported/&amp;gt;的　pubsub-specific 错误条件和 &amp;quot;retrieve-affiliations&amp;quot;　的特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 27. 不支持加入找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-affiliations'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6. 订阅者用例__ {anchor:订阅者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
本节定义了潜在和实际的订阅者使用协议的用例。（注意：本文的实施备注一节描述了一个pubsub服务器必须（MUST）遵守的许多重要的因素和商业规则．另外，所有例子都假定独立的pubsub组件存在并包含任何含有服务器或网络标记的相关'from'地址）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.1 向一个节点订阅__ {anchor:向一个节点订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当一个Jabber实体希望从一个节点订阅，它向pubsub服务发送订阅请求。订阅申请是一个 IQ-set　消息，其&amp;lt;pubsub/&amp;gt; 元素包含并且仅包含一个&amp;lt;subscribe/&amp;gt;元素．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'node' 属性指明实体希望订阅的节点．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'jid' 属性指明用于订阅的JID确切的 XMPP 地址－－通常是一个纯JID(&amp;lt;node@domain.tld&amp;gt;) 或一个全JID(&amp;lt;node@domain.tld/resource&amp;gt;)，当然&amp;lt;domain.tld&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;格式的JID也可以订阅．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果指定的JID 是一个纯JID或一个全JID，服务必须（MUST）从接收的IQ请求中的’from’属性中分离出最小化的纯JID部分，以确保发出请求的实体和被加入到订阅者列表的JID是同一个ID。无论如何，一些实现可以（MAY）允许服务管理员配置一个实体列表不进行此项检查；那些实体可能被作为 &amp;quot;trusted proxies&amp;quot;（被信任的代理），可以为其他实体进行订阅．同样的，一些实现可以（MAY）允许实体黑名单，禁止其执行特定的动作（比如订阅或者建立节点）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可以（MAY）允许实体多次订阅同一个节点．这是一个实体能够用不同的订阅选项进行订阅．如果允许用同一个JID进行多次订阅，服务必须（MUST）使用'subid'属性来区分同一实体的不同订阅（所以SubID必须（MUST）对于每一个node+JID的组合是唯一的，并且在发送给订阅者实体的任何时候SubID必须（MUST）出现在实体元素中）。不建议（NOT RECOMMENDED）客户端生成SubID，因为可能引发冲突；所以一个服务应该（SHOULD）为订阅者生成一个SubID，并且如果订阅者提供了 SubID，服务可以重写它．如果服不允许同一个实体多次订阅但是接收到了额外的订阅请求，服务必须（MUST）返回当前的订阅状态（如果这个订阅以前就被批准了）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这里是一个订阅请求的例子.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 28. 实体向一个节点订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅请求被成功处理，服务器必须（MUST）通知请求实体它已订阅（可以(MAY)包含一个服务生成的SubID）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 29. 服务返回成功__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务也可以（MAY）发送最后一次发行的条目给新的订阅者．包含这个条目的消息应该（SHOULD）被标记为符合'jabber:x:delay'名字空间的扩展信息(参见 Delayed Delivery [第十五章])，以表明它是延时发送的．（注意在这个例子中消息通知发送给纯JID，因为那是已订阅的JID）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 30. 服务发送最后一次发行的条目__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;summary&amp;gt; To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? &amp;lt;/summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link rel='alternate' type='text/html' href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/item&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/items&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/event&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:delay' stamp='20031213T23:58:37'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致订阅请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. JID　的纯JID部分不符.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式并且请求实体没有订阅所有者的出席信息。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;的访问模式并且请求实体不在授权名单组中。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;的访问模式并且请求实体不在白名单中。&lt;br /&gt;
&lt;br /&gt;
   1. 订阅节点的时候服务需要付费。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体是匿名的并且服务不允许匿名实体订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有一个未决的订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被封锁订阅(例如，因为被加入黑名单)。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不支持订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误案例全部描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果JID的纯JID部分不符合上述的描述并且请求实体没有一些由实现定义的管理或者代理权限，服务必须（MUST）返回一个&amp;lt;bad-request/&amp;gt;错误，它也应（SHOULD）包含一个pubsub- specific的&amp;lt;invalid-jid/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 31. JID不匹配__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;invalid-jid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;presence&amp;quot;访问模式的节点，如果请求实体没有订阅所有者的出席信息，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;presence-subscription-required/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 32. 实体没有被授权建立一个订阅(需要出席信息订阅)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;roster&amp;quot;访问模式的节点，如果请求实体不在授权的名单组中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;not-in-roster-group/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 33. 实体没有被授权建立一个订阅(不在名册组中)__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;白名单&amp;quot;访问模式的节点，如果请求实体不在白名单中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;closed-node/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 34. 节点有白名单访问模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业部署可能希望把订阅连接到一个付费客户数据库。如果为了订阅节点需要付费（例如，如果订阅者不在客户数据库中或客户还未付帐），服务应该（SHOULD）返回一个 &amp;lt;payment-required/&amp;gt; 错误给订阅者。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 35. 订阅需要付费__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一些 XMPP 服务器可能允许使用SASL　ANONYMOUS验证；无论如何，因为这会导致实体不稳定（分配的JID可能不是同一个负责人in a persistent manner），一个服务可以(MAY)防止匿名实体订阅一个节点并且应该（SHOULD）使用服务发现来决定是否有一个 &amp;quot;account/anonymous&amp;quot;实体．如果一个请求实体是匿名的但是服务器不允许匿名实体订阅，服务应该返回一个&amp;lt; forbidden/&amp;gt;错误给订阅者．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 36. 请求实体是匿名用户__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='anonymous@denmark.lit/foo'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='anonymous@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有一个未决的订阅, 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅,表明一个发生了pubsub-specific　&amp;lt;pending-subscription/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 37. 请求实体有一个未决的订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;pending-subscription xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被一个订阅屏蔽了(例如, 因为它在禁止加入的名单中), 服务器必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 38. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不允许实体订阅, 服务应该(SHOULD)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者,提出一个pubsub- specific　&amp;lt;unsupported/&amp;gt;错误条件和一个&amp;quot;subscribe&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 39. 订阅不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
	&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
	&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
	&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 40. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;authorize&amp;quot;访问模式的节点, 订阅请求必须(MUST)由节点所有者批准; 所以pubsub服务发送一个消息给节点所有者请求授权(参见本文的 Manage Subscription Requests 章节). 因为订阅请求可能被批准也可能不被批准, 服务必须(MUST)返回一个未决通知给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 41. 服务应答未决__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果实体在接收通知之前必须配置它的订阅选项(见本文 Configure Subscription Options　章节),服务必须(MUST)通知实体这件事. 它应该(SHOULD)返回一个IQ-result给请求实体一个记号表示需要订阅配置。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 42. 服务应答成功并指出需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;required/&amp;gt;&lt;br /&gt;
&amp;lt;/subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 只有订阅者在收到任何通知之前必须配置订阅，节点才应该包含这个&amp;lt;required/&amp;gt;子元素. 如果配置是必需的而配置请求没有在合理的时间内提交，一个服务可以(MAY)判定订阅请求超时(取决于服务或节点的配置).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
同样的, 如果没有同步的配置就不能新建这个订阅, 服务可以(MAY)返回一个&amp;lt;not-acceptable/&amp;gt; 错误, 表示发生了一个pubsub-specific &amp;lt;configuration-required/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 43. 服务返回错误说明需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver'&amp;gt;&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest'&amp;gt;&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body'&amp;gt;&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;configuration-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果没有包含&amp;lt;required/&amp;gt;元素也没有错误返回, 订阅立刻生效并且实体可以在任何时间配置这个订阅(服务可以(MAY)通过在IQ-result中包含一个空的&amp;lt;subscribe- options/&amp;gt;元素指出支持订阅选项, 如下案例所示).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 44. 服务应答成功并指出支持订阅配置但不是必需的__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options/&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.2 从一个节点取消订阅__ {anchor:从一个节点取消订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了从一个节点取消订阅, 订阅者发送一个 IQ-set， 它的 &amp;lt;pubsub/&amp;gt; 子元素包含一个&amp;lt;unsubscribe/&amp;gt;元素，指明节点和已订阅的 JID.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 45. 实体从一个节点取消订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求可以被成功处理,服务必须(MUST)一个　IQ result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 46. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致取消订阅失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有多个订阅指向节点但未指定一个订阅ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求未指定一个已存在的订阅者.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限取消指定JID的订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定的订阅ID不合法或不是当前的.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误情景描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有多个订阅指向节点但是没有指定一个订阅ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个 &amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件 .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 47. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果'jid'属性的值未指定一个已存在的订阅者, pubsub服务必须(MUST)返回一个错误节, 它应该(SHOULD)是&amp;lt;unexpected-request/&amp;gt;并且也应该(SHOULD)包含一个 &amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 48. 请求实体不是一个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被禁止取消特定JID的订阅, 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误. 服务必须(MUST)检查这个做出请求的实体是否被授权可以取消订阅. 如果订阅者的JID格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)通过比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分执行这个检查以确保它们是吻合的. 如果这些JID的纯JID部分不吻合并且请求实体没有被授权取消这个JID的订阅(例如, 因为它不是一个服务管理员或被授权的代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 49. 请求实体被禁止取消订阅实体__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 50. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅标识符关联于某个订阅项, 取消订阅请求必须(MUST)包含一个适当的'subid'属性. 如果这个取消订阅请求包含一个 SubID 但是节点不支持 SubIDs (或订阅者第一次并没有使用 SubID 来订阅), 服务应该(SHOULD)忽略这个 SubID 并简单地取消订阅这个实体. 如果订阅者以前使用一个 SubID 来订阅但是取消订阅申请包含一个不合法或非当前订阅者的 SubID , 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它应该(SHOULD)也包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 51. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.3 配置订阅选项__ {anchor:配置订阅选项}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
实现可以(MAY)允许订阅者们配置订阅选项. 实现应该(SHOULD)使用数据表单(Data Forms)协议来实现这个配置(无论如何, 一个带外机制如web界面也可能被提供).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个服务支持订阅选项, 它必须(MUST)在它对&amp;quot;disco#info&amp;quot;查询的应答中声明(在应答中包含一个feature,其'var'属性为&amp;quot;pubsub#subscription-options&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 52. Pubsub服务显示对订阅选项的支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub#subscription-options'/&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个订阅者通过在IQ-set节中包含一个&amp;lt;options/&amp;gt;元素来请求订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 53. 订阅者请求订阅选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求被成功的处理, 服务必须(MUST)应答选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 54. 服务应答选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver' type='boolean' label='Enable delivery?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest' type='boolean' label='Receive digest notifications (approx. one per day)?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body' type='boolean' label='Receive message body in addition to payload?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values' type='list-multi' label='Select the presence types which are allowed to receive notifications'&amp;gt;&lt;br /&gt;
&amp;lt;option label='Want to Chat'&amp;gt;&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Available'&amp;gt;&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Away'&amp;gt;&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Extended Away'&amp;gt;&amp;lt;value&amp;gt;xa&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Do Not Disturb'&amp;gt;&amp;lt;value&amp;gt;dnd&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 前述的例子展示了一些(但不是所有)的可能(MAY)被提供的配置选项. 如果一个实现使用数据表单(Data Forms)协议提供了这些选项, 它必须(MUST)使用那些在和'http://jabber.org/protocol/pubsub'名字空间关联的XMPP Registrar中注册了的字段(以上初步展示了那些字段, 并且在本文的 pubsub#subscribe_options FORM_TYPE 章节也描述了它们, 但是不能(MUST NOT)被当作规范, 因为 XMPP Registrar 以后还可以在不改变本文的情况下标准化更多的字段).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 很多相关的数据表单字段有一个 &amp;quot;boolean&amp;quot; 类型并且必须(MUST)被有效处理. [16]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
很多原因可以导致选项请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限来修改指定的JID的订阅选项.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体(或指定的订阅者)未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有同时指定 NodeID 和订阅者的 JID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有指定一个订阅项ID但是它被需要.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定了一个订阅项ID但不是合法的或当前的.&lt;br /&gt;
&lt;br /&gt;
   1. 订阅选项不知吃.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误案例描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请求订阅选项的时候, 订阅者必须(MUST)指定向节点订阅的 JID 并且应该(SHOULD)指定一个节点(如果没有指定节点, 服务必须(MUST)认为请求实体希望为它的订阅项向根集合节点请求订阅选项; 详见本文的根集合节点章节).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)验证提出请求的实体已经被授权为订阅的实体设置订阅选项. 如果订阅者的JID的格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分以确保他们是吻合的. 如果两个JID的纯JID部分不吻合并且请求实体没有被授权修改这个JID的订阅选项(例如, 因为它不是一个服务范围内的管理员或授权代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 55. 请求实体没有足够的权限修改订阅选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
  &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体(或指定的订阅者, 如果不同的话) 未曾订阅, 服务必须(MUST)返回一个 &amp;lt;unexpected-request/&amp;gt; 错误, 它(SHOULD)也包括一个 &amp;lt;not-subscribed/&amp;gt; 的 pubsub-specific 错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 56. 没有这个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者没有指定一个JID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;jid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 57. 订阅者JID未指定__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;jid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某个订阅项, 为了服务能够区分来自同一实体的订阅,在订阅请求中必须(MUST)带上'subid'属性. 如果'subid'是必需的但未被提供, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 58. 需要SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某订阅项, 但请求包含的 SubID 不合法或不是当前订阅者的, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 59. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='unsub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;unsubscribe node='princely_musings' subid='991d7fd1616fd041015064133cd097a10030819e' jid='francisco@denmark.lit'/&amp;gt;      &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点或服务不支持订阅选项, 服务必须(MUST)应答一个&amp;lt;feature-not-implemented/&amp;gt;错误, 指定一个&amp;lt;unsupported/&amp;gt;的pubsub-specific错误条件和一个&amp;quot;subscription-options&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 60. 订阅选项不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscription-options'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 61. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接收了配置表单之后, 请求实体应该(SHOULD)提交这个表单来更新这个实体对于那个节点的订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 62. 订阅者提交完整的选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
   &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/options&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务能成功处理提交的表单, 它必须(MUST)应答成功.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 63. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者尝试设置非法的选项组, 服务必须(MUST)应答一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 64. 服务对于非法选项应答错误请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;invalid-options xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其他适用于获取订阅选项时发生的错误也同样适用于设置订阅选项的情形.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
大家直到, 如果一个服务支持订阅选项, 一个实体可以(MAY)在同一个节中订阅和提供订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
主意: &amp;lt;options/&amp;gt;元素必须(MUST)跟随在&amp;lt;subscribe/&amp;gt;元素之后并且不能(MUST NOT)拥有一个'node'属性或'jid'属性, 因为&amp;lt;subscribe/&amp;gt;元素的'node'属性值指明了期望的NodeID并且&amp;lt;subscribe/&amp;gt;元素的'jid'属性值指明了订阅者的JID; 如果这些值中的任何一个违规了, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 65. 实体订阅一个节点并且设置配置选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='sub1'&amp;gt; &lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt; &lt;br /&gt;
   &amp;lt;options&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data'&amp;gt; &lt;br /&gt;
     &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
   &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.4 从节点接收条目__ {anchor:从节点接收条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择保留条目的pubsub实现可以(MAY)允许实体从一个节点请求已有的条目(例如, 一个实体可能希望在成功订阅之后这样做以接收这个节点历史上发行的所有条目). 服务必须(MUST)遵守节点访问模式来决定是否向请求它们的实体返回这些条目. 具体来说:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;open&amp;quot;, 服务应该(SHOULD)允许任何实体(无论是否订阅)接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;presence&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;roster&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息并处于适当的名册组中的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;authorize&amp;quot;或&amp;quot;whitelist&amp;quot;, 服务必须(MUST)只允许已订阅的实体来接收条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于将来的访问模式所应有(SHOULD)的需求, 可能的例外是强制本地隐私和安全策略, 更全面的描述见本文的安全事项章节. (另外, 一个服务应该(MUST)总是允许节点所有者从一个节点接收条目并且应该(SHOULD)总是允许一个发行者这样做.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
订阅者可以通过仅仅不加限制地指明节点ID来请求所有的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 66. 订阅者请求所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务然后应该(SHOULD)返回所有发行到这个节点的条目, 尽管它可以(MAY)截取结果(如果已发行的条目数量太多的话).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 67. 服务返回所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='3300659945416e274474e469a1f0154c'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Ghostly Encounters&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O all you host of heaven! O earth! what else?&lt;br /&gt;
And shall I couple hell? O, fie! Hold, hold, my heart;&lt;br /&gt;
And you, my sinews, grow not instant old,&lt;br /&gt;
But bear me stiffly up. Remember thee!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T23:21:34Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T23:21:34Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
即使服务或节点不支持持久化条目, 它也可以(MAY)返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 68. 服务返回最后发行的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
有很多种原因可能导致条目接收请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体订阅了但是指定了一个非法的订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 节点没有返回条目给未订阅的实体但是请求实体未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持持久条目并且没有返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持条目接收.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式而请求实体没有订阅所有者的出席信息.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;访问模式而请求实体不在授权的名册组中.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;访问模式而请求实体不在白名单中.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点需要付费才允许接收条目.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被屏蔽了从节点接收条目的功能(例如, 因为有一个排斥者的从属关系).&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误完整描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 69. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果请求实体订阅了但是指定了一个非法的订阅项ID, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 70. 实体制定了非法的SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点未返回条目给未订阅的实体并且请求实体未曾订阅(包含已有一个未决的订阅项的情形), 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 71. 实体未订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持持久条目且没有返回最后发行的条目, 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指定一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 72. 不支持持久条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持接收条目(例如, 因为节点是一个集合节点), 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指明一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;retrieve-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 73. 不支持条目接收__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='retrieve-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;presence&amp;quot;的节点, 如果请求实体没有订阅所有者的出席信息那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它还应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;presence-subscription-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 74. 实体没有被授权接收条目(要求订阅出席信息)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;roster&amp;quot;的节点, 如果请求实体不在授权名册组中那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它也应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;not-in-roster-group/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 75. 实体没有被授权接收条目(不在名册组中)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;whitelist&amp;quot;的节点, 如果请求实体不在白名单中那么服务必须(MUST)返回一个&amp;lt;not-allowed/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;closed-node/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 76. 节点有白名单模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业开发可能希望把订阅者链接到一个付费客户数据库. 如果订阅者需要付费才能从那个节点接收条目(例如, 如果订阅者不在客户数据库或客户的帐目没有付清), 服务应该(SHOULD)返回一个&amp;lt;payment-required/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 77. 需要付费才能接收条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被屏蔽订阅(例如, 因为有一个被排斥者的从属关系), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 78. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 79. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可能(MAY)允许实体请求最近的N个条目(使用'max_items'属性). 当 max_items 被使用, 实现应该(SHOULD)返回N个最新的(反之则是N个最旧的)条目. (注意: 一个本协议的未来版本可能建议使用结果集管理Result Set Management \[17\] 替代'max_items'属性.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 80. 订阅者请求两个最新的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings' max_items='2'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 81. 服务返回最新的两个条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务可以(MAY)返回事件通知而不是载荷(例如, 为了节省带宽). 如果这样, 客户端为了接收载荷可以(MAY)请求一个指定的条目(使用ItemID). 当一个实体通过ItemID来请求条目, 实现必须(MUST)允许在请求中指定多个条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 82. 订阅者通过ItemID请求特定的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 83. 服务发送请求的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符和某个特定的订阅项相关, 服务必须(MUST)要求它, 这样它能基于和这一特定的订阅项相关的订阅选项来生成不同套的条目. 所以实体作出请求的时候必须(MUST)在itmes元素中包含'subid'属性; 如果它没有这样做, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;subid-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 84. 订阅者不带SubID发送请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 85. 要求SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7. 发行者用例__ {anchor:发行者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7.1 向一个节点发行一个条目__ {anchor:向一个节点发行一个条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
任何被允许向一个节点发行条目的实体 (也就是说.,一个发行者或一个所有者) 可以通过发送一个包含&amp;lt;publish/&amp;gt;子元素的 IQ-set 给服务来做到这一点; 这个 &amp;lt;publish/&amp;gt; 元素必须( MUST)拥有一个 'node' 属性并且根据这个节点配置可以(MAY)不包含 &amp;lt;item/&amp;gt;元素, 一个 &amp;lt;item/&amp;gt; 元素, 或 (用于批量处理)多个 &amp;lt;item/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 为触发一个通知不必要在发行请求中包含载荷或甚至一个 &amp;lt;item/&amp;gt; 元素.  例如, 发行到一个临时的仅用于通知的节点的结果将是一个不包含任何 &amp;lt;item/&amp;gt; 元素的通知 (如本文的Motivating Example章节所示). However, for the sake of convenience we refer to the act of publication as &amp;quot;publishing an item&amp;quot; (rather than, say, &amp;quot;triggering a notification&amp;quot;) even though a publication request will not always contain an &amp;lt;item/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 86. Publisher publishes an item with an ItemID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the pubsub service can successfully process the request, it MUST inform the publisher of success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 87. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    id='publish1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
If the pubsub service can successfully process the request, it MUST send then one &amp;lt;message/&amp;gt; stanza containing a pubsub event notification to each approved subscriber. Each &amp;lt;message/&amp;gt; stanza generated by a pubsub service SHOULD possess an 'id' attribute with a unique value so that the service can properly track any notification-related errors that may occur (see the Handling Notification-Related Errors section of this document).&lt;br /&gt;
Depending on the node configuration, the event notification either will or will not contain the payload, as shown in the following examples.&lt;br /&gt;
If the node is configured to include payloads, the subscribers will receive payloads with the event notifications.&lt;br /&gt;
Example 88. Subscribers receive event notifications with payloads&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node is configured to not include payloads, the subscribers will receive event notifications only. (If payloads are not included, subscribers may request the published item via the protocol defined in the Retrieve Items from a Node section of this document.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 89. Subscribers receive event notifications only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to a node multiple times, the service SHOULD notate the event notification so that the entity can determine which subscription identifier(s) generated this event. If these notations are included, they MUST use the Stanza Headers and Internet Metadata [18] format and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 90. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the publish request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The requesting entity does not have sufficient privileges to publish.&lt;br /&gt;
&lt;br /&gt;
   2. The node does not support item publication.&lt;br /&gt;
&lt;br /&gt;
   3. The node does not exist.&lt;br /&gt;
&lt;br /&gt;
   4. The payload size exceeds a service-defined limit.&lt;br /&gt;
&lt;br /&gt;
   5. The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.&lt;br /&gt;
&lt;br /&gt;
   6. The request does not match the node configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: If a publisher publishes an item with an Item ID and the ItemID matches that of an existing item, the pubsub service MUST NOT fail the publication but instead MUST overwrite the existing item and generate a new event notification (i.e., re-publication is equivalent to modification).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to publish, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 91. Entity does not have sufficient privileges to publish to node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support item publication (because it is a Collection Node), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;publish&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 92. Node does not support item publication&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='publish'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity attempts to publish an item to a node that does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 93. Entity attempts to publish to a non-existent node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the payload size exceeds a service-defined limit, the service MUST return a &amp;lt;not-acceptable/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;payload-too-big/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 94. Entity attempts to publish very large payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... HUGE PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-too-big xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;item/&amp;gt; element contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node, the service MUST bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;invalid-payload/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 95. Entity attempts to publish item with multiple payload elements or namespace does not match&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... INVALID PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-payload xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not conform to the configured event type for the node, the service MAY bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition. The following rules apply:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not specify an ItemID, the service MUST generate the ItemID and MUST NOT bounce the publication request.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not include an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is payload (either persistent or transient) and the publisher does not include a payload, the service SHOULD bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;payload-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is notification + transient and the publisher provides an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-forbidden/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples of these errors are shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 96. Publisher attempts to publish to persistent node with no item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 97. Publisher attempts to publish to payload node with no payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 98. Publisher attempts to publish to transient notification node with item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-forbidden xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally, in order to facilitate authorization for item removal as described in the Delete an Item from a Node section of this document, implementations that support persistent items SHOULD store the item (if the node is so configured) and maintain a record of the publisher.&lt;br /&gt;
&lt;br /&gt;
7.2 Delete an Item from a Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A service SHOULD allow a publisher to delete an item once it has been published to a node that supports persistent items. To delete an item, the publisher sends a retract request as shown in the following examples. The &amp;lt;retract/&amp;gt; element MUST possess a 'node' attribute, MAY possess a 'notify' attribute, and SHOULD contain one &amp;lt;item/&amp;gt; element (but MAY contain more than one &amp;lt;item/&amp;gt; element for Batch Processing of item retractions); the &amp;lt;item/&amp;gt; element MUST be empty and MUST possess an 'id' attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 99. Entity deletes an item from a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 100. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the item retraction request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The publisher does not have sufficient privileges to delete the requested item.&lt;br /&gt;
&lt;br /&gt;
   2. The node or item does not exist.&lt;br /&gt;
&lt;br /&gt;
   3. The request does not specify a node.&lt;br /&gt;
&lt;br /&gt;
   4. The request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID.&lt;br /&gt;
&lt;br /&gt;
   5. The node does not support persistent items.&lt;br /&gt;
&lt;br /&gt;
   6. The service does not support the deletion of items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to delete the item, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 101. Requesting entity does not have sufficient privileges&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node or item does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 102. Non-existent node or item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not specify a node, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;node-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 103. Request does not specify a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;node-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 104. Request does not specify an item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support persistent items (e.g., because it is a collection node or a transient node that does not deliver payloads), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 105. Node does not support persistent items&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the service does not support item deletion, it MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;delete-nodes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 106. Service does not support item deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='delete-nodes'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred, then the service MUST delete the item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred and the &amp;lt;retract/&amp;gt; element included a 'notify' attribute with a value of &amp;quot;true&amp;quot; or &amp;quot;1&amp;quot; [19], then the service MUST delete the item and MUST send message notifications to all subscribers as shown below. The syntax is identical to publish notifications except that instead of an &amp;lt;item/&amp;gt; element, the notification includes a &amp;lt;retract/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 107. Subscribers are notified of deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to the node multiple times, the service SHOULD notate the notification of item deletion so that the entity can determine which subscription identifier(s) generated this event. As above, if these notations are included, they MUST use the Stanza Headers and Internet Metadata (SHIM) protocol and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 108. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&lt;br /&gt;
'''文档信息'''&lt;br /&gt;
&lt;br /&gt;
系列: [[:Category:XMPP扩展|XEP]]&lt;br /&gt;
&lt;br /&gt;
编号: 0060&lt;br /&gt;
&lt;br /&gt;
发行者: [[XMPP标准基金会]]&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2006-09-13&lt;br /&gt;
&lt;br /&gt;
批准机构: [[XMPP理事会]]&lt;br /&gt;
&lt;br /&gt;
依赖于: [[RFC3920|XMPP Core]], XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0131&lt;br /&gt;
&lt;br /&gt;
上文: 无&lt;br /&gt;
&lt;br /&gt;
下文: 无&lt;br /&gt;
&lt;br /&gt;
简称: pubsub&lt;br /&gt;
&lt;br /&gt;
pubsub 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#errors 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-errors.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#event 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-event.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#owner 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wiki 页: &amp;lt;http://wiki.jabber.org/index.php/Publish-Subscribe%20(XEP-0060)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''作者信息'''&lt;br /&gt;
&lt;br /&gt;
'''Peter Millard'''&lt;br /&gt;
&lt;br /&gt;
见[http://www.xmpp.org/extensions/xep-0060.html#authornote 作者介绍]&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
'''Ralph Meijer'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
[http://essay-writer.org/ essay writers]&lt;/div&gt;</summary>
		<author><name>Chruse arroyo</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/RFC3921</id>
		<title>RFC3921</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/RFC3921"/>
				<updated>2011-12-12T18:03:25Z</updated>
		
		<summary type="html">&lt;p&gt;Chruse arroyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP相关RFC]]&lt;br /&gt;
[[Category:XMPP核心RFC]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
本文的英文原文来自[http://www.ietf.org/rfc/rfc3921.txt RFC 3921]&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|网络工作组      || Saint-Andre, Ed.&lt;br /&gt;
|-&lt;br /&gt;
|申请讨论: 3921  || Jabber软件基金会&lt;br /&gt;
|-&lt;br /&gt;
|类别: 标准跟踪  || 2004年10月&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
::::'''可扩展的消息和出席信息协议 (XMPP): 即时消息和出席信息'''&lt;br /&gt;
&lt;br /&gt;
'''关于本文的说明'''&lt;br /&gt;
&lt;br /&gt;
:本文为互联网社区定义了一个互联网标准跟踪协议，并且申请讨论协议和提出了改进的建议。请参照“互联网官方协议标准”的最新版本（STD 1）获得这个协议的标准化进程和状态。本文可以不受限制的分发。&lt;br /&gt;
&lt;br /&gt;
'''版权声明'''&lt;br /&gt;
&lt;br /&gt;
:本文版权属于互联网社区 (C) The Internet Society (2004).&lt;br /&gt;
&lt;br /&gt;
'''摘要'''&lt;br /&gt;
&lt;br /&gt;
:本文定义了可扩展消息和出席信息协议（XMPP）的核心功能的扩展和应用，XMPP提供了RFC 2779 定义的基本的即时消息和出席信息功能。&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
===概览===&lt;br /&gt;
&lt;br /&gt;
:XMPP是一个流化XML[XML]元素的协议，用于准实时的交换消息和出席信息。XMPP的核心功能定义在Extensible Messaging and Presence Protocol (XMPP): Core [XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]. 这些功能 -- 主要是 XML流, 使用 TLS和SASL,以及流的根元素之下的&amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 和 &amp;lt;iq/&amp;gt; 子元素 -- 为各种类型的准实时应用提供了一个构造基础, 它可以被放在核心的顶层，使用特定XML名字空间[XML-NAMES]发送特定的应用数据. 本文描述XMPP核心功能的扩展和应用，XMPP核心功能提供了RFC 2779 [IMP-REQS]定义的基本的即时消息和出席信息功能。&lt;br /&gt;
&lt;br /&gt;
===需求===&lt;br /&gt;
&lt;br /&gt;
:为了达到本文的目的, 基本的即时消息和出席信息应用的需求定义在[IMP-REQS],它是一个高阶的规定,一个用户必须完成以下用例:&lt;br /&gt;
&lt;br /&gt;
:*和其他用户交换消息&lt;br /&gt;
:*和其他用户交换出席信息&lt;br /&gt;
:*管理和其他用户之间的订阅和被订阅&lt;br /&gt;
:*管理联系人列表中的条目(在 XMPP 中这被称为 &amp;quot;roster&amp;quot;)&lt;br /&gt;
:*屏蔽和特定的其他用户之间的通信（出或入）&lt;br /&gt;
&lt;br /&gt;
:这些功能领域的详细定义在[IMP-REQS]中, 感兴趣的用户可以直接阅读原文关于需求方面的内容。&lt;br /&gt;
&lt;br /&gt;
:[IMP-REQS]也规定出席信息服务必须从即时消息服务中分离; 例如, 它必须可能用这个协议来提供一个出席信息服务,一个即时消息服务,或同时提供两者. 尽管本文假定实现和部署希望提供统一的即时消息和出席信息服务, 但没有要求一个服务必须同时提供出席信息服务和即时消息服务, 并且协议也提供了把出席信息服务和即时消息服务分离成为独立服务的可能性.&lt;br /&gt;
&lt;br /&gt;
:注意: 虽然基于XMPP的即时消息和出席信息符合[IMP-REQS]的要求,但它不是特意为那个协议设计的,因为基础协议是在RFC 2779成文之前通过Jabber开放源代码社区的一个开放的开发过程发展出来的. 也请注意尽管在Jabber社区发展的协议中定义了许多其他方面的功能,但是这些协议不包含在本文之中,因为它们不是[IMP-REQS]所要求的.&lt;br /&gt;
&lt;br /&gt;
===术语===&lt;br /&gt;
&lt;br /&gt;
:本文继承了 [XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]定义的术语.&lt;br /&gt;
&lt;br /&gt;
:大写关键字 &amp;quot;MUST&amp;quot;, &amp;quot;MUST NOT&amp;quot;, &amp;quot;REQUIRED&amp;quot;, &amp;quot;SHALL&amp;quot;, &amp;quot;SHALL NOT&amp;quot;, &amp;quot;SHOULD&amp;quot;,  &amp;quot;SHOULD NOT&amp;quot;, &amp;quot;RECOMMENDED&amp;quot;,  &amp;quot;MAY&amp;quot;, 和 &amp;quot;OPTIONAL&amp;quot; 在本文中的含义定义在 BCP 14, RFC 2119 [TERMS].&lt;br /&gt;
&lt;br /&gt;
==XML 节的语法==&lt;br /&gt;
&lt;br /&gt;
:符合'jabber:client'和'jabber:server'名字空间的XML节的基本语义和通用属性已经在[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]中定义了.  无论如何, 这些名字空间也定义了一些其他的子元素, 比如通用属性'type'的值, 对于即时消息和出席信息应用就是特殊的.  因而, 在选择用于这类应用的特定用例之前, 我们在这里需要先描述一下XML节的语法, 用来补充[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]中的讨论.&lt;br /&gt;
&lt;br /&gt;
===消息语法===&lt;br /&gt;
&lt;br /&gt;
:符合'jabber:client' or 'jabber:server'名字空间的消息节用于&amp;quot;推&amp;quot; 信息到另一个实体. 在即时消息应用中通常的用法是包含，一个单独的消息,在一个聊天会话中的消息，一个多用户聊天室的上下文中的消息，标题或其他警告和错误的消息,&lt;br /&gt;
&lt;br /&gt;
====消息的类型====&lt;br /&gt;
&lt;br /&gt;
:一个消息节的'type' 属性是建议的(RECOMMENDED); 如果包含了它,它指明这个消息的会话上下文,从而提供一个关于表达的线索(例如, 在一个GUI中). 如果包含了它, 'type' 属性必须(MUST)是以下的值之一 :&lt;br /&gt;
&lt;br /&gt;
:*chat -- 消息是在一对一聊天会话的语境被发送. 一个兼容的客户端应该(SHOULD)在一个允许两个实体进行一对一聊天的界面中显示消息,包括适当的会话历史.&lt;br /&gt;
&lt;br /&gt;
:*error -- 发生了一个和上次发送者发送的消息有关的错误(关于节错误语法的详细信息, 参考      [XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]). 一个兼容客户端应该(SHOULD)在一个适当的界面展示它以通知发送者这个错误的种类. &lt;br /&gt;
&lt;br /&gt;
:*groupchat -- 消息是在一个多用户聊天环境的语境下发送的(类似[IRC]). 一个兼容客户端应该(SHOULD)在允许多对多聊天的界面显示这个消息,包括, 包括这个聊天室的名册和适当的会话历史. 基于XMPP的群聊协议的完整定义超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
:*headline -- 一个消息可能是由一个递送或广播内容的自动化服务生成的(新闻, 体育, 市场信息, RSS feeds, 等等.).  这个消息是不需要回复的, 一个兼容客户端应该(SHOULD) 在一个适当的和单独消息,聊天会话,或群聊会话不同的界面显示这个消息(例如, 不给接收者提供回复能力).&lt;br /&gt;
&lt;br /&gt;
:*normal -- 这个消息是一个在一对一会话或群聊会话之外的单独消息, 并且它希望接收者能够回复.一个兼容客户端应该(SHOULD)在一个允许接收者回复的界面显示这个消息, 但不需要会话历史.&lt;br /&gt;
&lt;br /&gt;
:一个 IM 应用应该(SHOULD)支持所有前述的消息类型;如果一个应用接收了一个没有'type'属性的消息或这个应用不理解'type'属性的值, 它必须(MUST)认为这个消息是一个 &amp;quot;normal&amp;quot; 类型(如,&amp;quot;normal&amp;quot; 是缺省的). &amp;quot;error&amp;quot;类型必须(MUST)仅仅在应答一个和从别的实体接收到的消息有关的错误时生成.&lt;br /&gt;
&lt;br /&gt;
:尽管'type'属性是可选的(OPTIONAL), 处于礼貌原因对于消息的任何回复总是和原来的消息同一类型;此外, 一些特殊的应用(例如, 一个多用户聊天服务) 可以(MAY)根据它们的判断强制特定消息类型的使用(例如,    type='groupchat').&lt;br /&gt;
&lt;br /&gt;
====子元素====&lt;br /&gt;
&lt;br /&gt;
:正如 扩展名字空间extended namespaces(第二章第四节)所述, 一个消息节可以(MAY)包含任何适当名字空间的子元素.&lt;br /&gt;
&lt;br /&gt;
:和缺省名字空间声明一致, 缺省消息节的名字空间是'jabber:client' 或 'jabber:server', 定义了某几个允许的消息节的子元素. 如果消息节的类型是 &amp;quot;error&amp;quot;, 它必须(MUST)包含一个&amp;lt;error/&amp;gt;子元素; 详细情况, 见[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]. 否则, 消息节可以(MAY)包含以下子元素的任何一种并且无需显式地声明名字空间:&lt;br /&gt;
&lt;br /&gt;
:#&amp;lt;subject/&amp;gt;&lt;br /&gt;
:#&amp;lt;body/&amp;gt;&lt;br /&gt;
:#&amp;lt;thread/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====主题=====&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;subject/&amp;gt; 元素包含了人类可读的 XML 字符数据指明这个消息的主题. &amp;lt;subject/&amp;gt;元素不能(MUST NOT)拥有任何属性, 除了'xml:lang'属性. &amp;lt;subject/&amp;gt; 元素可以(MAY)包含多个实例用于为同一主题提供备用版本, 但是仅在每个实例的拥有的'xml:lang'属性的值互不相同的时候才可以. &amp;lt;subject/&amp;gt; 元素不能(MUST NOT)包含混合的内容(定义在 [XML]第三章第二节第二小节).&lt;br /&gt;
&lt;br /&gt;
=====主体=====&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;body/&amp;gt; 元素包含人类可读的XML字符数据表达消息的文本内容; 这个子元素通常会有但是是可选的(OPTIONAL). &amp;lt;body/&amp;gt;元素不能(MUST NOT)拥有任何属性, 除非是'xml:lang'属性. &amp;lt;body/&amp;gt; 元素可以(MAY)包含多个实例用于为同一主体提供备用版本, 但是仅在每个实例的拥有的'xml:lang'属性的值互不相同的时候才可以. &amp;lt;body/&amp;gt;元素不能(MUST NOT)包含混合的内容(定义在 [XML]第三章第二节第二小节).  &lt;br /&gt;
&lt;br /&gt;
=====线索=====&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;thread/&amp;gt; 元素包含非人类可读的XML字符数据表达一个标识符用于跟踪两个实体之间的一个会话线索(有时相当于一个&amp;quot;即时消息会话&amp;quot;). &amp;lt;thread/&amp;gt;元素的值是由发送者生成的并且应该(SHOULD)在任何回复中拷贝回来. 如果使用了它, 它必须(MUST)在这个流的会话线索中是唯一的并且必须(MUST)和那个会话相一致(一个从同一个全JID但不同线索ID接收到消息的客户端必须(MUST)假定这个有问题的消息存在于已有的会话线索之外. &amp;lt;thread/&amp;gt;元素的使用是可选的(OPTIONAL)并且不是用于标识独立的消息,而是标识会话. 一个消息节不能(MUST NOT)包含超过一个的&amp;lt;thread/&amp;gt;元素. &amp;lt;thread/&amp;gt;元素不能(MUST NOT)拥有任何属性. &amp;lt;thread/&amp;gt;属性的值必须(MUST)被实体处理成不透明的; 不能从它得到任何语义学上的含义,并且只能对它做精确的比较. &amp;lt;thread/&amp;gt;元素不能(MUST NOT)包含混合内容(定义在 [XML]第三章第二节第二小节).&lt;br /&gt;
&lt;br /&gt;
===出席信息语法===&lt;br /&gt;
&lt;br /&gt;
:符合'jabber:client' 或 'jabber:server'名字空间的出席信息节用于表达一个实体当前的网络可用性(离线或在线, 包括之后的各种亚状态和可选的用户名义的描述性文本), 并且通知其他实体它的可用性. 出席信息节也用于协商和管理对于其他实体的出席信息的订阅.&lt;br /&gt;
&lt;br /&gt;
====出席信息的类型====&lt;br /&gt;
&lt;br /&gt;
:出席信息节的'type'属性是可选的(OPTIONAL). 一个不拥有任何'type'属性的出席信息节用来通知服务器发送者已经在线并且可以进行通信了, 'type' 属性表示缺乏可用性, 请求管理对其他实体的出席信息的订阅, 请求其他实体的当前出席信息, 或发生了和上次发出的出席信息节有关的错误. 如果包含了它, 'type'属性必须(MUST)拥有以下值之一:&lt;br /&gt;
&lt;br /&gt;
:*unavailable -- 通知实体将不可通信.&lt;br /&gt;
&lt;br /&gt;
:*subscribe -- 发送者希望订阅接收者的出席信息.&lt;br /&gt;
&lt;br /&gt;
:*subscribed -- 发送者允许接收者接收他们的出席信息.&lt;br /&gt;
&lt;br /&gt;
:*unsubscribe -- 发送者取消订阅另一个实体的出席信息.&lt;br /&gt;
&lt;br /&gt;
:*unsubscribed -- 订阅者的请求被拒绝或以前的订阅被取消.&lt;br /&gt;
&lt;br /&gt;
:*probe -- 对一个实体当前的出席信息的请求; 只应(SHOULD)由服务器代替一个用户生成.&lt;br /&gt;
&lt;br /&gt;
:*error -- 处理或递送之前发送的出席信息节的时候发生了错误.&lt;br /&gt;
&lt;br /&gt;
:关于出席信息语义学的详细信息和基于XMPP的即时消息和出席信息应用程序的订阅模式,参考 交换出席信息Exchanging Presence Information(第五章) 和 管理订阅Managing Subscriptions(第六章).&lt;br /&gt;
&lt;br /&gt;
====子元素====&lt;br /&gt;
&lt;br /&gt;
:如 扩展名字空间extended namespaces(第二章第四节)所述, 一个出席信息节可以(MAY)包含任何适当名字空间的子元素.&lt;br /&gt;
&lt;br /&gt;
:和缺省名字空间声明一致, 缺省出席信息节的名字空间是'jabber:client' 或 'jabber:server', 定义了某几个允许的出席信息节的子元素. 如果出席信息节的类型是 &amp;quot;error&amp;quot;, 它必须(MUST)包含一个&amp;lt;error/&amp;gt;子元素; 详细情况, 见[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]. 如果出席信息节不拥有'type'属性,它可以(MAY)包含以下任何子元素(注意&amp;lt;status/&amp;gt;子元素可以(MAY)在一个类型为&amp;quot;unavailable&amp;quot;或&amp;quot;subscribe&amp;quot;(出于历史原因)的出席信息中被发送):&lt;br /&gt;
&lt;br /&gt;
:#&amp;lt;show/&amp;gt;&lt;br /&gt;
:#&amp;lt;status/&amp;gt;&lt;br /&gt;
:#&amp;lt;priority/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====展示=====&lt;br /&gt;
&lt;br /&gt;
:可选的(OPTIONAL)&amp;lt;show/&amp;gt;元素包含非人类可读的XML字符数据表达一个特定的实体或资源的特定的可用性状态. 一个出席信息节不能(MUST NOT)包含多于一个&amp;lt;show/&amp;gt;元素. &amp;lt;show/&amp;gt;元素不能(MUST NOT)拥有任何属性. 如果提供了, 这个XML字符数据值必须(MUST)是以下之一(额外的可用性类型可以通过出席信息的适当名字空间来定义):&lt;br /&gt;
&lt;br /&gt;
:*away -- 实体或资源临时离开.&lt;br /&gt;
&lt;br /&gt;
:*chat -- 实体或资源在聊天中是激活的.&lt;br /&gt;
&lt;br /&gt;
:*dnd -- 实体或资源是忙(dnd = &amp;quot;不要打扰&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
:*xa -- 实体或资源是长时间的离开(xa = &amp;quot;长时间离开&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
:如果没有提供&amp;lt;show/&amp;gt;元素, 实体被假定是在线和可用的.&lt;br /&gt;
&lt;br /&gt;
=====状态=====&lt;br /&gt;
&lt;br /&gt;
:可选的(OPTIONAL)&amp;lt;status/&amp;gt;元素包含XML字符数据表达一个可用性状态的自然语言描述. 它通常用于联合show元素以提供可用性状态的详细描述(例如, &amp;quot;会议中&amp;quot;). &amp;lt;status/&amp;gt;元素不能(MUST NOT)拥有任何属性,除了'xml:lang'属性. &amp;lt;status/&amp;gt;元素可以(MAY)包含多个实例但是每个实例的'xml:lang'属性值必须各不相同.&lt;br /&gt;
&lt;br /&gt;
=====优先权=====&lt;br /&gt;
&lt;br /&gt;
:可选的(OPTIONAL)&amp;lt;priority/&amp;gt;元素包含非人类可读的XML字符数据指明资源的优先级别. 这个值必须(MUST)是一个介于-128和+127之间的数字. 一个出席信息小节不能(MUST NOT)包含超过一个的&amp;lt;priority/&amp;gt;元素. &amp;lt;priority/&amp;gt;元素不能(MUST NOT)拥有任何属性. 如果没有优先权被提供,一个服务器应该(SHOULD)认为优先级是零. 关于即时消息和出席信息系统中节路由的优先级的语义, 参考 处理XML节的服务器规则Server Rules for Handling XML Stanzas(第十一章).&lt;br /&gt;
&lt;br /&gt;
===IQ语法===&lt;br /&gt;
&lt;br /&gt;
:IQ节提供一个结构化的请求-应答机制. 这个机制的基本语义学(例如, 'id'属性是必需的(REQUIRED))定义在[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920], 然而完成特定用例所需要的特定语义的所有案例定义在扩展名字空间extended namespace(第二章第四节)之中(注意'jabber:client'和'jabber:server'名字空间没有定义除通用的&amp;lt;error/&amp;gt;子元素之外的任何IQ节子元素). 本文定义了两个这样的名字空间,一个用于 名册管理Roster Management(第七章)而另一个用于 屏蔽通信Blocking Communication(第十章); 无论如何, 一个IQ节可以(MAY)包含符合任何扩展名字空间的结构化信息.&lt;br /&gt;
&lt;br /&gt;
===扩展名字空间===&lt;br /&gt;
&lt;br /&gt;
:因为在&amp;quot;jabber:client&amp;quot;或&amp;quot;jabber:server&amp;quot;名字空间中定义的三个XML节类型(也包括它们的属性和子元素)提供了一个基本功能级用于消息和出席信息, XMPP使用XML名字空间来扩展节用于提供额外的功能, 所以一个消息或出席信息节可以(MAY)包含一个或更多可选的子元素表达扩展消息含义的内容(例如, 一个XHTML格式版本的消息主体), 并且一个IQ节可以(MAY)包含一个这样的子元素. 这个子元素可以(MAY)有任何名字并且可以(MUST)拥有一个'xmlns'名字空间声明(不同于&amp;quot;jabber:client&amp;quot;, &amp;quot;jabber:server&amp;quot;, 或&amp;quot;http://etherx.jabber.org/streams&amp;quot;)定义所有包含在子元素中的数据.&lt;br /&gt;
&lt;br /&gt;
:对于任何特定的扩展名字空间的支持在任何实现中的一部分是可选的(OPTIONAL)(除了在这里定义的扩展名字空间以外). 如果一个实体不理解这样一个名字空间, 实体被期望的行为依赖于这个实体是(1) 接收者 或 (2) 一个正在路由到接收者的实体&lt;br /&gt;
&lt;br /&gt;
:接收者: 如果一个接收者接收了一个包含不理解的子元素的节, 它应该(SHOULD)忽略那个特定的XML数据,例如, 它应该(SHOULD)不处理它或不向用户或相关的应用程序(如果有的话)显示它. 具体来说:&lt;br /&gt;
&lt;br /&gt;
::*如果一个实体接收了一个消息或出席信息节包含一个不理解的名字空间, 在节的未知名字空间的这部分应该(SHOULD)被忽略.&lt;br /&gt;
&lt;br /&gt;
::*如果一个实体接收了一个消息节中仅有的一个子元素是不理解的, 它必须(MUST)忽略整个节.&lt;br /&gt;
&lt;br /&gt;
::*如果一个实体接收了一个类型&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;的IQ节包含一个不理解的子元素, 这个实体应该(SHOULD)返回一个类型为&amp;quot;error&amp;quot;的&amp;lt;service-unavailable/&amp;gt;错误条件的IQ节.&lt;br /&gt;
&lt;br /&gt;
:路由: 如果一个路由实体(通常是一个服务器)处理一个包含它不理解的子元素的节, 它应该(SHOULD)原封不动地把它转给接收者而忽略相关的XML数据.&lt;br /&gt;
&lt;br /&gt;
==会话的建立==&lt;br /&gt;
&lt;br /&gt;
:绝大部分基于XMPP的消息和出席信息应用是由一个客户端-服务器体系结构实现的,为了参加期望的即时消息和出席信息活动,需要客户端在服务器上建立一个会话. 无论如何, 在客户端能够建立一个即时消息和出席信息会话之前有很多前提必须(MUST)满足. 它们是:&lt;br /&gt;
&lt;br /&gt;
:#流验证 -- 客户端在尝试建立一个会话或发送任何XML节之前必须(MUST)完成[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]中定义的流验证.&lt;br /&gt;
:#资源绑定 -- 完成流验证之后, 一个客户端必须(MUST)绑定一个资源到流上,使得客户端的地址符合&amp;lt;user@domain/resource&amp;gt;格式, 然后实体以[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]规定的术语来说就是一个 已连接的资源&amp;quot;connected resource&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:如果一个服务器支持会话, 在完成一个[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]定义的流验证之后它必须(MUST)在它向客户端声明的流特性中包含一个符合'urn:ietf:params:xml:ns:xmpp-session'名字空间的&amp;lt;session/&amp;gt;元素:&lt;br /&gt;
&lt;br /&gt;
:服务器向客户端声明会话确定特性:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&lt;br /&gt;
       id='c2s_345'&lt;br /&gt;
       from='example.com'&lt;br /&gt;
       version='1.0'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/&amp;gt;&lt;br /&gt;
     &amp;lt;session xmlns='urn:ietf:params:xml:ns:xmpp-session'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:收到需要会话确立的通知之后(并且是在完成资源绑定之后), 客户端如果想使用即时消息和出席信息功能必须(MUST)建立一个会话; 它向服务器发送一个符合'urn:ietf:params:xml:ns:xmpp-session'名字空间的类型为&amp;quot;set&amp;quot;并包含空的&amp;lt;session/&amp;gt;子元素的IQ节以完成这一步骤:&lt;br /&gt;
&lt;br /&gt;
:步骤 1: 客户端向服务器请求会话:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='example.com'&lt;br /&gt;
       type='set'&lt;br /&gt;
       id='sess_1'&amp;gt;&lt;br /&gt;
     &amp;lt;session xmlns='urn:ietf:params:xml:ns:xmpp-session'/&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:步骤 2: 服务器通知客户端会话已经建立:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='example.com'&lt;br /&gt;
       type='result'&lt;br /&gt;
       id='sess_1'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:建立会话之后, 一个 已连接的资源([XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]术语)就被称为一个 激活的资源&amp;quot;active resource&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:许多错误条件是可能的. 例如, 服务器可能遭遇一个内部条件阻碍了它建立会话, 用户名或授权身份可能缺乏建立会话的许可, 或同一个名字相关的这个资源ID已经有一个激活的资源.&lt;br /&gt;
&lt;br /&gt;
:如果服务器遭到一个内部条件阻碍了它建立会话, 它必须(MUST)返回一个错误.&lt;br /&gt;
&lt;br /&gt;
:步骤 2 (替代): 服务器应答一个错误(内部服务器错误):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='example.com' type='error' id='sess_1'&amp;gt;&lt;br /&gt;
     &amp;lt;session xmlns='urn:ietf:params:xml:ns:xmpp-session'/&amp;gt;&lt;br /&gt;
     &amp;lt;error type='wait'&amp;gt;&lt;br /&gt;
       &amp;lt;internal-server-error&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:如果用户名或资源不被允许建立一个会话, 服务器必须(MUST)返回一个错误(例如, 被禁止).&lt;br /&gt;
&lt;br /&gt;
:步骤 2 (替代): 服务器应答错误(用户名或资源不被允许建立一个会话):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='example.com' type='error' id='sess_1'&amp;gt;&lt;br /&gt;
     &amp;lt;session xmlns='urn:ietf:params:xml:ns:xmpp-session'/&amp;gt;&lt;br /&gt;
     &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
       &amp;lt;forbidden&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:如果同一名字已经存在一个激活的资源,服务器必须(MUST) (1) 终止这个激活的资源并允许新请求的会话, 或者 (2) 不允许新申请的会话并继续激活的资源. 服务器做哪一步取决于具体的实现, 尽管建议的(RECOMMENDED)实现 情景 #1. 在 情景 #1, 服务器应该(SHOULD)发送一个&amp;lt;conflict/&amp;gt;流错误给激活的资源, 终止用于这个激活的资源的XML流和相关的TCP连接, 并返回一个类型为&amp;quot;result&amp;quot; 的IQ节(表示成功)给新申请的会话. 在 情景 #2, 服务器应该(SHOULD)发送一个&amp;lt;conflict/&amp;gt;节错误给新申请的会话但是继续那个连接的XML流使得新申请的会话在发送另一个会话建立申请之前有机会协商出一个不冲突的资源ID.&lt;br /&gt;
&lt;br /&gt;
:步骤 2 (替代): 服务器通知现有的激活的资源 资源冲突(情景 #1):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:步骤 2 (替代): 服务器通知新申请的的会话资源冲突(情景 #2):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='example.com' type='error' id='sess_1'&amp;gt;&lt;br /&gt;
     &amp;lt;session xmlns='urn:ietf:params:xml:ns:xmpp-session'/&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:建立一个会话之后, 客户端应该(SHOULD)按以下描述来发送初始化出席信息并请求它的名册, 尽管这些动作是可选的(OPTIONAL).&lt;br /&gt;
&lt;br /&gt;
:注意: 在允许建立即时消息和出席信息会话之前, 一个服务器可能(MAY)需要先提供帐号. 可能的提供帐号的方法包括由服务器管理员新建帐号以及使用'jabber:iq:register'名字空间进行带内帐号注册; 后一个方法超出了本文的范围, 但是记录在[JEP-0077]（译者注：这个协议已改名为 XEP-0077）, 由 Jabber Software Foundation [JSF]发行（译者注：这个组织也已改名为XSF）.&lt;br /&gt;
&lt;br /&gt;
==交换消息==&lt;br /&gt;
&lt;br /&gt;
:交换消息是XMPP的一个基本用途并且随之而来的是一个用户生成一个发给另一个实体的消息节. 正如 用于处理XML节的服务器规则Server Rules for Handling XML Stanzas(第十一章)中所定义的 , 发送者的服务器负责递送消息给预定的接收者(如果接收者在同一个服务器上)或路由消息给接收者的服务器(如果接收者在不同的服务器上).&lt;br /&gt;
&lt;br /&gt;
:关于消息节的语法和它们已定义的属性和子元素信息, 参考 消息语法Message Syntax(第二章第一节).&lt;br /&gt;
&lt;br /&gt;
===指明一个预定的接收者===&lt;br /&gt;
&lt;br /&gt;
:一个即时消息客户端应该(SHOULD)通过提供一个JID或&amp;lt;message/&amp;gt;节中不同于发送者的'to'属性来指定一个消息的预定接收者. 如果这个消息是在回复之前接收到的消息,而接收到的消息是从JID格式为&amp;lt;user@domain/resource&amp;gt;(例如,在一个聊天会话的上下文中)实体发来的, 这个回复消息的'to'地址的值应该(SHOULD)是&amp;lt;user@domain/resource&amp;gt;而不是&amp;lt;user@domain&amp;gt;,除非发送者知道(通过出席信息)预定的接收者的资源将不再可用. 如果消息是在任何现存的聊天会话或接收到的消息之外被发送的,'to'地址的值应该(SHOULD)格式为&amp;lt;user@domain&amp;gt;而不是&amp;lt;user@domain/resource&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===指定一个消息类型===&lt;br /&gt;
&lt;br /&gt;
:大家知道, 对于一个消息节来说拥有'type'属性(它的值代表了消息的会话上下文(参见 Type(第二章第一节第一小节)))是建议的(RECOMMENDED).&lt;br /&gt;
&lt;br /&gt;
:以下例子展示一个'type'属性的合法值:&lt;br /&gt;
&lt;br /&gt;
:例子: 一个已定义类型的消息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;message&lt;br /&gt;
       to='romeo@example.net'&lt;br /&gt;
       from='juliet@example.com/balcony'&lt;br /&gt;
       type='chat'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;Wherefore art thou, Romeo?&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===指定一个消息主体===&lt;br /&gt;
&lt;br /&gt;
:一个消息节可以(MAY)(并且经常会)包含一个&amp;lt;body/&amp;gt;子元素,它的XML字符数据表达消息的主要含义(见 Body(第二章第一节第二小节第二小小节)).&lt;br /&gt;
&lt;br /&gt;
:例子: 一个带主体的消息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;message&lt;br /&gt;
       to='romeo@example.net'&lt;br /&gt;
       from='juliet@example.com/balcony'&lt;br /&gt;
       type='chat'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;Wherefore art thou, Romeo?&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body xml:lang='cz'&amp;gt;Pro&amp;amp;#x010D;e&amp;amp;#x017D; jsi ty, Romeo?&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===指定一个消息主题===&lt;br /&gt;
&lt;br /&gt;
:一个消息节可以(MAY)包含一个或多个&amp;lt;subject/&amp;gt;子元素指明消息的主题(见 Subject(第二章第一节第二小节第一小小节)).&lt;br /&gt;
&lt;br /&gt;
:例子: 一个带主题的消息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;message&lt;br /&gt;
       to='romeo@example.net'&lt;br /&gt;
       from='juliet@example.com/balcony'&lt;br /&gt;
       type='chat'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;subject&amp;gt;I implore you!&amp;lt;/subject&amp;gt;&lt;br /&gt;
     &amp;lt;subject&lt;br /&gt;
         xml:lang='cz'&amp;gt;&amp;amp;#x00DA;p&amp;amp;#x011B;nliv&amp;amp;#x011B; prosim!&amp;lt;/subject&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;Wherefore art thou, Romeo?&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body xml:lang='cz'&amp;gt;Pro&amp;amp;#x010D;e&amp;amp;#x017D; jsi ty, Romeo?&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===指定一个会话线索===&lt;br /&gt;
&lt;br /&gt;
:一个消息可以(MAY)包含一个&amp;lt;thread/&amp;gt;子元素指定消息处于哪个会话线索, 用于跟踪会话(见 Thread(第二章第一节第二小节第三小小节)).&lt;br /&gt;
&lt;br /&gt;
:例子: 一个带线索的会话:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;message&lt;br /&gt;
       to='romeo@example.net/orchard'&lt;br /&gt;
       from='juliet@example.com/balcony'&lt;br /&gt;
       type='chat'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;Art thou not Romeo, and a Montague?&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
   &amp;lt;message&lt;br /&gt;
       to='juliet@example.com/balcony'&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       type='chat'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;Neither, fair saint, if either thee dislike.&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
   &amp;lt;message&lt;br /&gt;
       to='romeo@example.net/orchard'&lt;br /&gt;
       from='juliet@example.com/balcony'&lt;br /&gt;
       type='chat'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;How cam'st thou hither, tell me, and wherefore?&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==交换出席信息==&lt;br /&gt;
&lt;br /&gt;
:交换出席信息通过使用出席信息节直接和XMPP相关. 无论如何, 我们看到在这里和消息处理形成一个对比:尽管一个客户端可以(MAY)通过包含一个'to'地址直接给另一个实体发送出席信息, 通常出席信息通知(例如,不包含'type'的或类型为&amp;quot;unavailable&amp;quot;的并且没有'to'地址的出席信息节) 被客户端发送给它的服务器然后由服务器广播给任何订阅了发送实体的出席信息的实体(在 RFC 2778 [IMP-MODEL]术语中, 这些实体称为订阅者). 这个广播模式不适用于和订阅相关的节或类型为&amp;quot;error&amp;quot;的出席信息, 而仅适用于以上定义的出席信息通知.  (注意: 虽然出席信息可以(MAY)由一个自动化服务代替用户提供, 通常它还是由用户的客户端提供.)&lt;br /&gt;
&lt;br /&gt;
:关于出席信息节的语法以及它们的已定义的属性和子元素的信息, 参考[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920].&lt;br /&gt;
&lt;br /&gt;
===客户端和服务器出席信息职责===&lt;br /&gt;
&lt;br /&gt;
====初始化出席信息====&lt;br /&gt;
&lt;br /&gt;
:建立起一个会话之后, 一个客户端应该(SHOULD)发送初始化出席信息给服务器来通知它的通信可用性.如这里定义的, 初始化出席信息节 (1) 必须(MUST) 不拥有'to'地址(这表示它是由服务器代替客户端发送的广播) 并且 (2) 必须(MUST) 不拥有'type'属性(者表示拥护的可用性). 在发送初始化出席信息之后, 一个激活的资源被称为 可用的资源&amp;quot;available resource&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:从一个客户端接收到初始化出席信息之后, 如果这个用户没有一个或更多的已存在的可用资源(如果这个用户已经有一个或更多可用的资源, 服务器明显不需要发送出席信息探测, 因为它已经拥有需要的信息),用户的服务器必须(MUST)做以下的步骤:&lt;br /&gt;
&lt;br /&gt;
:#从用户的全JID(例如,&amp;lt;user@example.com/resource&amp;gt;)发送出席信息探针(例如, 'type'属性值为'probe'的出席信息节)给已被这个用户订阅了的所有联系人以确定它们是否可用; 这些联系人就是那些显示在用户的名册中的JID并且'subscription'属性值为&amp;quot;to&amp;quot;或&amp;quot;both&amp;quot;(注意: 用户的服务器不能(MUST NOT)发送出席信息探针给用户已经屏蔽入站出席信息通知的联系人, 具体的描述在 屏蔽入站出席信息通知Blocking Inbound Presence Notifications(第十章第十节).)&lt;br /&gt;
:#从用户的全JID (e.g.,&amp;lt;user@example.com/resource&amp;gt;)广播初始化出席信息给所有订阅了该用户的出席信息的联系人; 这些联系人就是那些显示在用户的名册中的JID并且'subscription'属性值为&amp;quot;from&amp;quot;或&amp;quot;both&amp;quot;(注意: 用户的服务器不能(MUST NOT)发送出席信息探针给用户已经屏蔽出站出席信息通知的联系人, 具体的描述在 屏蔽出站出席信息通知Blocking Outbound Presence Notifications(第十章第十一节).)&lt;br /&gt;
&lt;br /&gt;
:另外, 用户的服务器必须(MUST)从用户的新的可用的资源向用户任何现存的可用的资源(如果有的话)广播初始化出席信息.&lt;br /&gt;
&lt;br /&gt;
:从用户接收到初始化出席信息之后, 联系人的服务器必须(MUST)递送这个用户的出席信息节给所有联系人的可用资源相应的全JID(&amp;lt;contact@example.org/resource&amp;gt;), 但是仅适用于用户在联系人名册中并且订阅状态为&amp;quot;to&amp;quot;或&amp;quot;both&amp;quot;并且联系人的纯JID或全JID没有被屏蔽入站出席信息通知(定义在 屏蔽入站出席信息通知Blocking Inbound Presence Notifications(第十章第十节)).&lt;br /&gt;
&lt;br /&gt;
:如果用户的服务器接收到一个类型为&amp;quot;error&amp;quot;的出席信息节,而这个节是用来回复服务器代替用户向联系人发送的初始化出席信息, 它不应该(SHOULD NOT)发送更多的出席信息更新给那个联系人(直到并且除非它从这个联系人接收到一个出席信息节).&lt;br /&gt;
&lt;br /&gt;
====出席信息广播====&lt;br /&gt;
&lt;br /&gt;
:发送初始化出席信息之后, 用户可以(MAY)在任何时候更新它的出席信息,方法是在会话期间发送一个没有'to'地址也没有'type'属性的出席信息节或'type'属性值为&amp;quot;unavailable&amp;quot;的出席信息节.(注意:一个用户的客户端不应该(SHOULD NOT)发送一个出席信息更新来自行广播用户出席信息和可用性的改变信息.)&lt;br /&gt;
&lt;br /&gt;
:如果出席信息节缺乏'type'属性(例如, 表达可用性), 用户的服务器必须(MUST)广播那个出席信息节的全XML给所有联系人(满足以下三点) (1) 它们在用户的联系人名册中并且订阅类型是&amp;quot;from&amp;quot;或&amp;quot;both&amp;quot;, (2) 用户对于这些联系人没有屏蔽出站出席信息通知, 并且 (3) 服务器在用户的会话期间没有从它们那里接收到出席信息错误(同样适用于这个用户的其他可用的资源).&lt;br /&gt;
&lt;br /&gt;
:如果出席信息节的'type'属性值是&amp;quot;unavailable&amp;quot;, 用户的服务器必须(MUST)广播那个出席信息节的全XML给所有符合以上描述的实体, 也适用于用户曾经在会话过程中直接发送了可用出席信息的任何实体(如果用户还没来得及直接发送不可用出席信息给那个实体).&lt;br /&gt;
&lt;br /&gt;
====出席信息调查====&lt;br /&gt;
&lt;br /&gt;
:从用户接收到一个出席信息调查之后, 联系人的服务器应该(SHOULD)应答如下:&lt;br /&gt;
&lt;br /&gt;
:#如果用户联系人的名册中的状态不是 &amp;quot;From&amp;quot;, &amp;quot;From + Pending Out&amp;quot;, 或 &amp;quot;Both&amp;quot; (定义在 订阅状态Subscription States(第九章)), 联系人的服务器必须(MUST)返回一个类型为&amp;quot;error&amp;quot;的出席信息节应答这个出席信息调查 (无论如何, 如果一个服务器从这个服务器的主机名的子域或其他信任的服务接收到一个出席信息调查, 它可以(MAY)提供这个用户的出席信息给那个实体). 具体来说:&lt;br /&gt;
:##如果用户在联系人的名册中的订阅状态是 &amp;quot;None&amp;quot;, &amp;quot;None + Pending Out&amp;quot;, 或 &amp;quot;To&amp;quot; (或根本不在联系人的名册中), 联系人的服务器必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;节错误应答这个出席信息调查.&lt;br /&gt;
:##如果用户在联系人的名册中的订阅状态是 &amp;quot;None + Pending In&amp;quot;, &amp;quot;None + Pending Out/In&amp;quot;, 或 &amp;quot;To + Pending In&amp;quot;, 联系人的服务器必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;节错误应答这个出席信息调查.&lt;br /&gt;
:#其次, 如果联系人对这个用户的纯JID或全JID屏蔽了出席信息通知(使用缺省列表或激活列表,定义在 屏蔽出站出席信息通知Blocking Outbound Presence Notifications (第十章第十一节)), 服务器不能(MUST NOT)应答这个出席信息调查.&lt;br /&gt;
:#然后, 如果联系人没有可用的资源, 服务器必须(MUST) 要么 (1) 应答这个出席信息调查, 向这个用户发送服务器从联系人接收到的最后的类型为&amp;quot;unavailable&amp;quot;的出席信息节的全XML, 或 (2) 不应答.&lt;br /&gt;
:#最后, 如果联系人至少有一个可用的资源, 服务器必须(MUST)应答这个出席信息调查, 向这个用户发送服务器从联系人的每一个可用的资源收到的最后的没有'to'属性的出席信息节的全XML (再一次的,对于每一个会话都要强制服从隐私列表).&lt;br /&gt;
&lt;br /&gt;
====直接出席信息====&lt;br /&gt;
&lt;br /&gt;
:一个用户可以(MAY)直接发送出席信息给另一个实体 (例如, 一个出席信息节,包含'to'属性并且值为另一个实体的JID并且没有'type'属性或'type'属性值为&amp;quot;unavailable&amp;quot;). 可能出现三种情形:&lt;br /&gt;
&lt;br /&gt;
:#如果用户在已经发送过初始化出席信息广播之后,发送不可用信息广播之前,直接发送出席信息给它的名册中一个订阅状态为&amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;的联系人, 这个用户的服务器必须(MUST)路由或递送这个出席信息节的全XML(服从隐私列表)但是不应该(SHOULD NOT) 根据出席信息广播修改联系人的状态(例如, 它应该(SHOULD)在任何接下来的由用户初始化的出席信息广播包含这个联系人的JID).&lt;br /&gt;
:#如果用户在已经发送过初始化出席信息广播之后,发送不可用信息广播之前,直接发送出席信息给一个不在用户名册中的实体并且其订阅状态为&amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;, 这个用户的服务器必须(MUST)路由或递送这个出席信息节的全XML(服从隐私列表)但是不能(MUST NOT) 根据可用性的出席信息广播来修改这个联系人的状态(例如, 它不能(MUST NOT)在任何接下来的由用户初始化的可用性的出席信息广播中包含这个联系人的JID); 无论如何, 如果无法从用户的可用的资源直接发送出席信息, 用户的服务器必须(       MUST)广播不可用出席信息给那个实体(如果这个用户还没有直接发送不可用出席信息给那个实体).&lt;br /&gt;
:#如果用户不是在已经发送过初始化出席信息广播之后,或在发送不可用信息广播之前,直接发送出席信息(例如, 资源激活了但是还不可用), 用户的服务器必须(MUST)认为用户向其直接发送出席信息的这个实体视为上述第二种情形中的那个实体,采用相同的处理方式.&lt;br /&gt;
&lt;br /&gt;
====不可用出席信息====&lt;br /&gt;
&lt;br /&gt;
:在和一个服务器结束它的会话之前, 客户端应该(SHOULD)雅致地成为不可用的,发送一个最后的没有'to'属性并且'type'属性值为&amp;quot;unavailable&amp;quot;的出席信息节(可选的, 最后的出席信息节可以(MAY)包含一个或多个&amp;lt;status/&amp;gt;元素以指明为什么用户不再可用). 无论如何, 用户的服务器不能(MUST NOT)依赖于从一个可用的资源接收最后的出席信息, 因为资源可能意外的变成不可用或可能被服务器判定超时. 如果用户的资源之一因为任何原因成为不可用的(包括雅致的或粗鲁的), 用户的服务器必须(MUST)广播不可用出席信息给所有如下的联系人 (1) 在用户的名册中并且订阅类型为 &amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;, (2) 用户没有对它们屏蔽出站出席信息的联系人, 以及 (3) 用户会话期间,服务器没有从它们那里收到出席信息错误的联系人; 用户的服务器也必须(MUST)发送不可用出席信息节给这个用户的任何其他可用的资源, 以及任何用户的资源曾经在会话期间直接向其发送过出席信息的实体(如果用户还没有直接发送不可用出席信息给那个实体). 在直接发送或广播不可用出席信息之后发送的任何没有'type'属性也没有'to'属性的出席信息节必须(MUST)由服务器广播给所有订阅者.&lt;br /&gt;
&lt;br /&gt;
====出席信息订阅====&lt;br /&gt;
&lt;br /&gt;
:一个订阅请求就是一个'type'属性值为&amp;quot;subscribe&amp;quot;的出席信息节. 如果订阅请求被发送给一个即时消息联系人, 在'to'属性中提供的JID的格式应该(SHOULD)是&amp;lt;contact@example.org&amp;gt;而不是&amp;lt;contact@example.org/resource&amp;gt;, 因为用户期望的结果通常是从联系人的所有资源接收到出席信息, 而不仅是'to'属性中的特定资源.&lt;br /&gt;
&lt;br /&gt;
:一个用户的服务器不能(MUST NOT)代替用户自动批准订阅请求. 所有订阅申请必须(MUST)直接发给用户的客户端, 具体来说就是这一用户的一个或多个可用的资源. 如果当订阅申请被用户的服务器接收到的时候没有这个用户的可用资源, 用户的服务器必须(MUST)保持这个订阅申请的记录并且在用户下次建立一个可用的资源时递送这个订阅申请, 直到这个用户批准或拒绝这个请求. 如果如果当订阅申请被用户的服务器接收到的时候这个用户有多于一个的可用资源, 用户的服务器必须(MUST)广播这个订阅申请给所有可用的资源(根据 处理XML节的服务器规则Server Rules for Handling XML Stanzas(第十一章)). (注意: 如果一个激活的资源还没有提供初始化出席信息, 服务器不能(MUST NOT)认为它是可用的并且因而不能(MUST NOT)发送订阅申请给它.) 无论如何, 如果用户从一个它已授权可以看到用户的出席信息的联系人那里收到一个类型为&amp;quot;subscribe&amp;quot;的出席信息节(例如, 当一个联系人重新同步订阅状态的时候),用户的服务器应该(SHOULD)代替用户自动应答. 另外, 用户的服务器可以(MAY)基于一个特定实现的法则(例如, 无论何时当用户的一个新的资源可用的时候, 或在一段特定长度的时间过去之后)选择重新发送一个未批准的未决订阅申请给这个联系人; 这有助于恢复可能和原始订阅申请有关的瞬间的,无声的错误.&lt;br /&gt;
&lt;br /&gt;
===指明可用性状态===&lt;br /&gt;
&lt;br /&gt;
:一个客户端可以(MAY)使用&amp;lt;show/&amp;gt;元素提供关于可用性状态的更多信息(参见 Show (第二章第二节第二小节第一小小节)).&lt;br /&gt;
&lt;br /&gt;
:例子: 可用性状态:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;show&amp;gt;dnd&amp;lt;/show&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===指明详细的可用性状态信息===&lt;br /&gt;
&lt;br /&gt;
:通过联合&amp;lt;show/&amp;gt;元素, 客户端使用&amp;lt;status/&amp;gt;元素可以(MAY)提供详细的可用性状态信息(参见Status (第二章第二节第二小节第二小小节)).&lt;br /&gt;
&lt;br /&gt;
:例子: 详细的状态信息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;show&amp;gt;dnd&amp;lt;/show&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;Wooing Juliet&amp;lt;/status&amp;gt;&lt;br /&gt;
     &amp;lt;status xml:lang='cz'&amp;gt;Ja dvo&amp;amp;#x0159;&amp;amp;#x00ED;m Juliet&amp;lt;/status&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===指明出席信息优先级===&lt;br /&gt;
&lt;br /&gt;
:客户端可以(MAY)使用&amp;lt;priority/&amp;gt;元素为它的资源提供优先级(参见 Priority (第二章第二节第二小节第三小小节)).&lt;br /&gt;
&lt;br /&gt;
:例子: 出席信息优先级:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;show&amp;gt;dnd&amp;lt;/show&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;Wooing Juliet&amp;lt;/status&amp;gt;&lt;br /&gt;
     &amp;lt;status xml:lang='cz'&amp;gt;Ja dvo&amp;amp;#x0159;&amp;amp;#x00ED;m Juliet&amp;lt;/status&amp;gt;&lt;br /&gt;
     &amp;lt;priority&amp;gt;1&amp;lt;/priority&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===出席信息例子===&lt;br /&gt;
&lt;br /&gt;
:本章的例子用于阐明上述和出席信息相关的协议. 用户是 romeo@example.net, 他有一个可用的资源, 资源ID为 &amp;quot;orchard&amp;quot;, 并且他的名册中有以下这些人:&lt;br /&gt;
&lt;br /&gt;
:*juliet@example.com (subscription=&amp;quot;both&amp;quot; 并且她有两个可用的资源, 一个资源名为&amp;quot;chamber&amp;quot; 而另一个资源名为 &amp;quot;balcony&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
:*benvolio@example.org (subscription=&amp;quot;to&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
:*mercutio@example.org (subscription=&amp;quot;from&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
:例子 1: 用户发送初始化出席信息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子 2: 用户的服务器代替用户发送出席信息调查给 subscription=&amp;quot;to&amp;quot; 和 subscription=&amp;quot;both&amp;quot; 的联系人的可用资源:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       type='probe'&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       to='juliet@example.com'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       type='probe'&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       to='benvolio@example.org'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子 3: 用户的服务器代替用户发送初始化出席信息给 subscription=&amp;quot;from&amp;quot; 和 subscription=&amp;quot;both&amp;quot;的联系人的可用资源:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       to='juliet@example.com'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       to='mercutio@example.org'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子 4: 联系人的服务器代替所有可用的资源应答出席信息调查:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='juliet@example.com/balcony'&lt;br /&gt;
       to='romeo@example.net/orchard'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;show&amp;gt;away&amp;lt;/show&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;be right back&amp;lt;/status&amp;gt;&lt;br /&gt;
     &amp;lt;priority&amp;gt;0&amp;lt;/priority&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='juliet@example.com/chamber'&lt;br /&gt;
       to='romeo@example.net/orchard'&amp;gt;&lt;br /&gt;
     &amp;lt;priority&amp;gt;1&amp;lt;/priority&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='benvolio@example.org/pda'&lt;br /&gt;
       to='romeo@example.net/orchard'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;show&amp;gt;dnd&amp;lt;/show&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;gallivanting&amp;lt;/status&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子 5: 联系人的服务器递送用户的初始化出席信息给所有可用的资源或返回错误给用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       to='juliet@example.com/chamber'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       to='juliet@example.com/balcony'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       type='error'&lt;br /&gt;
       from='mercutio@example.org'&lt;br /&gt;
       to='romeo@example.net/orchard'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;gone xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子 6: 用户直接发送出席信息给另一个不在他的名册中的用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       to='nurse@example.com'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;show&amp;gt;dnd&amp;lt;/show&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;courting Juliet&amp;lt;/status&amp;gt;&lt;br /&gt;
     &amp;lt;priority&amp;gt;0&amp;lt;/priority&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子 7: 用户发送更新的可用出席信息用于广播:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;show&amp;gt;away&amp;lt;/show&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;I shall return!&amp;lt;/status&amp;gt;&lt;br /&gt;
     &amp;lt;priority&amp;gt;1&amp;lt;/priority&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子 8: 用户的服务器仅向一个联系人广播更新的出席信息 (不是那些返回错误的联系人,也不是那些用户直接向其发送出席信息的联系人):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       to='juliet@example.com'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;show&amp;gt;away&amp;lt;/show&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;I shall return!&amp;lt;/status&amp;gt;&lt;br /&gt;
     &amp;lt;priority&amp;gt;1&amp;lt;/priority&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子 9: 联系人的服务器递送更新的出席信息给联系人所有可用的资源:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   [to &amp;quot;balcony&amp;quot; resource...]&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       to='juliet@example.com'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;show&amp;gt;away&amp;lt;/show&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;I shall return!&amp;lt;/status&amp;gt;&lt;br /&gt;
     &amp;lt;priority&amp;gt;1&amp;lt;/priority&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
   [to &amp;quot;chamber&amp;quot; resource...]&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       to='juliet@example.com'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;show&amp;gt;away&amp;lt;/show&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;I shall return!&amp;lt;/status&amp;gt;&lt;br /&gt;
     &amp;lt;priority&amp;gt;1&amp;lt;/priority&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子 10: 联系人的资源之一广播最后出席信息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence from='juliet@example.com/balcony' type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子 11: 联系人的服务器发送不可用出席信息给用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       type='unavailable'&lt;br /&gt;
       from='juliet@example.com/balcony'&lt;br /&gt;
       to='romeo@example.net/orchard'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子 12: 用户发送最后出席信息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence from='romeo@example.net/orchard'&lt;br /&gt;
             type='unavailable'&lt;br /&gt;
             xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;gone home&amp;lt;/status&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子 13: 用户的服务器广播不可用出席信息给联系人,包括用户直接向其发送出席信息的那个人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       type='unavailable'&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       to='juliet@example.com'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;gone home&amp;lt;/status&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       to='nurse@example.com'&lt;br /&gt;
       xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;gone home&amp;lt;/status&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==管理订阅==&lt;br /&gt;
&lt;br /&gt;
:为了保护即时消息用户和任何其他实体的隐私, 出席信息和可用性信息仅向用户已批准的其他实体披露. 当一个用户同意其他用户可以看到它的出席信息, 这个实体被称为对于用户的出席信息有一个订阅. 订阅超越了会话; 实际上, 它一直存在直到订阅者取消订阅或被订阅者取消曾经授权的订阅为止. 在XMPP中订阅是通过发送包含特定属性的出席信息节来管理的.&lt;br /&gt;
&lt;br /&gt;
:注意: 在订阅和名册之间有重要的交互; 这些定义在 名册条目和出席信息订阅的集成Integration of Roster Items and Presence Subscriptions (第八章), 而且读者必须参考那一章才能完整地理解出席信息订阅.&lt;br /&gt;
&lt;br /&gt;
===请求一个订阅===&lt;br /&gt;
&lt;br /&gt;
:对另一个实体的出席信息的订阅请求是由发送一个类型为&amp;quot;subscribe&amp;quot;的出席信息节来开始的.&lt;br /&gt;
&lt;br /&gt;
:例子: 发送一个订阅请求:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='juliet@example.com' type='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:关于客户端和服务器在订阅请求中的职责, 参考 出席信息订阅Presence Subscriptions(第五章第一节第六小节).&lt;br /&gt;
&lt;br /&gt;
===处理一个订阅请求===&lt;br /&gt;
&lt;br /&gt;
:当一个客户端从另一个实体接收到一个订阅请求, 它必须(MUST)批准这个请求(发送一个类型为&amp;quot;subscribed&amp;quot;的出席信息节)或拒绝这个请求(发送一个类型为&amp;quot;unsubscribed&amp;quot;的出席信息节).&lt;br /&gt;
&lt;br /&gt;
:例子: 批准一个订阅请求:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='romeo@example.net' type='subscribed'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 拒绝一个出席信息订阅的请求:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='romeo@example.net' type='unsubscribed'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===从另一个实体取消一个订阅===&lt;br /&gt;
&lt;br /&gt;
:如果一个用户想取消一个曾经允许的订阅请求, 它发送一个类型为&amp;quot;unsubscribed&amp;quot;的出席信息节.&lt;br /&gt;
&lt;br /&gt;
:例子: 取消一个曾经允许的订阅请求:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='romeo@example.net' type='unsubscribed'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===取消对于另一个实体的出席信息的订阅===&lt;br /&gt;
&lt;br /&gt;
:如果用户想取消对于另一个实体的出席信息的订阅, 它发送一个类型为&amp;quot;unsubscribe&amp;quot;的出席信息节.&lt;br /&gt;
&lt;br /&gt;
:例子: 取消对一个实体的出席信息的订阅:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='juliet@example.com' type='unsubscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==名册管理==&lt;br /&gt;
&lt;br /&gt;
:在XMPP中, 一个人的联系人列表被称为名册(roster), 它包括任意数量的特定名册条目, 每个名册条目被一个唯一的JID(通常格式是&amp;lt;contact@domain&amp;gt;)所标识. 一个用户的名册由用户的服务器代替用户储存从而这个用户可以从任何资源访问名册信息.&lt;br /&gt;
&lt;br /&gt;
:注意: 在名册和订阅之间有重要的交互; 这些定义在 名册条目和出席信息订阅的集成Integration of Roster Items and Presence Subscriptions (第八章), 而且读者必须参考那一章才能完整地理解名册管理.&lt;br /&gt;
&lt;br /&gt;
===语法和语义===&lt;br /&gt;
&lt;br /&gt;
:名册使用IQ节来管理, 具体来说就是符合'jabber:iq:roster'名字空间的&amp;lt;query/&amp;gt;子元素的含义.这个&amp;lt;query/&amp;gt;元素可以(MAY)包含一个或更多&amp;lt;item/&amp;gt;子元素, 每个描述一个唯一的名册条目或曰 联系人&amp;quot;contact&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:每个名册条目的&amp;quot;key&amp;quot;或者说唯一标识符就是一个JID,封装在&amp;lt;item/&amp;gt;元素的'jid'属性(它是必需的(REQUIRED))之中. 如果这个条目是和另一个(人类)即时消息用户相关的,'jid'属性的值的格式应该(SHOULD)是&amp;lt;user@domain&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:和一个名册条目相关的出席信息订阅的状态从&amp;lt;item/&amp;gt;元素的'subscription'属性可以得到.这个属性允许的值包括:&lt;br /&gt;
&lt;br /&gt;
:* &amp;quot;none&amp;quot; -- 这个用户没有对这个联系人出席信息的订阅, 这个联系人也没有订阅用户的出席信息&lt;br /&gt;
&lt;br /&gt;
:* &amp;quot;to&amp;quot; -- 这个用户订阅了这个联系人的出席信息, 但是这个联系人没有订阅用户的出席信息&lt;br /&gt;
&lt;br /&gt;
:* &amp;quot;from&amp;quot; -- 这个联系人订阅了用户的出席信息, 但是这个用户没有订阅这个联系人的出席信息&lt;br /&gt;
&lt;br /&gt;
:* &amp;quot;both&amp;quot; -- 用户和联系人互相订阅了对方的出席信息&lt;br /&gt;
&lt;br /&gt;
:每个&amp;lt;item/&amp;gt;条目可以(MAY)包含一个'name'属性, 它设置和这个JID相关的&amp;quot;nickname&amp;quot;, 取决于用户(而不是联系人). 'name'属性的值是不透明的.&lt;br /&gt;
&lt;br /&gt;
:每个&amp;lt;item/&amp;gt;条目可以(MAY)包含一个或多个&amp;lt;group/&amp;gt;子元素,用于把名册条目收集到多个类别之中. &amp;lt;group/&amp;gt;子元素的XML字符数据是不透明的.&lt;br /&gt;
&lt;br /&gt;
===商业规则===&lt;br /&gt;
&lt;br /&gt;
:在一个名册&amp;quot;set&amp;quot;中一个服务器必须(MUST)忽略任何'to'地址, 并且必须(MUST)认为任何名册&amp;quot;set&amp;quot;是应用于发送者的. 为了更多的安全性, 一个客户端应该(SHOULD)检查&amp;quot;roster push&amp;quot;(包含一个名册条目的类型为&amp;quot;set&amp;quot;的输入IQ)的&amp;quot;from&amp;quot;地址以保证它来自一个信任的源; 具体的, 这个节必须(MUST)没有 'from'属性(例如, 从服务器隐含的) 或'from'属性的值匹配用户的纯JID(格式为&amp;lt;user@domain&amp;gt;)或全JID(格式为&amp;lt;user@domain/resource&amp;gt;); 否则, 客户端应该(SHOULD)忽略这个&amp;quot;roster push&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===登录时接收一个人的名册===&lt;br /&gt;
&lt;br /&gt;
:在连接到服务器并成为一个激活的资源之后, 一个客户端应该(SHOULD)在发送初始化出席信息之前请求名册(无论如何, 因为可能不是所有的资源都想接收名册, 例如, 一个带宽受限的连接, 客户端对于名册的请求是可选的(OPTIONAL)). 如果一个可用的资源在一个会话期间没有请求名册, 服务器不能(MUST NOT)向它发送出席信息订阅以及相关的名册更新.&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端向服务器请求当前的名册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='juliet@example.com/balcony' type='get' id='roster_1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'/&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端从服务器收到名册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='juliet@example.com/balcony' type='result' id='roster_1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item jid='romeo@example.net'&lt;br /&gt;
             name='Romeo'&lt;br /&gt;
             subscription='both'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;Friends&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;item jid='mercutio@example.org'&lt;br /&gt;
             name='Mercutio'&lt;br /&gt;
             subscription='from'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;Friends&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;item jid='benvolio@example.org'&lt;br /&gt;
             name='Benvolio'&lt;br /&gt;
             subscription='both'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;Friends&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===增加一个名册条目===&lt;br /&gt;
&lt;br /&gt;
:任何时候, 一个用户可以(MAY)增加一个条目到他或她的名册.&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端添加一个新的条目:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='juliet@example.com/balcony' type='set' id='roster_2'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item jid='nurse@example.com'&lt;br /&gt;
             name='Nurse'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;Servants&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:服务器必须(MUST)在持久信息存储机构中更新名册信息,并且也要向这个用户的所有已请求名册的可用资源推送这一改变. 这个&amp;quot;名册推送&amp;quot;包括一个类型为&amp;quot;set&amp;quot;的IQ节,从服务器发送给客户端,使用户的所有可用资源保持和基于服务器的名册信息的同步.&lt;br /&gt;
&lt;br /&gt;
:例子: 服务器 (1) 推送更新的名册信息给所有已请求名册的可用资源 并且 (2) 以一个IO结果应答发送的资源:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='juliet@example.com/balcony'&lt;br /&gt;
       type='set'&lt;br /&gt;
       id='a78b4q6ha463'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item jid='nurse@example.com'&lt;br /&gt;
             name='Nurse'&lt;br /&gt;
             subscription='none'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;Servants&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='juliet@example.com/chamber'&lt;br /&gt;
       type='set'&lt;br /&gt;
       id='a78b4q6ha464'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item jid='nurse@example.com'&lt;br /&gt;
             name='Nurse'&lt;br /&gt;
             subscription='none'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;Servants&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='juliet@example.com/balcony' type='result' id='roster_2'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:正如IQ节类型(定义在[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920])的语义所要求的,每个接收到了名册推送的资源必须(MUST)应答一个类型为&amp;quot;result&amp;quot;(或 &amp;quot;error&amp;quot;)的IQ节.&lt;br /&gt;
&lt;br /&gt;
:例子: 资源应答一个IQ结果给服务器:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='juliet@example.com/balcony'&lt;br /&gt;
       to='example.com'&lt;br /&gt;
       type='result'&lt;br /&gt;
       id='a78b4q6ha463'/&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='juliet@example.com/chamber'&lt;br /&gt;
       to='example.com'&lt;br /&gt;
       type='result'&lt;br /&gt;
       id='a78b4q6ha464'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===更新名册条目===&lt;br /&gt;
&lt;br /&gt;
:更新一个已有的名册条目(例如, 改变组) 的方法和增加一个新的名册条目是一样的, 换言之, 在IQ set 节中发送名册条目给服务器.&lt;br /&gt;
&lt;br /&gt;
:例子: 用户更新名册条目(增加组):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='juliet@example.com/chamber' type='set' id='roster_3'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item jid='romeo@example.net'&lt;br /&gt;
             name='Romeo'&lt;br /&gt;
             subscription='both'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;Friends&amp;lt;/group&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;Lovers&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:正如增加一个名册条目, 当更新一个名册条目时服务器必须(MUST)在持久信息存储机构中更新名册信息, 并且也要初始化一个名册推送给这个用户的所有已请求名册的可用资源.&lt;br /&gt;
&lt;br /&gt;
===删除一个名册条目===&lt;br /&gt;
&lt;br /&gt;
:任何时候, 用户可以(MAY)从他或她的名册中删除一个条目,只要发送一个 IQ set 给服务器并确保其'subscription'属性值为&amp;quot;remove&amp;quot; (如果从一个客户端接收到'subscription'属性的任何其他值,一个兼容的服务器必须(MUST)忽略它).&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端移除一个条目:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='juliet@example.com/balcony' type='set' id='roster_4'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item jid='nurse@example.com' subscription='remove'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:和增加一个名册条目一样, 删除一个名册条目的时候服务器必须(MUST)在持久信息存储机构中更新名册信息,初始化一个名册推送给这个用户的所有已请求名册的可用资源(伴随着把'subscription'属性值设为&amp;quot;remove&amp;quot;),并且发送一个 IQ result 给初始化资源.&lt;br /&gt;
&lt;br /&gt;
:关于这个命令的含义的更多信息, 见 移除一个名册条目并取消所有订阅Removing a Roster Item and Cancelling All Subscriptions (第八章第六节).&lt;br /&gt;
&lt;br /&gt;
==名册条目和出席信息订阅的集成==&lt;br /&gt;
&lt;br /&gt;
===概览===&lt;br /&gt;
&lt;br /&gt;
:关于用户从或向别的联系人订阅出席信息,一个即时消息用户通常希望在名册条目和出席信息订阅之间有某些层次的集成. 本章描述了在XMPP即时消息应用中必须(MUST)支持的那些层次的集成.&lt;br /&gt;
&lt;br /&gt;
:有四种主要的订阅状态:&lt;br /&gt;
&lt;br /&gt;
:* None -- 这个用户没有对这个联系人出席信息的订阅, 这个联系人也没有订阅用户的出席信息&lt;br /&gt;
&lt;br /&gt;
:* To -- 这个用户订阅了这个联系人的出席信息, 但是这个联系人没有订阅用户的出席信息&lt;br /&gt;
&lt;br /&gt;
:* From -- 这个联系人订阅了用户的出席信息, 但是这个用户没有订阅这个联系人的出席信息&lt;br /&gt;
&lt;br /&gt;
:* Both -- 用户和联系人互相订阅了对方的出席信息(例如, 联合'from' 和 'to')&lt;br /&gt;
&lt;br /&gt;
:这些状态的每一个都被反射到用户和联系人双方的名册中, 从而导致持久的订阅状态.&lt;br /&gt;
&lt;br /&gt;
:在以下的子章节中将叙述这些订阅状态如何为了完成特定的已定义的用例而进行交互. 关于服务器和客户端处理所有订阅状态的细节 (包括处于以上所列的状态之外的未决状态)在 订阅状态Subscription States(第九章).&lt;br /&gt;
&lt;br /&gt;
:服务器不能(MUST NOT)发送出席信息订阅请求或名册推送给不可用的资源, 也不能给没有已请求的名册的可用资源.&lt;br /&gt;
&lt;br /&gt;
:在名册推送中'from'和'to'地址是可选的(OPTIONAL); 如果包含了, 它们的值应该(SHOULD)是那个会话的资源的全JID. 一个客户端必须(MUST)以一个类型为&amp;quot;result&amp;quot;的IQ节来承认每个名册推送(为了暂时的原因, 这些节不显示在以下的例子中但是按[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]定义的IQ语义学的规定它们是必需的).&lt;br /&gt;
&lt;br /&gt;
===用户向联系人订阅===&lt;br /&gt;
&lt;br /&gt;
:以下描述一个用户向一个联系人订阅的过程, 包括名册条目和订阅状态之间的互动.&lt;br /&gt;
&lt;br /&gt;
:1. 为了能够在用户的客户端界面处理联系人以及在服务器跟踪订阅, 用户的客户端应该(SHOULD)为新的名册条目执行一个&amp;quot;roster set&amp;quot;. 这个请求包括发送一个类型为'set'的IQ节并拥有符合'jabber:iq:roster'名字空间的&amp;lt;query/&amp;gt;子元素, 它(&amp;lt;query/&amp;gt;元素)再包含一个&amp;lt;item/&amp;gt;子元素来定义新的名册条目; 这个&amp;lt;item/&amp;gt;元素必须(MUST)拥有一个'jid'属性, 可以(MAY)拥有一个'name'属性, 不能(MUST NOT)拥有一个'subscription'属性, 并且可以(MAY)包含一个或多个&amp;lt;group/&amp;gt;子元素:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set' id='set1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='contact@example.org'&lt;br /&gt;
           name='MyContact'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;MyBuddies&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. 作为结果, 这个用户的服务器 (1) 必须(MUST)为这个新的名册条目初始化一个名册推送给这个用户的所有已经请求名册的可用资源, 其'subscription'属性的值为 &amp;quot;none&amp;quot;; 并且 (2) 必须(MUST)以一个 IQ result 应答发送的资源表明名册设置成功了:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='contact@example.org'&lt;br /&gt;
           subscription='none'&lt;br /&gt;
           name='MyContact'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;MyBuddies&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' id='set1'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:3. 如果用户想向这个联系人请求出席信息的订阅, 用户的客户端必须(MUST)发送一个类型为'subscribe'的出席信息节给联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='contact@example.org' type='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:4. 作为结果, 用户的服务器必须(MUST)初始化第二个名册推送给这个用户的所有已经请求名册的可用资源,把这个联系人设置成'none'订阅状态的未决子状态; 这个未决子状态是由名册条目中包含的ask='subscribe'属性所指示的:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='contact@example.org'&lt;br /&gt;
           subscription='none'&lt;br /&gt;
           ask='subscribe'&lt;br /&gt;
           name='MyContact'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;MyBuddies&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
:注意: 如果用户在发送订阅请求之前没有新建一个名册条目, 服务器必须(MUST)现在代替用户新建一个,然后发送一个名册推送给这个用户的所有已经请求名册的可用资源, 不含以上所示的'name'属性和&amp;lt;group/&amp;gt;子元素.&lt;br /&gt;
&lt;br /&gt;
:5. 用户的服务器也必须(MUST)把这个类型为&amp;quot;subscribe&amp;quot;的出席信息节的'from'地址设置为用户的纯JID(例如, &amp;lt;user@example.com&amp;gt;)(如果用户提供了设置为用户的全JID的'from'地址, 服务器应该(SHOULD)移除资源ID). 如果联系人和用户在不同的主机上, 用户的服务器必须(MUST)路由这个出席信息节到联系人的服务器来递送到这个联系人(这种情形的假定贯穿本文; 无论如何, 如果联系人在同一台主机, 那么服务器可以简单地直接递送出席信息节):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:注意:如果用户的服务器从联系人的服务器收到了一个类型为&amp;quot;error&amp;quot;的出席信息节, 它必须(MUST)这个错误节给用户, 用户的客户端可以(MAY)确定那个错误是否对于上次用户发出的&amp;quot;subscribe&amp;quot;类型的出席信息节(例如, 通过跟踪'id'属性)的应答,然后选择重新发送&amp;quot;subscribe&amp;quot;请求还是发送一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节给联系人以恢复到它的上一个状态.&lt;br /&gt;
&lt;br /&gt;
:6. 接收到指向联系人的&amp;quot;subscribe&amp;quot;类型的出席信息节之后, 这个联系人的服务器必须(MUST)决定是否至少有一个已请求名册的联系人的可用资源. 如果是, 它必须(MUST)递送这个订阅请求给这个联系人(如果不是, 联系人的服务器必须(MUST)离线存储这个订阅请求用于递送 when this condition is next met; 通常这是通过增加一个关于这个联系人的名册条目到用户名册中来实现的, 伴随着一个 &amp;quot;None + Pending In&amp;quot;的状态(定义在 订阅状态Subscription States (第九章)), 无论如何一个服务器不应该(SHOULD NOT)在那种状态下推送或递送名册条目给联系人). 不论何时订阅请求被递送到了, 联系人必须决定是否批准它(根据联系人的配置选项, 联系人的客户端可以(MAY）批准或拒绝订阅请求而无需向联系人显示). 这里我们假定这个 &amp;quot;happy path&amp;quot;, 即联系人批准了订阅请求(替代的拒绝订阅请求的流程定义在第八章第二节第一小节). 在这种情形下, 这个联系人的客户端 (1) 应该(SHOULD) 执行一个roster set 为这个用户指明期望的昵称和组(如果有的话); 并且 (2) 必须(MUST)发送一个&amp;quot;subscribed&amp;quot;类型的出席信息节给这个用户以批准这个订阅请求.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set' id='set2'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='user@example.com'&lt;br /&gt;
           name='SomeUser'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;SomeGroup&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='user@example.com' type='subscribed'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:7. 作为结果, 联系人的服务器 (1) 必须(MUST) 初始化一个名册推送给所有联系人已请求名册的可用资源, 包含一个关于那个用户的名册条目,并且其订阅状态为'from'(甚至联系人不执行roster set,服务器也必须(MUST)发送它); (2) 必须(MUST)返回一个 IQ result 给发送的资源表示名册设置(roster set)成功了; (3) 必须(MUST)路由这个&amp;quot;subscribed&amp;quot;类型的出席信息节给用户, 首先把'from'地址设为联系人的纯JID(&amp;lt;contact@example.org&amp;gt;); 然后 (4) 必须(MUST)从所有联系人的可用资源向用户发送可用的出席信息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set' to='contact@example.org/resource'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='user@example.com'&lt;br /&gt;
           subscription='from'&lt;br /&gt;
           name='SomeUser'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;SomeGroup&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' to='contact@example.org/resource' id='set2'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='subscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org/resource'&lt;br /&gt;
       to='user@example.com'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:注意: 如果联系人的服务器从用户的服务器收到一个&amp;quot;error&amp;quot;类型的出席信息节, 它必须(MUST)递送这个错误节给联系人, 联系人的客户端可以(MAY)确定那个错误是否对于上次联系人发出的&amp;quot;subscribe&amp;quot;类型的出席信息节(例如, 通过跟踪'id'属性)的应答,然后选择重新发送&amp;quot;subscribe&amp;quot;请求还是发送一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节给用户以恢复到它的上一个状态. &lt;br /&gt;
&lt;br /&gt;
:8. 接收到一个指向用户的&amp;quot;subscribed&amp;quot;类型的出席信息节之后, 用户的服务器必须(MUST)首先检查在用户名册中的这个联系人的状态是: (a) subscription='none' and ask='subscribe' 还是 (b) subscription='from' and ask='subscribe'. 如果联系人不是以上述的状态在用户的名册中,用户的服务器必须(MUST)安静的忽略这个&amp;quot;subscribed&amp;quot;类型的出席信息节(例如, 服务器不能(MUST NOT)路由它到用户, 修改用户的名册, 或生成一个名册推送到用户的可用资源). 如果联系人以上述任何一种状态存在于用户的名册中, 用户的服务器 (1) 必须(MUST)从联系人向用户递送这个&amp;quot;subscribed&amp;quot;类型的出席信息节; (2)必须(MUST)初始化一个名册推送给所有已请求名册的这个用户的可用资源,包含一个关于这个联系人的更新的名册条目,同时其'subscription'属性值设置为&amp;quot;to&amp;quot;; 并且 (3) 必须(MUST)从每一个联系人的可用资源向每一个用户的可用资源递送服务器接收到的可用的出席信息节:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       type='subscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='contact@example.org'&lt;br /&gt;
           subscription='to'&lt;br /&gt;
           name='MyContact'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;MyBuddies&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org/resource'&lt;br /&gt;
       to='user@example.com/resource'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:9. 接收到&amp;quot;subscribed&amp;quot;类型的出席信息节之后, 用户应该(SHOULD)承认接收到了订阅状态通知,&lt;br /&gt;
要么发送一个&amp;quot;subscribe&amp;quot;类型的出席信息节给联系人证实它, 要么发送一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节给联系人否认它;这个步骤不一定影响订阅状态(见 订阅状态Subscription States(第九章)的细节), 但是会让用户用户的服务器知道它必须(MUST)不再发送订阅状态改变通知给用户(见第九章第四节).&lt;br /&gt;
&lt;br /&gt;
:从用户这方面看, 现在存在一个向联系人的出席信息的订阅; 从联系人的方面看, 现在存在一个从用户的来的订阅.&lt;br /&gt;
&lt;br /&gt;
====替代流程: 联系人拒绝订阅请求====&lt;br /&gt;
&lt;br /&gt;
:以上活动流程展示了关于用户向联系人的订阅请求的 &amp;quot;happy path&amp;quot; . 如果联系人拒绝用户的订阅请求,那么主要的替代流程如下所述.&lt;br /&gt;
&lt;br /&gt;
:1. 如果联系人想拒绝这个请求, 联系人的客户端必须(MUST)发送一个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给用户(取代第八章第二节中步骤6发送的 &amp;quot;subscribed&amp;quot;类型的出席信息节):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='user@example.com' type='unsubscribed'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. 作为结果, 联系人的服务器必须(MUST)路由这个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给用户,首先把'from'地址设为联系人的纯JID(&amp;lt;contact@example.org&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:注意: 如果联系人的服务器之前把用户添加到了联系人的名册中用来跟踪, 这时它必须(MUST)移除这个相关的条目.&lt;br /&gt;
&lt;br /&gt;
:3. 接收到指向用户的&amp;quot;unsubscribed&amp;quot;类型出席信息节之后, 用户的服务器 (1) 必须(MUST)地送那个出席信息节给用户 并且 (2) 必须(MUST) 初始化一个名册推送给这个用户的所有已请求名册的可用资源, 包含一个关于这个联系人的一个更新条目,其'subscription'属性设为&amp;quot;none&amp;quot;并且没有'ask'属性:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='contact@example.org'&lt;br /&gt;
           subscription='none'&lt;br /&gt;
           name='MyContact'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;MyBuddies&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:4. 接收到类型为&amp;quot;unsubscribed&amp;quot;出席信息节之后, 用户应该(SHOULD)承认收到订阅状态通知, 要么发送一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节给联系人证实它, 要么发送一个&amp;quot;subscribe&amp;quot;类型的出席信息节给联系人否认它; 这一步骤不影响订阅状态(见 订阅状态Subscription States(第九章)的细节), 但是让用户的服务器知道它必须(MUST)不再发送订阅状态改变的通知给用户(见第九章第四节).&lt;br /&gt;
&lt;br /&gt;
:作为这一行为的结果, 联系人现在在用户的名册中, 状态为&amp;quot;none&amp;quot;,而用户根本不在联系人的名册中.&lt;br /&gt;
&lt;br /&gt;
===建立一个相互的订阅===&lt;br /&gt;
&lt;br /&gt;
:用户和联系人可以在前述&amp;quot;happy path&amp;quot;的基础上建立一个相互的订阅(例如, 一个&amp;quot;both&amp;quot;的订阅类型). 流程如下.&lt;br /&gt;
&lt;br /&gt;
:1. 如果联系人想建立一个相互的订阅, 联系人必须(MUST)发送一个订阅请求给用户(视联系人的配置选项而定, 联系人的客户端可以(MAY)自动发送它):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='user@example.com' type='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. 作为结果, 联系人的服务器 (1) 必须(MUST)初始化一个名册推送给联系人的所有已请求名册的可用资源, 伴随着用户仍在'from'订阅状态但同时有一个未决的'to'订阅状态(通过在名册条目中包含一个ask='subscribe'的属性来指示); 并且 (2) 必须(MUST)路由这个&amp;quot;subscribe&amp;quot;类型的出席信息节给用户(先把'from'地址设为联系人的纯JID(&amp;lt;contact@example.org&amp;gt;)):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='user@example.com'&lt;br /&gt;
           subscription='from'&lt;br /&gt;
           ask='subscribe'&lt;br /&gt;
           name='SomeUser'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;SomeGroup&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:注意: 如果联系人的服务器从用户的服务器收到一个&amp;quot;error&amp;quot;类型的出席信息节, 它必须(MUST)递送这个错误节给联系人, 它的客户端可以(MAY)确定这个错误是用来应答上次发送的&amp;quot;subscribe&amp;quot;类型的出席信息节(换言之, 通过跟踪'id'属性) 并且选择重发这个&amp;quot;subscribe&amp;quot;请求还是发送一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节给用户以把名册恢复到它的前一个状态.&lt;br /&gt;
&lt;br /&gt;
:3. 接收到指向用户的&amp;quot;subscribe&amp;quot;类型出席信息节之后, 用户的服务器必须确定是否至少有一个已请求名册可用资源. 如果是, 用户的服务器必须(MUST)递送这个订阅请求给用户(如果不是, 它必须(MUST)离线存储这个订阅请求等这种情形再次发生时递送). 无论何时订阅请求被递送了, 用户必须决定是否批准它(视用户的配置选项而定, 用户的客户端可以(MAY)批准或拒绝这个订阅请求而不需要向用户显示). 这里我们假定这是&amp;quot;happy path&amp;quot;,用户批准了订阅请求(替代的拒绝订阅请求的流程定义在第八章第三节第一小节). 在这种情形下, 用户的客户端必须(MUST)发送一个&amp;quot;subscribed&amp;quot;类型的出席信息节给联系人表示批准了订阅请求.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='contact@example.org' type='subscribed'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:4. 作为结果, 用户的服务器 (1) 必须(MUST)初始化一个名册推送给用户的所有已请求名册的可用资源, 包含一个关于联系人的名册条目,其'subscription'属性设为&amp;quot;both&amp;quot;; (2) 必须(MUST)路由这个&amp;quot;subscribed&amp;quot;类型的出席信息节给联系人(先把'from'地址设为用户的纯JID&amp;lt;user@example.com&amp;gt;)); 并且 (3) 必须(MUST)向联系人发送它从用户的每个可用资源收到的最近一次出席信息节的全XML(不带'to'属性)(强制每个会话遵守隐私列表):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='contact@example.org'&lt;br /&gt;
           subscription='both'&lt;br /&gt;
           name='MyContact'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;MyBuddies&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='subscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com/resource'&lt;br /&gt;
       to='contact@example.org'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:注意: 如果用户的服务器从联系人的服务器接收到一个&amp;quot;error&amp;quot;类型的出席信息节, 它必须(MUST)递送这个错误节给用户, 它客户端可以(MAY)确定这个错误是用来应答上次发出去的&amp;quot;subscribed&amp;quot;类型的出席信息节(换言之, 通过跟踪'id'属性) 并且选择重发这个订阅请求还是发送一个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给联系人以把名册恢复到上次的状态.&lt;br /&gt;
&lt;br /&gt;
:5. 接收到指向联系人的&amp;quot;subscribed&amp;quot;类型的出席信息节之后, 联系人的服务器必须(MUST)首先检查用户在联系人的名册中的状态是否以下状态之一: (a) subscription='none' and ask='subscribe' 或 (b) subscription='from' and ask='subscribe'. 如果用户不是以上述两种状态之一存在于联系人的名册中, 联系人的服务器必须(MUST)安静地忽略这个&amp;quot;subscribed&amp;quot;类型的出席信息节(例如, 它不能(MUST NOT)路由它给联系人, 修改联系人的名册, 或生成一个名册推送给联系人的可用资源). 如果用户以上述两种状态之一存在于联系人的名册中, 联系人的服务器 (1) 必须(MUST)从用户向联系人递送这个&amp;quot;subscribed&amp;quot;类型的出席信息节; (2) 必须(MUST)初始化一个名册推送给这个联系人的所有已请求名册的可用资源, 包含一个关于这个用户的更新的名册条目,其'subscription'属性值设为&amp;quot;both&amp;quot;; 并且 (3) 必须(MUST)向这个联系人的每个可用资源递送它从这个用户的每个资源收到的可用出席信息节:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='subscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='user@example.com'&lt;br /&gt;
           subscription='both'&lt;br /&gt;
           name='SomeUser'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;SomeGroup&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com/resource'&lt;br /&gt;
       to='contact@example.org/resource'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. 收到&amp;quot;subscribed&amp;quot;类型的出席信息节之后, 联系人应该(SHOULD)承认收到订阅请求通知,要么发送一个&amp;quot;subscribe&amp;quot;的出席信息节给用户证实它,要么发送一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节给用户否认它; 这一步骤不影响订阅状态(细节见 订阅状态Subscription States(第九章)), 但是让联系人的服务器知道它必须(MUST)不再发送订阅状态变更通知给联系人(见第九章第四节).&lt;br /&gt;
&lt;br /&gt;
:用户和联系人现在有了对双方的出席信息的一个相互订阅 -- 换言之, 这个订阅类型为 &amp;quot;both&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====替代流程: 用户拒绝订阅请求====&lt;br /&gt;
&lt;br /&gt;
:以上活动流程展示了关于联系人对用户的订阅请求的 &amp;quot;happy path&amp;quot;. 如果用户拒绝了联系人的订阅请求,其主要流程如下.&lt;br /&gt;
&lt;br /&gt;
:1. 如果用户想拒绝请求, 用户的客户端必须(MUST)发送一个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给联系人(替代第八章第三节中的第三步中所发送的&amp;quot;subscribed&amp;quot;类型出席信息节):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='contact@example.org' type='unsubscribed'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. 作为结果, 用户的服务器必须(MUST)路由这个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给联系人(首先把'from'地址设为用户的纯JID(&amp;lt;user@example.com&amp;gt;)):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:3. 接收到指向联系人的&amp;quot;unsubscribed&amp;quot;类型的出席信息节之后, 联系人的服务器 (1) 必须(MUST)递送这个出席信息节给联系人; 并且 (2) 必须(MUST)初始化一个名册推送给这个联系人的所有已请求名册的可用资源, 包含关于这个用户的更新的名册条目,其'subscription'属性的值设为&amp;quot;from&amp;quot;并且没有'ask'属性:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='user@example.com'&lt;br /&gt;
           subscription='from'&lt;br /&gt;
           name='SomeUser'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;SomeGroup&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:4. 接收到&amp;quot;unsubscribed&amp;quot;类型的出席信息节之后, 联系人应该(SHOULD)承认收到那个订阅状态通知,要么向用户发送一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节以证实它,要么向用户发送一个&amp;quot;subscribe&amp;quot;类型的出席信息以否认它; 这个步骤不会影响订阅状态(详见 订阅状态Subscription States(第九章)),但是让联系人的服务器知道它必须(MUST)不再发送订阅状态变更通知给联系人(见第九章第四节).&lt;br /&gt;
&lt;br /&gt;
:作为这一活动的结果, 订阅状态没有任何改变; 换言之, 联系人在用户的名册中的订阅状态为&amp;quot;to&amp;quot;并且用户在联系人的名册中的订阅状态为&amp;quot;from&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===取消订阅===&lt;br /&gt;
&lt;br /&gt;
:在订阅了一个联系人的出席信息之后的任何时候, 一个用户可以(MAY)取消订阅. 在所有实例中用户发送来执行这一动作的XML是相同的, 接下来的订阅状态根据发出取消订阅命令时获得的订阅状态的情况而不同. 两种可能的情节描述如下.&lt;br /&gt;
&lt;br /&gt;
====情形 #1: 当订阅不是相互的时候取消订阅====&lt;br /&gt;
&lt;br /&gt;
:在第一种情形, 用户有一个向联系人的出席信息的订阅但是联系人没有对用户的出席信息的订阅（换言之, 订阅不是相互的).&lt;br /&gt;
&lt;br /&gt;
:1. 如果用户想取消对联系人的出席信息的订阅, 用户必须(MUST)发送一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节给联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='contact@example.org' type='unsubscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. 作为一个结果, 用户的服务器 (1) 必须(MUST) 发送一个名册推送给这个用户的所有已请求名册的可用资源,包含一个关于这个联系人的更新名册条目,其'subscription'属性设为&amp;quot;none&amp;quot;; 并且 (2) 必须(MUST)路由这个&amp;quot;unsubscribe&amp;quot;类型的出席信息节给联系人(首先把'from'地址设为用户的纯JID(&amp;lt;user@example.com&amp;gt;)):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='contact@example.org'&lt;br /&gt;
           subscription='none'&lt;br /&gt;
           name='MyContact'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;MyBuddies&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='unsubscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:3. 接收到指向联系人的&amp;quot;unsubscribe&amp;quot;类型出席信息节之后, 联系人的服务器 (1) 必须(MUST)初始化一个名册推送给这个联系人的所有已请求名册的可用资源, 包含一个关于这个用户的名册条目,其'subscription'属性值设为&amp;quot;none&amp;quot; (如果联系人不可用或未曾请求名册, 联系人的服务器必须(MUST)修改名册条目并在下次联系人请求名册时发送那个已修改的条目); 并且 (2) 必须(MUST)递送这个&amp;quot;unsubscribe&amp;quot;状态改变通知给联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='user@example.com'&lt;br /&gt;
           subscription='none'&lt;br /&gt;
           name='SomeUser'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;SomeGroup&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='unsubscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:4. 接收到&amp;quot;unsubscribe&amp;quot;类型的出席信息节之后, 联系人应该(SHOULD)承认收到那个订阅状态通知,要么发送一个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给用户以证实它,要么发送一个&amp;quot;subscribed&amp;quot;类型的出席信息节给用户否认它; 这个步骤不影响订阅状态(详见 订阅状态Subscription States (第九章)), 但是让联系人的服务器知道它必须(MUST)不再发送订阅状态变更通知给联系人(见第九章第四节).&lt;br /&gt;
&lt;br /&gt;
:5. 联系人的服务器接着 (1) 必须(MUST)发送一个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给用户;并且 (2) 应该(SHOULD)向用户发送从这个联系人的所有可用资源收到的不可用出席信息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org/resource'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. 当用户的服务器收到类型为&amp;quot;unsubscribed&amp;quot; 和 &amp;quot;unavailable&amp;quot;的出席信息节, 它必须(MUST)递送它们给用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org/resource'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:7. 接收到&amp;quot;unsubscribed&amp;quot;类型的出席信息节之后, 用户应该(SHOULD)承认收到那个订阅状态变更通知,要么向联系人发送一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节以证实它,要么向联系人发送一个&amp;quot;subscribe&amp;quot;的出席信息节以否认它;这步骤不影响订阅状态(详见 订阅状态Subscription States(第九章)), 但是让用户的服务器知道它必须(MUST)不在发送订阅状态变更通知给用户(见第九章第四节).&lt;br /&gt;
&lt;br /&gt;
====情形 #2: 当订阅是相互的时候取消订阅====&lt;br /&gt;
&lt;br /&gt;
:在第二种情形下, 用户有一个向联系人的出席信息的订阅并且联系人也有一个向用户的出席信息的订阅(换言之, 订阅是相互的).&lt;br /&gt;
&lt;br /&gt;
:1. 如果用户想从联系人的出席信息取消订阅, 用户必须(MUST)发送一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节给联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='contact@example.org' type='unsubscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. 作为一个结果, 用户的服务器 (1) 必须(MUST)发送一个名册推送给这个用户的所有已请求名册的可用资源,包含一个关于这个联系人的更新名册条目,其'subscription'属性值设为&amp;quot;from&amp;quot;; 并且 (2) 必须(MUST)路由这个&amp;quot;unsubscribe&amp;quot;类型的出席信息节给这个联系人( 首先把'from'地址设为这个用户的纯 JID(&amp;lt;user@example.com&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='contact@example.org'&lt;br /&gt;
           subscription='from'&lt;br /&gt;
           name='MyContact'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;MyBuddies&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='unsubscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
:3. 接收到指向联系人的&amp;quot;unsubscribe&amp;quot;类型的出席信息节之后, 联系人的服务器 (1) 必须(MUST)初始化一个名册推送给这个联系人的所有已请求名册的可用资源, 包含一个关于这个用户的名册条目,其'subscription'属性值设为&amp;quot;to&amp;quot; (如果联系人不可用或未曾请求名册, 联系人的服务去必须(MUST)修改这个名册条目并且等下次联系人请求名册的时候再发送这个修改过的名册条目); 并且 (2) 必须(MUST)递送这个&amp;quot;unsubscribe&amp;quot;状态变更通知给联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='user@example.com'&lt;br /&gt;
           subscription='to'&lt;br /&gt;
           name='SomeUser'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;SomeGroup&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='unsubscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:4. 接收到这个&amp;quot;unsubscribe&amp;quot;类型的出席信息节之后, 联系人应该(SHOULD)承认收到了那个订阅状态通知,要么向用户发送一个&amp;quot;unsubscribed&amp;quot;类型的出席信息节以证实它,要么向用户发送一个&amp;quot;subscribed&amp;quot;类型的出席信息节以否认它; 这个步骤不影响订阅状态(详见 订阅状态Subscription States(第九章)), 但是让联系人的服务器知道它必须(MUST)不再发送订阅状态变更通知给联系人(见第九章第四节).&lt;br /&gt;
&lt;br /&gt;
:5. 联系人的服务器然后 (1) 必须(MUST)发送一个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给用户; 并且 (2) 应该(SHOULD)向用户发送它从联系人的所有可用资源收到的不可用出席信息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org/resource'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. 当用户的服务器收到&amp;quot;unsubscribed&amp;quot;和&amp;quot;unavailable&amp;quot;类型的出席信息节, 它必须(MUST)递送它们给用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org/resource'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:7. 接收到&amp;quot;unsubscribed&amp;quot;类型的出席信息节之后, 用户应该(SHOULD)承认收到了那个订阅状态的通知,要么向联系人发送一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节以证实它,要么向联系人发送一个&amp;quot;subscribe&amp;quot;类型的出席信息节以否认它;这个步骤不影响订阅状态(详见 订阅状态Subscription States(第九章)), 但是让用户的服务器知道它必须(MUST)不在发送订阅状态变更通知给用户(见第九章第四节).&lt;br /&gt;
&lt;br /&gt;
:注意: 显然这不会导致名册条目从用户的名册移除, 并且联系人仍然有一个对用户的出席信息的订阅.为了完全取消双向的订阅并完全从用户的名册中移除名册条目, 用户应该(SHOULD)使用subscription='remove'(定义在 移除一个名册条目并取消所有订阅项Removing a Roster Item and Cancelling All Subscriptions (第八章第六节))更新名册条目.&lt;br /&gt;
&lt;br /&gt;
===取消一个订阅项===&lt;br /&gt;
&lt;br /&gt;
:在批准来自一个用户的任何订阅请求之后的任何时候, 一个联系人可以(MAY)取消那个订阅项. 联系人在所有实例中执行这个动作中发送的XML是相同的, 接下来的订阅状态根据取消命令发出当时所获得的订阅状态而有所不同. 所有可能的情节描述如下.&lt;br /&gt;
&lt;br /&gt;
====情形 #1: 当订阅不是相互的时候取消订阅项====&lt;br /&gt;
&lt;br /&gt;
:在第一种情形下, 用户有一个对联系人的出席信息的订阅但是联系人没有对于用户的出席信息的订阅(换言之, 订阅还不是相互的).&lt;br /&gt;
&lt;br /&gt;
:1. 如果联系人想取消用户的订阅项, 联系人必须(MUST)发送一个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='user@example.com' type='unsubscribed'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. 作为一个结果, 联系人的服务器 (1) 必须(MUST)发送一个名册推送给这个联系人的所有已请求名册的可用资源, 包含一个关于这个用户的更新的名册条目,其'subscription'属性值设为&amp;quot;none&amp;quot;; (2) 必须(MUST)路由这个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给用户(首先把'from'地址设为联系人的纯JID(&amp;lt;contact@example.org&amp;gt;)); 并且 (3) 应该(SHOULD)向用户发送它从联系人的所有可用资源收到的不可用出席信息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='user@example.com'&lt;br /&gt;
           subscription='none'&lt;br /&gt;
           name='SomeUser'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;SomeGroup&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org/resource'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:3. 接收到指向用户的&amp;quot;unsubscribed&amp;quot;类型的出席信息节之后, 用户的服务器 (1) 必须(MUST)初始化一个名册推送给这个用户的所有已请求名册的可用资源, 包含一个关于这个联系人的名册条目更新,其'subscription'属性值设为&amp;quot;none&amp;quot;(如果用户不可用或未曾请求名册, 用户的服务器必须(MUST)修改这个名册条目并且等下次用户请求名册的时候发送修改过的名册条目); (2) 必须(MUST)递送这个&amp;quot;unsubscribed&amp;quot;状态改变通知给这个用户的所有可用资源; 并且 (3) 必须(MUST)向这个用户的所有可用资源递送不可用出席信息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='contact@example.org'&lt;br /&gt;
           subscription='none'&lt;br /&gt;
           name='MyContact'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;MyBuddies&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org/resource'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:4. 接收到&amp;quot;unsubscribed&amp;quot;类型的出席信息节之后, 用户应该(SHOULD)承认收到了那个订阅状态通知,要么向联系人发送一个&amp;quot;unsubscribe&amp;quot;出席信息节以证实它,要么向联系人发送一个&amp;quot;subscribe&amp;quot;类型的出席信息节以否认它;这个步骤不影响订阅状态(详见 订阅状态Subscription States(第九章)), 但是让服务器知道它必须(MUST)不再发送订阅状态变更通知给用户(见第九章第四节).&lt;br /&gt;
&lt;br /&gt;
====情形 #2: 当订阅项是相互的时候取消====&lt;br /&gt;
&lt;br /&gt;
:在这种情形下, 用户有一个对联系人的出席信息的订阅并且联系人也有一个对用户的出席信息的订阅(换言之, 订阅是相互的).&lt;br /&gt;
&lt;br /&gt;
:1. 如果联系人想取消用户的订阅, 联系人必须(MUST)发送一个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence to='user@example.com' type='unsubscribed'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. 作为结果, 联系人的服务器 (1) 必须(MUST)发送一个名册推送给这个联系人的所有已请求名册的可用资源, 包含关于这个用户的一个更新的名册条目,其'subscription'属性值设为&amp;quot;to&amp;quot;; (2) 必须(MUST)路由这个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给用户(首先把'from'地址设为联系人的纯JID(&amp;lt;contact@example.org&amp;gt;)); 并且 (3) 应该(SHOULD)向这个用户的所有可用资源发送它从联系人的所有可用资源收到的不可用出席信息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='user@example.com'&lt;br /&gt;
           subscription='to'&lt;br /&gt;
           name='SomeUser'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;SomeGroup&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org/resource'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:3. 接收到指向用户的&amp;quot;unsubscribed&amp;quot;类型出席信息节之后, 用户的服务器 (1) 必须(MUST)初始化一个名册推送给这个用户的所有已请求名册的可用资源, 包含关于这个联系人的更新的名册条目,其'subscription'属性值设为&amp;quot;from&amp;quot;(如果这个用户不可用或未曾请求名册, 用户的服务器必须(MUST)修改这个名册条目并且等下次用户请求名册的时候发送修改过的条目给它); 并且(2) 必须(MUST)递送这个&amp;quot;unsubscribed&amp;quot;状态变更通知给用户的所有可用资源; 并且 (3) 必须(MUST)向这个用户的所有可用资源递送这个不可用出席信息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='contact@example.org'&lt;br /&gt;
           subscription='from'&lt;br /&gt;
           name='MyContact'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;MyBuddies&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='contact@example.org/resource'&lt;br /&gt;
       to='user@example.com'&lt;br /&gt;
       type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:4. 接收到这个&amp;quot;unsubscribed&amp;quot;类型的出席信息节之后, 用户应该(SHOULD)承认收到了那个订阅状态通知,要么向联系人发送一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节以证实它,要么向联系人发送一个&amp;quot;subscribe&amp;quot;类型的出席信息节以否认它; 这一步骤不影响订阅状态(详见 订阅状态Subscription States (第九章)), 但是让用户的服务器知道它必须(MUST)不再发送订阅状态变更通知给用户(见第九章第四节).&lt;br /&gt;
&lt;br /&gt;
:注意: 显然这不会使得名册条目从联系人的名册中移除, 并且联系人仍然有一个对用户的出席信息的订阅. 为了完全双向的取消一个相互的订阅并且从联系人的名册中完全移除这个名册条目, 联系人应该以subscription='remove'(定义在 移除一个名册条目并取消所有订阅项Removing a Roster Item and Cancelling All Subscriptions (第八章第六节))更新名册条目.&lt;br /&gt;
&lt;br /&gt;
===移除一个名册条目并取消所有订阅项===&lt;br /&gt;
&lt;br /&gt;
:因为在双向完整移除一个名册条目和取消所有订阅的过程中可能有很多步骤, 名册管理协议包含一个&amp;quot;shortcut&amp;quot;方法来做这件事. 无论当前的订阅状态是什么, 这个过程可以通过发送一个roster set(包含一个用于这个联系人的条目,其'subscription'属性值设为&amp;quot;remove&amp;quot;)来初始化:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set' id='remove1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='contact@example.org'&lt;br /&gt;
           subscription='remove'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:当用户从他或她的名册中移除一个联系人(通过把'subscription'属性值设为&amp;quot;remove&amp;quot;), 用户的服务器 (1) 必须(MUST)自动取消用户和联系人之间的任何现存的出席信息订阅项(包括相应的'to'和'from'); (2) 必须(MUST)从用户的名册移除这个名册条目并且通知这个用户的所有已请求名册的可用资源这个名册条目被移除了; (3) 必须(MUST)通知初始化的资源移除成功了; 并且 (4) 应该(SHOULD)向联系人发送它从这个用户的所有可用资源收到的不可用出席信息:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='unsubscribe'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='contact@example.org'&lt;br /&gt;
           subscription='remove'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' id='remove1'/&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com/resource'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:收到&amp;quot;unsubscribe&amp;quot;类型的出席信息后, 联系人的服务器 (1) 必须(MUST)初始化一个名册推送给这个联系人的所有已请求名册的可用资源,包含关于这个用户的一个更新的名册条目,其'subscription'属性值设为&amp;quot;to&amp;quot;(如果这个联系人不可用或未曾请求名册, 联系人的服务器必须(MUST)修改这个名册条目并且等下次联系人请求名册的时候发送这个修改过的条目给它); 并且 (2) 也必须(MUST)递送这个&amp;quot;unsubscribe&amp;quot;状态变更通知给这个联系人的所有可用资源:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='user@example.com'&lt;br /&gt;
           subscription='to'&lt;br /&gt;
           name='SomeUser'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;SomeGroup&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='unsubscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:收到这个&amp;quot;unsubscribed&amp;quot;类型的出席信息节之后, 联系人的服务器 (1) 必须(MUST)初始化一个名册推送给这个联系人的所有已请求名册的可用资源,包含一个关于这个用户的更新的名册条目,其'subscription'属性值设为&amp;quot;none&amp;quot;(如果这个联系人不可用或未曾请求名册, 联系人的服务器必须(MUST)修改名册条目并且等下次联系人请求名册的时候把修改过的条目发送给它); 并且 (2) 也必须(MUST)递送这个&amp;quot;unsubscribe&amp;quot;状态改变通知给这个联系人的所有可用资源:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:roster'&amp;gt;&lt;br /&gt;
       &amp;lt;item&lt;br /&gt;
           jid='user@example.com'&lt;br /&gt;
           subscription='none'&lt;br /&gt;
           name='SomeUser'&amp;gt;&lt;br /&gt;
         &amp;lt;group&amp;gt;SomeGroup&amp;lt;/group&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='unsubscribed'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:接收到指向联系人的&amp;quot;unavailable&amp;quot;出席信息节之后, 联系人的服务器必须(MUST)递送这个不可用出席信息给这个用户的所有可用资源:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;presence&lt;br /&gt;
       from='user@example.com/resource'&lt;br /&gt;
       to='contact@example.org'&lt;br /&gt;
       type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:注意: 当用户从用户的名册中移除联系人的时候, 这个联系人的名册最后状态是用户仍然在联系人名册中但是订阅状态为&amp;quot;none&amp;quot;; 为了完全移除关于这个用户的名册条目, 联系人也需要发送一个名册移除请求.&lt;br /&gt;
&lt;br /&gt;
==订阅状态==&lt;br /&gt;
&lt;br /&gt;
:本章提供关于订阅状态以及和订阅相关的出席信息节(换言之,类型为&amp;quot;subscribe&amp;quot;, &amp;quot;subscribed&amp;quot;, &amp;quot;unsubscribe&amp;quot;,和 &amp;quot;unsubscribed&amp;quot;的出席信息节)的服务器处理过程的详细信息.&lt;br /&gt;
&lt;br /&gt;
===已定义的状态===&lt;br /&gt;
&lt;br /&gt;
:有九种可能的订阅状态, 从用户的(不是联系人的)角度描述如下:&lt;br /&gt;
&lt;br /&gt;
:# &amp;quot;None&amp;quot; = 联系人和用户互相没有被对方订阅, 并且也都没有从对方那里请求一个订阅&lt;br /&gt;
:# &amp;quot;None + Pending Out&amp;quot; = 联系人和用户互相没有被对方订阅, 用户已经向联系人发送了一个订阅请求但还没有收到回复&lt;br /&gt;
:# &amp;quot;None + Pending In&amp;quot; = 联系人和用户互相没有被对方订阅, 联系人已经向用户发送了一个订阅请求但还没有收到回复(注意: 在这种状态下联系人的服务器不应该(SHOULD NOT)推送或递送名册条目, 但是应该(SHOULD)等待,直到联系人的订阅请求已经从用户那里得到批准)&lt;br /&gt;
:# &amp;quot;None + Pending Out/In&amp;quot; = 联系人和用户互相没有被对方订阅, 联系人已经向用户发送了一个订阅请求但还没有收到回复, 用户已经向联系人发送了一个订阅请求但还没有收到回复&lt;br /&gt;
:# &amp;quot;To&amp;quot; = 用户已订阅联系人(单向)&lt;br /&gt;
:# &amp;quot;To + Pending In&amp;quot; = 用户已订阅联系人, 联系人已经向用户发送了一个订阅请求但还没有收到回复&lt;br /&gt;
:# &amp;quot;From&amp;quot; = 联系人已订阅用户(单向)&lt;br /&gt;
:# &amp;quot;From + Pending Out&amp;quot; = 联系人已订阅用户(单向), 用户已经向联系人发送了一个订阅请求但还没有收到回复&lt;br /&gt;
:# &amp;quot;Both&amp;quot; = 用户和联系人互相被对方订阅了(双向)&lt;br /&gt;
&lt;br /&gt;
===出站出席信息订阅节的服务器处理过程===&lt;br /&gt;
&lt;br /&gt;
:出站出席信息订阅节使用户能管理他或她对联系人的出席信息的订阅(通过&amp;quot;subscribe&amp;quot;和&amp;quot;unsubscribe&amp;quot;类型), 并且管理联系人对用户的出席信息的访问(通过&amp;quot;subscribed&amp;quot;和&amp;quot;unsubscribed&amp;quot;类型).&lt;br /&gt;
&lt;br /&gt;
:因为用户的服务器和联系人的服务器有可能失去对于订阅状态的同步, 用户的服务器必须(MUST)毫无例外地路由所有&amp;quot;subscribe&amp;quot;或&amp;quot;unsubscribe&amp;quot;类型的出站出席信息节给联系人,使用户能在需要的时候重新同步他或她的对联系人的出席信息的订阅.&lt;br /&gt;
&lt;br /&gt;
:如果从用户的角度来看,一个&amp;quot;subscribed&amp;quot;或&amp;quot;unsubscribed&amp;quot;类型的出席信息节不会导致一个订阅状态的变更,用户的服务器不应该(SHOULD NOT)路由这个节到联系人那里,并且不能(MUST NOT)做出一个状态变更. 如果这个节导致一个订阅状态的变更, 用户的服务器必须(MUST)路由这个节到联系人,并且必须(MUST)做出相应的状态变更. 这些规则总结如下这些表.&lt;br /&gt;
&lt;br /&gt;
:表 1: 推荐的出站&amp;quot;subscribed&amp;quot;节的处理&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!当前状态 !! 路由?  !! 新状态&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None&amp;quot;   ||  否    || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending Out&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending In&amp;quot;  || 是 || &amp;quot;From&amp;quot;                  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending Out/In&amp;quot; || 是 || &amp;quot;From + Pending Out&amp;quot;    &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;To&amp;quot; || 否  || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;To + Pending In&amp;quot; || 是 || &amp;quot;Both&amp;quot;                  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;From&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;From + Pending Out&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;Both&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:表 2: 推荐的出站&amp;quot;unsubscribed&amp;quot;节处理&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!当前状态 !! 路由? !! 新状态               &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending Out&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending In&amp;quot; || 是 || &amp;quot;None&amp;quot;                  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending Out/In&amp;quot; || 是 ||  &amp;quot;None + Pending Out&amp;quot;    &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;To&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;To + Pending In&amp;quot; || 是 || &amp;quot;To&amp;quot;                    &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;From&amp;quot; || 是 || &amp;quot;None&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;From + Pending Out&amp;quot; || 是 || &amp;quot;None + Pending Out&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;Both&amp;quot; || 是 || &amp;quot;To&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===入站出席信息订阅节的服务器处理过程===&lt;br /&gt;
&lt;br /&gt;
:入站出席信息订阅节从用户请求一个订阅相关的动作(通过&amp;quot;subscribe&amp;quot;类型), 通知用户由联系人所做的订阅状态相关的动作(通过&amp;quot;unsubscribe&amp;quot;类型),或使联系人能够管理用户对联系人的出席信息的访问(通过&amp;quot;subscribed&amp;quot;和&amp;quot;unsubscribed&amp;quot;类型).&lt;br /&gt;
&lt;br /&gt;
:当用户的服务器为用户从联系人那里接收到一个订阅请求(换言之, 一个&amp;quot;subscribe&amp;quot;类型的出席信息节), 如果用户未曾允许联系人访问用户的出席信息或者没有未决的入站订阅请求, 它必须(MUST)递送那个请求给用户;无论如何, 如果有一个未决的入站订阅请求, 用户的服务器不应该(SHOULD NOT)递送这个新的请求, 因为上一个订阅请求可能已经被记录下来了. 如果用户已经允许联系人访问用户的出席信息,用户的服务器应该(SHOULD)对一个从联系人发来的&amp;quot;subscribe&amp;quot;类型的入站出席信息节自动回复(通过代替用户向联系人发送一个&amp;quot;subscribed&amp;quot;类型的出席信息节); 这个规则使得联系人可以在需要的时候重新同步订阅状态. 这些规则总结如下面这些表.&lt;br /&gt;
&lt;br /&gt;
:表 3: 推荐的入站&amp;quot;subscribe&amp;quot;节处理&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!当前状态 !! 递送? !! 新状态               &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None&amp;quot; || 是 || &amp;quot;None + Pending In&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending Out&amp;quot; || 是 || &amp;quot;None + Pending Out/In&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending In&amp;quot; || 否 || 状态不变&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending Out/In&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;To&amp;quot; || 是 || &amp;quot;To + Pending In&amp;quot;       &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;To + Pending In&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;From&amp;quot; || 否 * || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;From + Pending Out&amp;quot; || 否 * || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;Both&amp;quot; || 否 * || 状态不变         &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:* 服务器应该(SHOULD)以&amp;quot;subscribed&amp;quot;节自动回复&lt;br /&gt;
&lt;br /&gt;
:当用户的服务器为用户从联系人那里收到一个&amp;quot;unsubscribe&amp;quot;类型的出席信息节, 如果从用户的角度看这个节会导致一个订阅状态变更,那么用户的服务器应该(SHOULD)代替用户自动应答(发送一个&amp;quot;unsubscribed&amp;quot;类型的出席信息节给联系人), 必须(MUST)递送这个&amp;quot;unsubscribe&amp;quot;节给用户,并且必须(MUST)改变状态. 如果不会导致订阅状态变更, 用户的服务器不应该(SHOULD NOT)递送这个节并且不能(MUST NOT)改变状态. 这些规则总结如下表.&lt;br /&gt;
&lt;br /&gt;
:表 4: 推荐的入站&amp;quot;unsubscribe&amp;quot;节处理&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!当前状态 !! 递送? !! 新状态               &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending Out&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending In&amp;quot; || 是 * || &amp;quot;None&amp;quot;                  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending Out/In&amp;quot; || 是 * || &amp;quot;None + Pending Out&amp;quot;    &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;To&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;To + Pending In&amp;quot; || 是 * || &amp;quot;To&amp;quot;                    &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;From&amp;quot; || 是 * || &amp;quot;None&amp;quot;                  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;From + Pending Out&amp;quot; || 是 * || &amp;quot;None + Pending Out     &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;Both&amp;quot; || 是 * || &amp;quot;To&amp;quot;                    &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:* 服务器应该(SHOULD)以&amp;quot;unsubscribed&amp;quot;节自动应答&lt;br /&gt;
&lt;br /&gt;
:当用户的服务器为用户从联系人那里收到一个&amp;quot;subscribed&amp;quot;类型的出席信息节, 如果没有一个为访问联系人的出席信息的未决的出站请求,它不能(MUST NOT)递送这个节给用户并且不能(MUST NOT)改变订阅状态. 如果有一个为了访问联系人的出席信息的未决的出站请求并且这个&amp;quot;subscribed&amp;quot;类型的入站出席信息请求会导致一个订阅状态的改变,用户的服务器必须(MUST)递送这个节给用户并且必须(MUST)改变订阅状态. 如果用户已经有授权可以访问联系人的出席信息, 这个&amp;quot;subscribed&amp;quot;类型的入站出席信息节不导致一个订阅状态的变更;从而用户的服务器不应该(SHOULD NOT)递送这个节给用户并且不能(MUST NOT)改变订阅状态. 这些规则总结如下表.&lt;br /&gt;
&lt;br /&gt;
:表 5: 推荐的入站&amp;quot;subscribed&amp;quot;节处理&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!当前状态 !! 递送? !! 新状态               &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending Out&amp;quot; || 是 || &amp;quot;To&amp;quot;                    &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending In&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending Out/In&amp;quot; || 是 || &amp;quot;To + Pending In&amp;quot;       &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;To&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;To + Pending In&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;From&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;From + Pending Out&amp;quot; || 是 || &amp;quot;Both&amp;quot;                  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;Both&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:当用户的服务器为用户从联系人那里收到了一个&amp;quot;unsubscribed&amp;quot;类型的出席信息节, 如果有一个为了访问联系人的出席信息的未决的出站请求或者用户当前已经有授权可以访问联系人的出席信息,它必须(MUST)递送这个节给用户并且必须(MUST)改变订阅状态. 否则, 用户的服务器不应该(SHOULD NOT)递送这个节并且不能(MUST NOT)改变订阅状态. 这些规则总结如下表.&lt;br /&gt;
&lt;br /&gt;
:表 6: 推荐的入站&amp;quot;unsubscribed&amp;quot;节处理&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!当前状态 !! 递送? !! 新状态               &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None&amp;quot; || 否 || 状态不变&lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending Out&amp;quot; || 是 || &amp;quot;None&amp;quot;                  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending In&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;None + Pending Out/In&amp;quot; || 是 || &amp;quot;None + Pending In&amp;quot;     &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;To&amp;quot; || 是 || &amp;quot;None&amp;quot;                  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;To + Pending In&amp;quot; || 是 || &amp;quot;None + Pending In&amp;quot;     &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;From&amp;quot; || 否 || 状态不变         &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;From + Pending Out&amp;quot; || 是 || &amp;quot;From&amp;quot;                  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;quot;Both&amp;quot; || 是 || &amp;quot;From&amp;quot;                  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===服务器递送和客户端承认订阅请求以及状态变更通知===&lt;br /&gt;
&lt;br /&gt;
:当一个服务器收到一个&amp;quot;subscribe&amp;quot;类型的入站出席信息节(换言之, 一个订阅请求)或&amp;quot;subscribed&amp;quot;类型,&amp;quot;unsubscribe&amp;quot;类型, 或&amp;quot;unsubscribed&amp;quot;类型(换言之, 一个订阅状态变更通知), 除了发送适当的名册推送(或当下次名册被一个可用资源请求时发送更新的名册), 它必须(MUST)递送这个请求或通知给预定的接收者至少一次. 一个服务器可以(MAY)要求接收者的回执以承认接收到了所有状态变更通知(并且必须(MUST)要求承认订阅请求的情形, 换言之,类型的出席信息节&amp;quot;subscribe&amp;quot;). 为了要求回执, 一个服务器应该(SHOULD)在每次接收者登陆的时候发送这个请求或通知给它, 直到这个接收者承认收到这个通知(通过证实&amp;quot;affirming&amp;quot;或禁止&amp;quot;denying&amp;quot;这个通知),如下表:&lt;br /&gt;
&lt;br /&gt;
:表 7: 订阅状态变更通知的承认&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!节类型 !! 接受 !! 禁止          &lt;br /&gt;
|-&lt;br /&gt;
|subscribe || subscribed || unsubscribed  &lt;br /&gt;
|-&lt;br /&gt;
|subscribed || subscribe || unsubscribe   &lt;br /&gt;
|-&lt;br /&gt;
|unsubscribe || unsubscribed || subscribed    &lt;br /&gt;
|-&lt;br /&gt;
|unsubscribed || unsubscribe || subscribe     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:显然, 根据前述的订阅状态图表, 一些回执节将被路由到联系人并且导致状态的变更, 而其他的则不会.  无论如何, 任何这样的节必须(MUST)导致服务器不再发送订阅状态变更通知给用户.&lt;br /&gt;
&lt;br /&gt;
:因为在接收到roster set(其'subscription'属性值设为&amp;quot;remove&amp;quot;(见 移除一个名册条目并且取消所有订阅项 Removing a Roster Item and Cancelling All Subscriptions (第八章第六节)))之后,用户的服务器必须(MUST)自动生成&amp;quot;unsubscribe&amp;quot;和&amp;quot;unsubscribed&amp;quot;类型的出站出席信息节,服务器必须(MUST)把一个名册移除请求视为发送所有这些出席信息节,以决定是否继续向用户发送&amp;quot;subscribe&amp;quot;或&amp;quot;subscribed&amp;quot;类型的订阅状态变更通知.&lt;br /&gt;
&lt;br /&gt;
==屏蔽通信==&lt;br /&gt;
&lt;br /&gt;
:大多数即时消息系统已发现有必要实现一些方法来为用户屏蔽来自某些特定的其他用户的通信(这在[IMP-REQS]的第五章第一节第五小节, 第五章第一节第十五小节,第五章第三节第二小节, 和第五章第四节第十小节中也有要求). 在XMPP中这是由管理某人的隐私列表来实现的(使用'jabber:iq:privacy'名字空间).&lt;br /&gt;
&lt;br /&gt;
:服务器端的隐私列表使得以下用例能够完成:&lt;br /&gt;
&lt;br /&gt;
:* 接收某人的隐私列表.&lt;br /&gt;
&lt;br /&gt;
:* 增加, 移除, 和 编辑某人的隐私列表.&lt;br /&gt;
&lt;br /&gt;
:* 设置, 改变, 或 取消 激活的列表.&lt;br /&gt;
&lt;br /&gt;
:* 设置, 改变, 或 取消 缺省的列表 (换言之, 缺省激活的那个列表).&lt;br /&gt;
&lt;br /&gt;
:* 基于JID, group, 或 subscription 类型(或全局的) 允许或屏蔽消息.&lt;br /&gt;
&lt;br /&gt;
:* 允许或屏蔽入站出席信息通知,基于 JID, group, 或 subscription 类型 (或全局的).&lt;br /&gt;
&lt;br /&gt;
:* 允许或屏蔽出站出席信息通知,基于 JID, group, 或 subscription 类型 (或全局的).&lt;br /&gt;
&lt;br /&gt;
:* 允许或屏蔽 IQ 节, 基于 JID, group,或 subscription 类型(或全局的).&lt;br /&gt;
&lt;br /&gt;
:* 允许或屏蔽所有通信, 基于 JID, group, 或 subscription 类型(或全局的).&lt;br /&gt;
&lt;br /&gt;
:注意: 出席信息通知不包括出席信息订阅,只包括广播给那些已订阅了用户出席信息的实体的出席信息. 因而这包括没有'type'属性或只包含type='unavailable'的的出席信息节.&lt;br /&gt;
&lt;br /&gt;
===语法和语义===&lt;br /&gt;
&lt;br /&gt;
:一个用户可以(MAY)定义一个或更多的隐私列表, 它们由用户的服务器保存. 每个&amp;lt;list/&amp;gt;元素包含一个或多个格式为&amp;lt;item/&amp;gt;元素的规则, 并且每个&amp;lt;item/&amp;gt;元素使用属性来定义一个隐私规则类型, 一个适用于规则的特定值, 相应的动作, 和处理顺序相应的条目位置.&lt;br /&gt;
&lt;br /&gt;
:语法如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='foo'&amp;gt;&lt;br /&gt;
         &amp;lt;item&lt;br /&gt;
             type='[jid|group|subscription]'&lt;br /&gt;
             value='bar'&lt;br /&gt;
             action='[allow|deny]'&lt;br /&gt;
             order='unsignedInt'&amp;gt;&lt;br /&gt;
           [&amp;lt;message/&amp;gt;]&lt;br /&gt;
           [&amp;lt;presence-in/&amp;gt;]&lt;br /&gt;
           [&amp;lt;presence-out/&amp;gt;]&lt;br /&gt;
           [&amp;lt;iq/&amp;gt;]&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:如果类型是&amp;quot;jid&amp;quot;, 那么'value'属性必须(MUST)包含一个合法的Jabber ID. JIDs 应该(SHOULD)满足以下顺序:&lt;br /&gt;
&lt;br /&gt;
:# &amp;lt;user@domain/resource&amp;gt; (仅为匹配的资源)&lt;br /&gt;
:# &amp;lt;user@domain&amp;gt; (任何匹配的资源)&lt;br /&gt;
:# &amp;lt;domain/resource&amp;gt; (仅匹配的资源)&lt;br /&gt;
:# &amp;lt;domain&amp;gt; (匹配这个域本身, 正如任何 user@domain, domain/resource, 或 包含一个子域的地址)&lt;br /&gt;
&lt;br /&gt;
:如果类型为&amp;quot;group&amp;quot;, 那么'value'属性应该(SHOULD)包含组在用户的名册中的名字. (如果一个客户端尝试更新, 新建, 或删除一个不在用户名册中的组的列表条目, 服务器应该(SHOULD)返回给客户端一个&amp;lt;item-not-found/&amp;gt;节错误.)&lt;br /&gt;
&lt;br /&gt;
:如果类型是&amp;quot;subscription&amp;quot;, 那么'value'属性必须(MUST)是&amp;quot;both&amp;quot;, &amp;quot;to&amp;quot;, &amp;quot;from&amp;quot;, 或&amp;quot;none&amp;quot; (定义在 名册语法和语义Roster Syntax and Semantics (第七章第一节))中的一个人, 在这里 &amp;quot;none&amp;quot; 包括对于用户来说完全未知和根本不在用户名册中的实体.&lt;br /&gt;
&lt;br /&gt;
:如果没有包含'type'属性, 这个规则提供 失败&amp;quot;fall-through&amp;quot; 情景.&lt;br /&gt;
&lt;br /&gt;
::'action'属性必须(MUST)被包含并且它的值必须(MUST)是 允许&amp;quot;allow&amp;quot;或 禁止&amp;quot;deny&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
::'order'属性必须(MUST)被包含并且它的值必须(MUST)是一个在列表的所有条目中具有唯一性的非负整数.  (如果一个客户端尝试以一个非唯一的order值建立或更新一个列表, 服务器必须(MUST)返回给客户端一个&amp;lt;bad-request/&amp;gt;节错误.)&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;item/&amp;gt;元素可以(MAY)包含一个或更多子元素,使得一个实体可以指明更多的细微控制包括屏蔽哪些种类的节(换言之, 不只是简单地屏蔽所有节). 允许的子元素包括:&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;message/&amp;gt; -- 屏蔽引入消息节&lt;br /&gt;
:* &amp;lt;iq/&amp;gt; -- 屏蔽引入 IQ 节&lt;br /&gt;
:* &amp;lt;presence-in/&amp;gt; -- 屏蔽引入出席信息通知&lt;br /&gt;
:* &amp;lt;presence-out/&amp;gt; -- 屏蔽外出出席信息通知&lt;br /&gt;
&lt;br /&gt;
:在&amp;quot;jabber:iq:privacy'名字空间之内, 一个&amp;quot;set&amp;quot;类型的IQ节的&amp;lt;query/&amp;gt;子元素不能(MUST NOT)包含超过一个子元素(换言之, 这个节必须(MUST)只包含一个&amp;lt;active/&amp;gt;元素, 一个&amp;lt;default/&amp;gt;元素, 或一个&amp;lt;list/&amp;gt;元素); 如果一个发送中的实体违反了这个规则, 接收中的实体必须(MUST)返回一个 return a &amp;lt;bad-request/&amp;gt;节错误.&lt;br /&gt;
&lt;br /&gt;
:当一个客户端增加或更新一个隐私列表, &amp;lt;list/&amp;gt;元素应该(SHOULD)包含至少一个&amp;lt;item/&amp;gt;子元素; 当一个客户端移除一个隐私列表的时候, &amp;lt;list/&amp;gt;元素不能(MUST NOT)包含任何&amp;lt;item/&amp;gt;子元素.&lt;br /&gt;
&lt;br /&gt;
:当一个客户端更新一个隐私列表的时候, 它必须包含所有想得到的条目(换言之, 不是一个&amp;quot;delta&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
===商业规则===&lt;br /&gt;
&lt;br /&gt;
:# 如果有一个为某会话设置的激活的列表, 它只影响为其激活的那个会话, 并且只在那一个会话的持续期间有效; 服务器必须(MUST)只应用激活列表,并且不能(MUST NOT)应用缺省列表(换言之, 列表没有层次&amp;quot;layering&amp;quot;).&lt;br /&gt;
:# 缺省列表总体适用于用户, 并且如果没有为一个节指向的目标session/resource设置激活列表,或用户当前没有会话,它会被处理.&lt;br /&gt;
:# 如果没有为一个会话设置激活列表(或用户当前没有会话), 并且没有缺省列表,那么所有节应该被(SHOULD BE)接受或由服务器代替用户做适当的处理(遵守 用于处理XML节的服务器规则 Server Rules for Handling XML Stanzas (第十一章)).&lt;br /&gt;
:# 隐私列表必须(MUST)是第一个由服务器应用的递送规则, 替代 (1) 定义在 用于处理XML节的服务器规则Server Rules for Handling XML Stanzas (第十一章)的路由和递送规则, 以及 (2)和订阅相关的出席信息节的处理(和相应的名册推送的生成) 定义在 名册条目和出席信息订阅的集成Integration of Roster Items and Presence Subscriptions (第八章).&lt;br /&gt;
:# 服务器处理隐私列表条目的顺序是很重要的. 列表条目必须(MUST)按照每个&amp;lt;item/&amp;gt;的'order'属性的整数值的升序来处理.&lt;br /&gt;
:# 一旦节和一个隐私列表规则匹配, 服务器必须(MUST)按照这个规则适当地处理这个节,然后终止处理.&lt;br /&gt;
:# 如果在一个列表中没有提供一个fall-through的条目, fall-through 动作被假定为 允许&amp;quot;allow&amp;quot;.&lt;br /&gt;
:# 如果一个用户为一个激活列表更新定义, 之后的基于那个激活列表的操作必须(MUST)使用更新的定义(为了那些激活列表正应用的所有资源).&lt;br /&gt;
:# 如果在用户的会话期间,在激活的或缺省的列表中定义的名册条目中的订阅状态改变了,或名册组改变了,接下来基于那个列表的处理必须(MUST)考虑计入这个已改变的状态或组(对那个列表当前应用的所有资源).&lt;br /&gt;
:# 当一个规则的定义修改了的时候, 服务器必须(MUST)发送一个类型为&amp;quot;set&amp;quot;的IQ节给所有已连接的资源, 包括一个只有一个&amp;lt;list/&amp;gt;子元素的&amp;lt;query/&amp;gt;元素, 其'name'属性设为已修改的隐私列表的名字. 这些         隐私列表推送(&amp;quot;privacy list pushes&amp;quot;)遵守和用于名册管理的名册推送(&amp;quot;roster pushes&amp;quot;)同样的语义 , 除了被推送给已连接的资源的列表名字本身(不是完整的列表定义或那个&amp;quot;delta&amp;quot;). 是否接受这个修改了的列表定义最终由接收中的资源来决定, 尽管如果这个列表正在应用于一个已连接的资源,它应该(SHOULD)这样做.&lt;br /&gt;
:# 当一个已连接的资源尝试移除一个列表或指定一个新的缺省列表,而那个列表应用于一个已连接的资源而不是正在发送的资源, 服务器必须(MUST)返回一个&amp;lt;conflict/&amp;gt;错误给发送中的资源并且不能(MUST NOT)执行这个请求的改变.&lt;br /&gt;
&lt;br /&gt;
===接收某人的隐私列表===&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端向服务器请求隐私列表的名字:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='get' id='getlist1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'/&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 服务器发送隐私列表的名字给客户端, 激活列表和缺省列表放在前面:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' id='getlist1' to='romeo@example.net/orchard'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;active name='private'/&amp;gt;&lt;br /&gt;
       &amp;lt;default name='public'/&amp;gt;&lt;br /&gt;
       &amp;lt;list name='public'/&amp;gt;&lt;br /&gt;
       &amp;lt;list name='private'/&amp;gt;&lt;br /&gt;
       &amp;lt;list name='special'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端向服务器请求一个隐私列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='get' id='getlist2'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='public'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 服务器发送一个隐私列表给客户端:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' id='getlist2' to='romeo@example.net/orchard'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='public'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='jid'&lt;br /&gt;
               value='tybalt@example.com'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='1'/&amp;gt;&lt;br /&gt;
         &amp;lt;item action='allow' order='2'/&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端向服务器请求另一个隐私列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='get' id='getlist3'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='private'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 服务器发送另一个隐私列表给客户端:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' id='getlist3' to='romeo@example.net/orchard'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='private'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='subscription'&lt;br /&gt;
               value='both'&lt;br /&gt;
               action='allow'&lt;br /&gt;
               order='10'/&amp;gt;&lt;br /&gt;
         &amp;lt;item action='deny' order='15'/&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端再向服务器请求另一个隐私列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='get' id='getlist4'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='special'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 服务器再发送另一个隐私列表给客户端:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' id='getlist4' to='romeo@example.net/orchard'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='special'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='jid'&lt;br /&gt;
               value='juliet@example.com'&lt;br /&gt;
               action='allow'&lt;br /&gt;
               order='6'/&amp;gt;&lt;br /&gt;
         &amp;lt;item type='jid'&lt;br /&gt;
               value='benvolio@example.org'&lt;br /&gt;
               action='allow'&lt;br /&gt;
               order='7'/&amp;gt;&lt;br /&gt;
         &amp;lt;item type='jid'&lt;br /&gt;
               value='mercutio@example.org'&lt;br /&gt;
               action='allow'&lt;br /&gt;
               order='42'/&amp;gt;&lt;br /&gt;
         &amp;lt;item action='deny' order='666'/&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:在这个例子中, 用户有三个列表: (1) 'public', 它允许所有人的通信,除了一个指定的实体(这是缺省列表); (2) 'private', 它只允许和这个用户有双向订阅的联系人的通信(这是激活的列表); 还有 (3) 'special', 它只允许三个指定的实体通信.&lt;br /&gt;
&lt;br /&gt;
:如果用户尝试接收一个列表但是这个列表的名字不存在, 服务器必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;节错误给用户:&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端尝试接收不存在的列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='romeo@example.net/orchard' type='error' id='getlist5'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='The Empty Set'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;item-not-found&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:用户在一次只被允许接收一个列表. 如果用户尝试同一个请求中接收超过一个列表, 服务器必须(MUST)返回一个&amp;lt;bad request/&amp;gt;节错误给用户:&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端尝试接收多于一个的列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='romeo@example.net/orchard' type='error' id='getlist6'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='public'/&amp;gt;&lt;br /&gt;
       &amp;lt;list name='private'/&amp;gt;&lt;br /&gt;
       &amp;lt;list name='special'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
     &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
       &amp;lt;bad-request&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===管理激活列表===&lt;br /&gt;
&lt;br /&gt;
:为了设置或改变服务器当前应用的激活列表, 用户必须(MUST)发送一个类型为&amp;quot;set&amp;quot;的IQ节,包含一个符合'jabber:iq:privacy'名字空间的&amp;lt;query/&amp;gt;元素,这个元素&amp;lt;query/&amp;gt;又包含一个空的&amp;lt;active/&amp;gt;子元素,而这个&amp;lt;active/&amp;gt;拥有一个'name'属性,'name'属性值则设为期望的列表名.&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端请求激活列表变更:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='active1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;active name='special'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:服务器必须(MUST)在返回结果给客户端之前激活并应用这个已请求的列表.&lt;br /&gt;
&lt;br /&gt;
:例子: 服务器承认激活列表变更成功:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' id='active1' to='romeo@example.net/orchard'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:如果用户尝试设置一个激活列表但是列表名不存在, 服务器必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;节错误给用户:&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端尝试设置一个不存在的列表作为激活列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='romeo@example.net/orchard' type='error' id='active2'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;active name='The Empty Set'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;item-not-found&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:为了取消使用任何激活列表, 已连接的资源必须(MUST)发送一个空的&amp;lt;active/&amp;gt;元素,并且不带'name'属性.&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端取消使用激活列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='active3'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;active/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 服务器承认取消任何激活列表成功:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' id='active3' to='romeo@example.net/orchard'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===管理缺省列表===&lt;br /&gt;
&lt;br /&gt;
:为了改变它的缺省列表(它对用户来说是全局应用的, 不只是发送中的资源), 用户必须(MUST)发送一个类型为&amp;quot;set&amp;quot;的IQ节, 它包含一个符合'jabber:iq:privacy'名字空间的&amp;lt;query/&amp;gt;元素,这个&amp;lt;query/&amp;gt;元素包含一个空的&amp;lt;default/&amp;gt;子元素,这个&amp;lt;default/&amp;gt;子元素拥有一个'name'属性,这个'name'属性的值设为期望的列表名.&lt;br /&gt;
&lt;br /&gt;
:例子: 用户请求变更缺省列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='default1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;default name='special'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 服务器承认缺省列表变更成功:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' id='default1' to='romeo@example.net/orchard'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:如果用户尝试变更一个缺省列表但是这个缺省列表正在由至少一个已连接的但不是当前发送中的这个资源使用着,服务器必须(MUST)返回一个&amp;lt;conflict/&amp;gt;节错误给发送中的资源:&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端尝试改变一个缺省列表但是这个列表正在被另一个资源使用:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='romeo@example.net/orchard' type='error' id='default1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;default name='special'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;conflict&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:如果用户尝试设置一个缺省列表但是这个列表的名字不存在, 服务器必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;节错误给用户:&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端尝试设置一个不存在的列表作为缺省列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='romeo@example.net/orchard' type='error' id='default1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;default name='The Empty Set'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;item-not-found&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:为了取消使用缺省列表(换言之, 任何时候都使用域的节路由规则), 用户必须(MUST)发送一个空的不带'name'属性的&amp;lt;default/&amp;gt;元素.&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端取消使用缺省列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='default2'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;default/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 服务器承认成功地取消了任何缺省列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' id='default2' to='romeo@example.net/orchard'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:如果一个已连接的资源尝试取消一个用户全局的缺省列表但是这个缺省列表正在应用于另一个已连接的资源,服务器必须(MUST)返回一个&amp;lt;conflict/&amp;gt;错误给发送中的资源:&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端尝试取消一个缺省列表但是这个列表正在被另一个资源使用:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='romeo@example.net/orchard' type='error' id='default3'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;default/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;conflict&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===编辑一个隐私列表===&lt;br /&gt;
&lt;br /&gt;
:为了编辑一个隐私列表, 用户必须(MUST)一个类型为&amp;quot;set&amp;quot;的IQ节,包含一个符合'jabber:iq:privacy'名字空间的&amp;lt;query/&amp;gt;元素,这个&amp;lt;query/&amp;gt;元素包含一个拥有一个&amp;lt;list/&amp;gt;子元素,这个&amp;lt;list/&amp;gt;子元素拥有一个'name'属性,这个'name'属性的值设为用户想编辑的列表名. 这个&amp;lt;list/&amp;gt;元素必须(MUST)包含一个或多个&amp;lt;item/&amp;gt;元素, 它们包含了列表中的所有元素以指明用户期望的对列表的变更(不是the &amp;quot;delta&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端编辑隐私列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='edit1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='public'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='jid'&lt;br /&gt;
               value='tybalt@example.com'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='3'/&amp;gt;&lt;br /&gt;
         &amp;lt;item type='jid'&lt;br /&gt;
               value='paris@example.org'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='5'/&amp;gt;&lt;br /&gt;
         &amp;lt;item action='allow' order='68'/&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 服务器承认列表编辑成功:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' id='edit1' to='romeo@example.net/orchard'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:注意: 任何给定的条目的'order'属性值不是固定的. 因而在前述的例子中如果用户想在&amp;quot;tybalt@example.com&amp;quot;条目和&amp;quot;paris@example.org&amp;quot;条目之间增加4个条目, 用户的客户端必须(MUST)在向服务器提交列表之前对相关的条目重新编号.&lt;br /&gt;
&lt;br /&gt;
:服务器必须(MUST)现在发送一个 隐私列表推送&amp;quot;privacy list push&amp;quot;给所有已连接的资源:&lt;br /&gt;
&lt;br /&gt;
:例子: 基于列表编辑的隐私列表推送:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='romeo@example.net/orchard' type='set' id='push1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='public'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
   &amp;lt;iq to='romeo@example.net/home' type='set' id='push2'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='public'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:按照定义在[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]的IQ节语义, 每个已连接的子元素必须(MUST)返回一个如下的 IQ result 给服务器:&lt;br /&gt;
&lt;br /&gt;
:例子: 承认收到一个隐私列表推送:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard'&lt;br /&gt;
       type='result'&lt;br /&gt;
       id='push1'/&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/home'&lt;br /&gt;
       type='result'&lt;br /&gt;
       id='push2'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===增加一个新的隐私列表===&lt;br /&gt;
&lt;br /&gt;
:增加一个新的列表和编辑一个现有的列表使用的协议是相同的. 如果列表名和现有的列表名吻合, 这个增加新列表的请求将覆写那个旧的列表. 正如编辑列表一样, 服务器也必须(MUST)发送一个 隐私列表推送&amp;quot;privacy list push&amp;quot; 给所有已连接的资源.&lt;br /&gt;
&lt;br /&gt;
===移除一个隐私列表===&lt;br /&gt;
&lt;br /&gt;
:为了移除一个隐私列表, 用户必须(MUST)发送一个类型为&amp;quot;set&amp;quot;的IQ节,包含一个符合'jabber:iq:privacy'名字空间的&amp;lt;query/&amp;gt;元素,这个&amp;lt;query/&amp;gt;元素包含一个空的&amp;lt;list/&amp;gt;子元素,这个&amp;lt;list/&amp;gt;子元素拥有一个'name'属性,这个'name'属性的值设为用户想移除的列表名.&lt;br /&gt;
&lt;br /&gt;
:例子: 客户端移除一个隐私列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='remove1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='private'/&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
:例子: 服务器承认成功地移除列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='result' id='remove1' to='romeo@example.net/orchard'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:如果一个用户尝试移除一个列表而这个列表正在被应用于至少一个和发送中的资源不同的已连接的资源, 服务器必须(MUST)返回一个&amp;lt;conflict/&amp;gt;节错误给用户; 换言之, 用户在尝试移除它之前必须(MUST)先设置另一个列表成为激活或缺省列表. 如果用户尝试移除一个列表但是列表名字不存在, 服务器必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;节错误给用户. 如果用户尝试在同一个请求中移除超过一个的列表, 服务器必须(MUST)反回一个&amp;lt;bad request/&amp;gt;节错误给用户.&lt;br /&gt;
&lt;br /&gt;
===屏蔽消息===&lt;br /&gt;
&lt;br /&gt;
:服务器端的隐私列表使得一个用户可以基于实体的JID,名册组,或订阅状态(或全局地)来屏蔽从其他实体引入的消息. 以下例子阐明这个协议. (注意: 为了精简, &amp;quot;result&amp;quot;类型的IQ节没有在以下例子中显示, 隐私列表推送也没有显示.)&lt;br /&gt;
&lt;br /&gt;
:例子: 基于JID的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='msg1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='message-jid-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='jid'&lt;br /&gt;
               value='tybalt@example.com'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='3'&amp;gt;&lt;br /&gt;
           &amp;lt;message/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会接收到从特定JID发来的消息.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于名册组的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='msg2'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='message-group-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='group'&lt;br /&gt;
               value='Enemies'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='4'&amp;gt;&lt;br /&gt;
           &amp;lt;message/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会收到从指定名册组中的任何实体发来的消息.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于订阅状态的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='msg3'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='message-sub-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='subscription'&lt;br /&gt;
               value='none'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='5'&amp;gt;&lt;br /&gt;
           &amp;lt;message/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会收到从任何指定订阅状态的实体发来的消息.&lt;br /&gt;
&lt;br /&gt;
:例子: 全局的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='msg4'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='message-global-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item action='deny' order='6'&amp;gt;&lt;br /&gt;
           &amp;lt;message/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会收到从任何其他用户发来的消息.&lt;br /&gt;
&lt;br /&gt;
===屏蔽入站出席信息通知===&lt;br /&gt;
&lt;br /&gt;
:服务器端的隐私列表使得用户可以基于实体的JID,名册组,或订阅状态(或全局地)屏蔽来自其他实体的入站出席信息通知. 以下例子阐明了这个协议.&lt;br /&gt;
&lt;br /&gt;
:注意: 出席信息通知不包括出席信息订阅,只是把出席信息广播给当前已订阅某个联系人的出席信息的用户. 所以它只包括没有'type'属性的或type='unavailable'的出席信息节.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于JID的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='presin1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='presin-jid-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='jid'&lt;br /&gt;
               value='tybalt@example.com'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='7'&amp;gt;&lt;br /&gt;
           &amp;lt;presence-in/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会收到从指定JID发来的出席信息通知.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于名册组的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='presin2'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='presin-group-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='group'&lt;br /&gt;
               value='Enemies'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='8'&amp;gt;&lt;br /&gt;
           &amp;lt;presence-in/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会从指定的名册组中的任何实体收到出席信息通知.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于订阅状态的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='presin3'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='presin-sub-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='subscription'&lt;br /&gt;
               value='to'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='9'&amp;gt;&lt;br /&gt;
           &amp;lt;presence-in/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会从指定订阅状态的任何实体收到出席信息通知.&lt;br /&gt;
&lt;br /&gt;
:例子: 全局的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='presin4'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='presin-global-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item action='deny' order='11'&amp;gt;&lt;br /&gt;
           &amp;lt;presence-in/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会从任何其他实体收到出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===屏蔽出站出席信息通知===&lt;br /&gt;
&lt;br /&gt;
:服务器端的隐私列表使用户能够屏蔽发出到其他实体的出席信息通知(基于实体的JID, 名册组, 或订阅状态 (或全局的)). 以下例子阐明了这个协议.&lt;br /&gt;
&lt;br /&gt;
:注意: 出席信息通知不包括出席信息订阅,只把出席信息广播给已订阅了用户的出席信息的联系人.所以 只包括没有'type'属性或type='unavailable'的出席信息节.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于JID的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='presout1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='presout-jid-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='jid'&lt;br /&gt;
               value='tybalt@example.com'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='13'&amp;gt;&lt;br /&gt;
           &amp;lt;presence-out/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会给指定JID发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于名册组的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='presout2'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='presout-group-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='group'&lt;br /&gt;
               value='Enemies'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='15'&amp;gt;&lt;br /&gt;
           &amp;lt;presence-out/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会向指定名册组的任何实体发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于订阅状态的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='presout3'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='presout-sub-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='subscription'&lt;br /&gt;
               value='from'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='17'&amp;gt;&lt;br /&gt;
           &amp;lt;presence-out/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会向指定订阅状态的任何实体发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
:例子: 全局的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='presout4'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='presout-global-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item action='deny' order='23'&amp;gt;&lt;br /&gt;
           &amp;lt;presence-out/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会向任何其他用户发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===屏蔽IQ节===&lt;br /&gt;
&lt;br /&gt;
:服务器端的隐私列表使用户能够屏蔽从其他实体进来的IQ节(基于实体的JID,名册组, 或订阅状态(或全局地)). 以下例子阐明了这个协议.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于JID的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='iq1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='iq-jid-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='jid'&lt;br /&gt;
               value='tybalt@example.com'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='29'&amp;gt;&lt;br /&gt;
            &amp;lt;iq/&amp;gt;&lt;br /&gt;
          &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用这个列表的结果, 用户将不会收到从指定JID发来的IQ节.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于名册组的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='iq2'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='iq-group-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='group'&lt;br /&gt;
               value='Enemies'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='31'&amp;gt;&lt;br /&gt;
            &amp;lt;iq/&amp;gt;&lt;br /&gt;
          &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会收到从指定名册组的任何实体发来的IQ节.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于订阅状态的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='iq3'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='iq-sub-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='subscription'&lt;br /&gt;
               value='none'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='17'&amp;gt;&lt;br /&gt;
            &amp;lt;iq/&amp;gt;&lt;br /&gt;
          &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会收到从指定订阅状态的任何实体发来的IQ节.&lt;br /&gt;
&lt;br /&gt;
:例子: 全局的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='iq4'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='iq-global-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item action='deny' order='1'&amp;gt;&lt;br /&gt;
           &amp;lt;iq/&amp;gt;&lt;br /&gt;
         &amp;lt;/item&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会收到从任何其他用户发来的IQ节.&lt;br /&gt;
&lt;br /&gt;
===屏蔽所有通信===&lt;br /&gt;
&lt;br /&gt;
:服务器端的隐私列表使用户能够基于其他实体的JID,名册组,或订阅状态(或全局的)屏蔽所有进来和出去的节. 注意那部包括订阅相关的出席信息节, 它们被排除在外 (定义在 屏蔽入站出席信息通知Blocking Inbound Presence Notifications (第十章第十节)). 以下例子阐明了这个协议.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于JID的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='all1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='all-jid-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='jid'&lt;br /&gt;
               value='tybalt@example.com'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='23'/&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用这个列表的结果, 用户将不会收到和发送任何通信给指定JID.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于名册组的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='all2'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='all-group-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='group'&lt;br /&gt;
               value='Enemies'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='13'/&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会收到和发送和指定名册组的任何实体的通信.&lt;br /&gt;
&lt;br /&gt;
:例子: 基于订阅状态的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='all3'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='all-sub-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='subscription'&lt;br /&gt;
               value='none'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='11'/&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会收到和发送和指定订阅状态的任何实体的通信.&lt;br /&gt;
&lt;br /&gt;
:例子: 全局的用户屏蔽:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq from='romeo@example.net/orchard' type='set' id='all4'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='all-global-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item action='deny' order='7'/&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:作为建立和应用前述列表的结果, 用户将不会收到和发送和任何其他用户的通信.&lt;br /&gt;
&lt;br /&gt;
===已被屏蔽的实体尝试和用户通信===&lt;br /&gt;
&lt;br /&gt;
:如果一个已被屏蔽的实体尝试发送消息或出席信息给用户, 用户的服务器应该(SHOULD)安静的丢掉这个节并且不能(MUST NOT)返回一个错误给发送的实体.&lt;br /&gt;
&lt;br /&gt;
:如果一个已被屏蔽的实体尝试发送一个类型为&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;的IQ节给用户, 用户的服务器必须(MUST)给发送的实体一个&amp;lt;service-unavailable/&amp;gt;节错误, 因为这是一个客户端不理解IQ get或set的名字空间的时候所发送的标准错误码. 其他类型的IQ节应该(SHOULD)被服务器安静的丢弃.&lt;br /&gt;
&lt;br /&gt;
:例子: 已被屏蔽的实体尝试发送 IQ get:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='get'&lt;br /&gt;
       to='romeo@example.net'&lt;br /&gt;
       from='tybalt@example.com/pda'&lt;br /&gt;
       id='probing1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:version'/&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:例子: 服务器返回一个错误给已被屏蔽的实体:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='error'&lt;br /&gt;
       from='romeo@example.net'&lt;br /&gt;
       to='tybalt@example.com/pda'&lt;br /&gt;
       id='probing1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:version'/&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;service-unavailable&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===高级启发===&lt;br /&gt;
&lt;br /&gt;
:当建立一个高级隐私启发的表达式的时候, 客户端应该(SHOULD)使用尽可能简单的表达式.&lt;br /&gt;
&lt;br /&gt;
:例如, 启发 &amp;quot;屏蔽不在我名册中的任何用户的通信&amp;quot; 可以使用以下任何一种方式来构造:&lt;br /&gt;
&lt;br /&gt;
:* 允许任何来自我的名册中的JID的通信 (换言之, 列出每个JID成为单独的列表条目), 但是屏蔽和其他任何人的通信&lt;br /&gt;
&lt;br /&gt;
:* 允许任何来自我的名册的某个组中的用户的通信(换言之, 列出每个组作为单独的条目), 但是屏蔽和任何其他人的通信&lt;br /&gt;
&lt;br /&gt;
:* 允许任何我的他(她)之间的订阅状态为'both'或'to'或'from'的用户的通信(换言之, 单独列出每个订阅状态值), 但是屏蔽和任何其他人的通信&lt;br /&gt;
&lt;br /&gt;
:* 屏蔽和任何订阅状态为'none'的用户的通信&lt;br /&gt;
&lt;br /&gt;
:最后一个表达式是最简单的并且应该(SHOULD)被使用; 这种情形下将被发送的XML如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;iq type='set' id='heuristic1'&amp;gt;&lt;br /&gt;
     &amp;lt;query xmlns='jabber:iq:privacy'&amp;gt;&lt;br /&gt;
       &amp;lt;list name='heuristic-example'&amp;gt;&lt;br /&gt;
         &amp;lt;item type='subscription'&lt;br /&gt;
               value='none'&lt;br /&gt;
               action='deny'&lt;br /&gt;
               order='437'/&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==服务器处理XML节的规则==&lt;br /&gt;
&lt;br /&gt;
:用于服务器的基本路由和递送规则定义在[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]中. 本章定义附加的用于XMPP兼容的即时消息和出席信息服务器规则.&lt;br /&gt;
&lt;br /&gt;
===入站节===&lt;br /&gt;
&lt;br /&gt;
:如果一个入站的节的'to'属性的JID中的域标识符部分的主机名和服务器自身的主机名相同并且'to'属性的JID的格式是&amp;lt;user@example.com&amp;gt;或&amp;lt;user@example.com/resource&amp;gt;, 服务器必须(MUST)首先强制应用任何隐私列表(第十章),然后服从以下定义的规则:&lt;br /&gt;
&lt;br /&gt;
:# 如果JID的格式是&amp;lt;user@domain/resource&amp;gt;并且有一个可用的资源和这个全JID吻合, 接受这得服务器必须(MUST)递送这个节给那个资源.&lt;br /&gt;
:# 然后如果JID的格式是&amp;lt;user@domain&amp;gt;或格式是&amp;lt;user@domain/resource&amp;gt;,并且和用户相关的帐号不存在, 接收者的服务器 (a) 如果它是一个出席信息节,应该(SHOULD) 安静的忽略这个节(换言之,既不递送它也不返回一个错误), (b) 如果它是一个IQ节,必须(MUST)返回一个&amp;lt;service-unavailable/&amp;gt;节错误给发送者, 并且 (c) 如果它是一个消息节,应该(SHOULD)返回一个&amp;lt;service-unavailable/&amp;gt;节错误给发送者.&lt;br /&gt;
:# 然后如果JID的格式是&amp;lt;user@domain/resource&amp;gt;并且没有可用的资源和它的全JID匹配, 接收者的服务器 (a) 如果它是一个出席信息节,应该(SHOULD)安静地忽略这个节(换言之, 既不递送它也不返回一个错误), (b) 如果它是一个IQ节,必须(MUST)返回一个&amp;lt;service-unavailable/&amp;gt;节错误给发送者, 并且 (c) 如果它是一个消息节,应该(SHOULD)把这个节视为发往&amp;lt;user@domain&amp;gt;.&lt;br /&gt;
:# 然后如果JID的格式是&amp;lt;user@domain&amp;gt;并且这个用户至少有一个可用的资源, 接收者的服务器必须(MUST)遵守以下规则:&lt;br /&gt;
:## 对于消息节, 服务器应该(SHOULD)递送这个节给高优先级的可用资源(如果这个资源没有提供&amp;lt;priority/&amp;gt;元素的值, 服务器应该(SHOULD)认为它提供的值为零). 如果两个或更多的可用资源有相同的优先级, 服务器可以(MAY)使用一些其他的规则(例如, 最近的连接时间, 最近的活动时间, 或由一些&amp;lt;show/&amp;gt;值的层次所定义的最高的可用性) 来从它们中间选择,或可以(MAY)递送这个消息到所有这些资源. 无论如何, 服务器不能(MUST NOT)这个节到一个优先级为负数的可用资源; 如果唯一的一个可用资源的优先级是负数, 服务器应该(SHOULD)当成没有可用资源一样处理这个消息(定义在后面). 另外, 服务器不能(MUST NOT)重写'to'属性(换言之, 它必须(MUST)让它保持&amp;lt;user@domain&amp;gt;而不是改成&amp;lt;user@domain/resource&amp;gt;).&lt;br /&gt;
:## 对于类型不是&amp;quot;probe&amp;quot;的出席信息节, 服务器必须(MUST)递送这个节给所有可用的资源;对于出席信息调查, 服务器应该(SHOULD)基于定义在 出席信息调查Presence Probes (第五章第一节第三小节)的规则来应答. 另外, 服务器不能(MUST NOT)重写'to'属性(换言之, 它必须(MUST)保持&amp;lt;user@domain&amp;gt;而不是改为&amp;lt;user@domain/resource&amp;gt;).&lt;br /&gt;
:## 对于IQ节, 服务器本身必须(MUST)代替用户应答一个IQ result或一个IQ error, 并且不能(MUST NOT)递送这个IQ节给任何可用的资源. 具体来说, 如果合格的名字空间的语义定义了一个服务器可以提供的应答, 服务器必须(MUST)代替用户应答这个节; 如果没有, 服务器必须(MUST)应答一个&amp;lt;service-unavailable/&amp;gt;节错误.&lt;br /&gt;
:# 然后如果JID的格式为&amp;lt;user@domain&amp;gt;并且没有这个用户的可用资源, 这个节如何处理依赖于节的类型:&lt;br /&gt;
:## 对于类型为&amp;quot;subscribe&amp;quot;, &amp;quot;subscribed&amp;quot;, &amp;quot;unsubscribe&amp;quot;, 和&amp;quot;unsubscribed&amp;quot;的出席信息节, 服务器必须(MUST)维持这个节的一个记并且至少递送这个节一次(也就是, 当这个用户下次建立一个可用的资源的时候); 另外, 服务器必须(MUST)递送类型为&amp;quot;subscribe&amp;quot;的出席信息节直到用户批准或拒绝这个订阅请求为止(参见 出席信息订阅Presence Subscriptions (第五章第一节第六小节)).&lt;br /&gt;
:## 对于所有其他的出席信息节, 服务器应该(SHOULD)安静的忽略这个节,既不存储它用于以后递送也不代替用户应答它.&lt;br /&gt;
:## 对于消息节, 服务器可以(MAY)选择代替用户存储这个节并且当用户下次可用的时候递送给他, 或通过一些其他的手段转发这个消息给用户(例如, 给用户的邮箱). 无论如何, 如果离线消息存储或消息转发没有激活, 服务器必须(MUST)返回发送者一个&amp;lt;service-unavailable/&amp;gt;节错误. (注意:离线信息存储和消息转发没有定义在 XMPP, 因为严格来说它们是实现和服务提供的问题.)&lt;br /&gt;
:## 对于IQ节, 服务器本身必须(MUST)代替用户应答一个IQ result或一个IQ error. 具体来说,如果合法的名字空间的语义定义了一个服务器可以提供的应答, 服务器必须(MUST)代替用户应答这个节; 如果没有, 服务器必须(MUST)应答一个&amp;lt;service-unavailable/&amp;gt;节错误.&lt;br /&gt;
&lt;br /&gt;
===出站节===&lt;br /&gt;
&lt;br /&gt;
:如果出站节的'to'属性的地址的域标识符部分的主机名和服务器自身的一个主机名吻合, 服务器必须(MUST) 根据 入站节Inbound Stanzas(第十一章第一节)的规则递送这个节给一个本地实体.&lt;br /&gt;
&lt;br /&gt;
:如果出站节的'to'属性的地址的域标识符部分的主机名不和服务器自身的一个主机名吻合, 服务器必须(MUST)尝试路由这个节到外部域. 推荐的动作顺序定义如下:&lt;br /&gt;
&lt;br /&gt;
:# 首先尝试用一个&amp;quot;xmpp-server&amp;quot;服务和&amp;quot;tcp&amp;quot;协议的[SRV]服务解析这个外部的主机名,结果得到的资源记录格式如&amp;quot;_xmpp-server._tcp.example.com.&amp;quot;, 定义在[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920].&lt;br /&gt;
:# 如果&amp;quot;xmpp-server&amp;quot;地址记录解析失败, 尝试解析&amp;quot;_im&amp;quot;或&amp;quot;_pres&amp;quot;[SRV]服务(定义在[IMP-SRV]), 使用&amp;quot;_im&amp;quot;服务用语&amp;lt;message/&amp;gt;节,使用&amp;quot;_pres&amp;quot;服务用语&amp;lt;presence/&amp;gt;节(如何处理&amp;lt;iq/&amp;gt;节取决于具体实现). 这样得到的结果是一个或多个格式为&amp;quot;_im.&amp;lt;proto&amp;gt;.example.com.&amp;quot;或     &amp;quot;_pres.&amp;lt;proto&amp;gt;.example.com.&amp;quot;的记录, 这里&amp;quot;&amp;lt;proto&amp;gt;&amp;quot;是一个注册在 即时消息SRV协议标签注册表Instant Messaging SRV Protocol Label registry中的一个标签,或者是 出席信息SRV协议标签注册表Presence SRV Protocol Label registry中的标签: 要么是&amp;quot;_xmpp&amp;quot;,用于XMPP-aware的域,要么是一些 IANA注册的标签IANA-registered label (例如,&amp;quot;_simple&amp;quot;) 用于 non-XMPP-aware 的域.&lt;br /&gt;
:# 如果这两种SRV地址记录解析都失败了, 尝试执行一个通用的 IPv4/IPv6 地址记录解析来决定IP地址,使用&amp;quot;xmpp-server&amp;quot;端口号5269(已在IANA注册, 定义在[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]).&lt;br /&gt;
&lt;br /&gt;
:强烈鼓励部署服务器的管理员们保持 _im._xmpp, _pres._xmpp, 和 _xmpp._tcp SRV 记录正确同步, 因为不同的实现可能在&amp;quot;xmpp-server&amp;quot;查找之前执行&amp;quot;_im&amp;quot;和&amp;quot;_pres&amp;quot;查找.&lt;br /&gt;
&lt;br /&gt;
==即时消息和出席信息兼容性需求==&lt;br /&gt;
&lt;br /&gt;
:本章总结了即时消息和出席信息服务器和客户端为了保证兼容的实现而必须(MUST)支持的部分XMPP协议. 所有这些应用必须(MUST)遵守定义在[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]的要求. 本章的文字定义了附加的用于即时消息和出席信息的兼容性需求; 注意定义在这里的要求补充而不是替代核心需求. 也要注意一个服务器或客户端可以(MAY)仅支持出席信息或即时消息, 如果只想支持出席信息服务或即时消息服务,可以不必同时支持两个.&lt;br /&gt;
&lt;br /&gt;
===服务器===&lt;br /&gt;
&lt;br /&gt;
:除了核心服务器兼容需求之外, 一个即时消息和出席信息服务器必须(MUST)还要支持以下协议:&lt;br /&gt;
&lt;br /&gt;
:* 定义在本文中的所有服务器相关的即时消息和出席信息语法和语义, 包括代替客户端广播出席信息, 出席信息订阅, 名册存储和处理, 隐私列表, 以及 IM-specific 路由和递送规则&lt;br /&gt;
&lt;br /&gt;
===客户端===&lt;br /&gt;
&lt;br /&gt;
:除了核心的客户端兼容性需求之外, 一个即时消息和出席信息客户端还必须(MUST)支持以下协议:&lt;br /&gt;
&lt;br /&gt;
:* 生成和处理由XML规划定义的XML节的IM-specific语义, 包括消息和出席信息节以及它们的子元素的的'type'属性&lt;br /&gt;
&lt;br /&gt;
:* 所有本文定义的客户端相关的即时消息语法和语义, 包括出席信息订阅, 名册管理, 和隐私列表&lt;br /&gt;
&lt;br /&gt;
:* 端到端的对象加密(定义在 XMPP中的端到端对象加密End-to-End Object Encryption in the Extensible Messaging and Presence Protocol (XMPP) [XMPP-E2E])&lt;br /&gt;
&lt;br /&gt;
:一个客户端也必须(MUST)处理编码为&amp;quot;im:&amp;quot; URIs的地址(定义在[CPIM]), 并且可以(MAY)移除&amp;quot;im:&amp;quot;scheme并把地址解析委托给服务器(定义在 出站节Outbound Stanzas(第十一章第二节).&lt;br /&gt;
&lt;br /&gt;
==国际化事项==&lt;br /&gt;
&lt;br /&gt;
:关于国际化的考虑, 参考[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]相关章节.&lt;br /&gt;
&lt;br /&gt;
==安全性事项==&lt;br /&gt;
&lt;br /&gt;
:XMPP的核心安全性事项定义在[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]相关章节.&lt;br /&gt;
&lt;br /&gt;
:附加的事项仅适用于分散定义在本文许多地方的XMPP即时消息和出席信息应用; 特别是:&lt;br /&gt;
&lt;br /&gt;
:* 当一个服务器处理一个任何类型的入站节,这个节的预定接收者是和服务器的主机名相关的一个用户,服务器必须(MUST)首先强制应用任何隐私列表(第十章),见 处理XML节的服务器规则Server Rules for Handling XML Stanzas(第十一章)).&lt;br /&gt;
&lt;br /&gt;
:* 当一个服务器处理一个类型为&amp;quot;probe&amp;quot;的入站出席信息节,这个节的预定接收者是和服务器的主机名相关的一个用户,  如果这个发送者是一个由出席信息订阅决定的未被授权接收那个信息的实体,服务器不能(MUST NOT)揭露这个用户的出席信息(见 客户端和服务器出席信息职责Client and Server Presence Responsibilities (第五章第一节)).&lt;br /&gt;
&lt;br /&gt;
:* 当一个服务器处理一个任何类型的出站出席信息节,这个节没有type属性或type属性值为&amp;quot;unavailable&amp;quot;, 为了确保这个出席信息不被广播给那些未被授权知道这个信息的实体, 它必须(MUST)服从客户端和服务器出席信息职责Client and Server Presence Responsibilities (第五章第一节) 定义的规则 .&lt;br /&gt;
&lt;br /&gt;
:* 当一个服务器生成一个错误节作为不存在的用户接收到的一个节的应答的时候, 使用&amp;lt;service-unavailable/&amp;gt;错误条件有助于防止著名的字典攻击, 因为这个错误和条件和其他一些错误条件相同,例如, 一个IQ子元素的名字空间不被理解, 或离线存储或消息转发不被一个域允许.&lt;br /&gt;
&lt;br /&gt;
==IANA事项==&lt;br /&gt;
&lt;br /&gt;
:很多相关的IANA事项, 参考[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920]相关章节.&lt;br /&gt;
&lt;br /&gt;
===会话数据的XML名字空间名===&lt;br /&gt;
&lt;br /&gt;
:以下为XMPP中会话相关的数据定义了一个 URN 子名字空间. (这个名字空间名的格式遵循 IETF XML Registry [XML-REG].)&lt;br /&gt;
&lt;br /&gt;
::URI: urn:ietf:params:xml:ns:xmpp-session&lt;br /&gt;
&lt;br /&gt;
::Specification: RFC 3921&lt;br /&gt;
&lt;br /&gt;
::Description: This is the XML namespace name for session-related data in the Extensible Messaging and Presence Protocol (XMPP) as defined by RFC 3921.&lt;br /&gt;
&lt;br /&gt;
:Registrant Contact: IETF, XMPP Working Group, &amp;lt;xmppwg@jabber.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===即时消息SRV协议标签注册===&lt;br /&gt;
&lt;br /&gt;
:确定即时消息和出席信息地址[IMP-SRV],为那些能提供遵守&amp;quot;_im&amp;quot;SRV服务标签的服务定义了一个即时消息SRV协议标签注册表. 因为XMPP是其中一个协议, IANA在适当的注册项中注册了&amp;quot;_xmpp&amp;quot;协议标签,如下:&lt;br /&gt;
&lt;br /&gt;
::Protocol label: _xmpp&lt;br /&gt;
&lt;br /&gt;
::Specification: RFC 3921&lt;br /&gt;
&lt;br /&gt;
::Description: Instant messaging protocol label for the Extensible Messaging and Presence Protocol (XMPP) as defined by RFC 3921.&lt;br /&gt;
&lt;br /&gt;
::Registrant Contact: IETF, XMPP Working Group, &amp;lt;xmppwg@jabber.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===出席信息SRV协议标签注册===&lt;br /&gt;
&lt;br /&gt;
:确定即时消息和出席信息地址[IMP-SRV],为那些能够提供遵守&amp;quot;_pres&amp;quot;SRV服务标签的服务定义了一个出席信息SRV协议标签注册项. 因为XMPP是其中一个协议, IANA在适当的注册项中注册了&amp;quot;_xmpp&amp;quot;协议标签,如下:&lt;br /&gt;
&lt;br /&gt;
::Protocol label: _xmpp&lt;br /&gt;
&lt;br /&gt;
::Specification: RFC 3921&lt;br /&gt;
&lt;br /&gt;
::Description: Presence protocol label for the Extensible Messaging and Presence Protocol (XMPP) as defined by RFC 3921.&lt;br /&gt;
&lt;br /&gt;
::Registrant Contact: IETF, XMPP Working Group, &amp;lt;xmppwg@jabber.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==参考==&lt;br /&gt;
&lt;br /&gt;
===标准参考===&lt;br /&gt;
&lt;br /&gt;
:[CPIM]      Peterson, J., &amp;quot;Common Profile for Instant Messaging (CPIM)&amp;quot;, RFC 3860, August 2004.&lt;br /&gt;
&lt;br /&gt;
:[IMP-REQS]  Day, M., Aggarwal, S., Mohr, G., and J. Vincent, &amp;quot;Instant Messaging/Presence Protocol Requirements&amp;quot;, RFC 2779, February 2000.&lt;br /&gt;
&lt;br /&gt;
:[IMP-SRV]   Peterson, J., &amp;quot;Address Resolution for Instant Messaging and Presence&amp;quot;, RFC 3861, August 2004.&lt;br /&gt;
&lt;br /&gt;
:[SRV]       Gulbrandsen, A., Vixie, P., and L. Esibov, &amp;quot;A DNS RR for specifying the location of services (DNS SRV)&amp;quot;, RFC 2782, February 2000.&lt;br /&gt;
&lt;br /&gt;
:[TERMS]     Bradner, S., &amp;quot;Key words for use in RFCs to Indicate Requirement Levels&amp;quot;, BCP 14, RFC 2119, March 1997.&lt;br /&gt;
&lt;br /&gt;
:[XML]       Bray, T., Paoli, J., Sperberg-McQueen, C., and E. Maler, &amp;quot;Extensible Markup Language (XML) 1.0 (2nd ed)&amp;quot;, W3C REC-xml, October 2000, &amp;lt;http://www.w3.org/TR/REC-xml&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:[XML-NAMES] Bray, T., Hollander, D., and A. Layman, &amp;quot;Namespaces in XML&amp;quot;, W3C REC-xml-names, January 1999, &amp;lt;http://www.w3.org/TR/REC-xml-names&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920] Saint-Andre, P., &amp;quot;Extensible Messaging and Presence Protocol (XMPP): Core&amp;quot;, RFC 3920, October 2004.&lt;br /&gt;
&lt;br /&gt;
:[XMPP-E2E]  Saint-Andre, P., &amp;quot;End-to-End Object Encryption in the Extensible Messaging and Presence Protocol (XMPP)&amp;quot;, RFC 3923, October 2004.&lt;br /&gt;
&lt;br /&gt;
===信息参考===&lt;br /&gt;
&lt;br /&gt;
:[IMP-MODEL] Day, M., Rosenberg, J., and H. Sugano, &amp;quot;A Model for Presence and Instant Messaging&amp;quot;, RFC 2778, February 2000.&lt;br /&gt;
&lt;br /&gt;
:[IRC]       Oikarinen, J. and D. Reed, &amp;quot;Internet Relay Chat Protocol&amp;quot;, RFC 1459, May 1993.&lt;br /&gt;
&lt;br /&gt;
:[JEP-0054]  Saint-Andre, P., &amp;quot;vcard-temp&amp;quot;, JSF JEP 0054, March 2003.&lt;br /&gt;
&lt;br /&gt;
:[JEP-0077]  Saint-Andre, P., &amp;quot;In-Band Registration&amp;quot;, JSF JEP 0077, August 2004.&lt;br /&gt;
&lt;br /&gt;
:[JEP-0078]  Saint-Andre, P., &amp;quot;Non-SASL Authentication&amp;quot;, JSF JEP 0078, July 2004.&lt;br /&gt;
&lt;br /&gt;
:[JSF]       Jabber Software Foundation, &amp;quot;Jabber Software Foundation&amp;quot;, &amp;lt;http://www.jabber.org/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:[VCARD]     Dawson, F. and T. Howes, &amp;quot;vCard MIME Directory Profile&amp;quot;, RFC 2426, September 1998.&lt;br /&gt;
&lt;br /&gt;
:[XML-REG]   Mealling, M., &amp;quot;The IETF XML Registry&amp;quot;, BCP 81, RFC 3688, January 2004.&lt;br /&gt;
&lt;br /&gt;
==附录 A.  vCards==&lt;br /&gt;
&lt;br /&gt;
:[IMP-REQS]的第三章第一节第三小节和第四章第一节第四小节要求可能为其他用户接收带外的联系人信息(例如,电话号码或电子邮件地址). 在Jabber社区中通常使用RFC 2426 [VCARD]中vCard规范的XML来表达这类信息,但这超出了XMPP的范围(这个协议的文档包含在[JEP-0054], 由[JSF]发行).&lt;br /&gt;
&lt;br /&gt;
译者注: [JSF]已改名为[XSF],[JEP-0054]已改名为[XEP-0054]&lt;br /&gt;
&lt;br /&gt;
==附录 B.  XML规划==&lt;br /&gt;
&lt;br /&gt;
:接下来的XML规划是描述性的, 不是标准化的. 规划定义在XMPP的核心特性, 参考[XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920].&lt;br /&gt;
&lt;br /&gt;
===B.1  jabber:client===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;xs:schema&lt;br /&gt;
       xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
       targetNamespace='jabber:client'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:import namespace='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='message'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
           &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
             &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element ref='subject'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element ref='body'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element ref='thread'/&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
             &amp;lt;xs:any     namespace='##other'&lt;br /&gt;
                         minOccurs='0'&lt;br /&gt;
                         maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
             &amp;lt;xs:element ref='error'&lt;br /&gt;
                         minOccurs='0'/&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
           &amp;lt;xs:attribute name='from'&lt;br /&gt;
                         type='xs:string'&lt;br /&gt;
                         use='optional'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:attribute name='id'&lt;br /&gt;
                         type='xs:NMTOKEN'&lt;br /&gt;
                         use='optional'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:attribute name='to'&lt;br /&gt;
                         type='xs:string'&lt;br /&gt;
                         use='optional'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:attribute name='type' use='optional' default='normal'&amp;gt;&lt;br /&gt;
             &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
               &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
                 &amp;lt;xs:enumeration value='chat'/&amp;gt;&lt;br /&gt;
                 &amp;lt;xs:enumeration value='error'/&amp;gt;&lt;br /&gt;
                 &amp;lt;xs:enumeration value='groupchat'/&amp;gt;&lt;br /&gt;
                 &amp;lt;xs:enumeration value='headline'/&amp;gt;&lt;br /&gt;
                 &amp;lt;xs:enumeration value='normal'/&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
           &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='body'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
           &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
             &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='subject'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
           &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
             &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='thread' type='xs:NMTOKEN'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='presence'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
           &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
             &amp;lt;xs:element ref='show'/&amp;gt;&lt;br /&gt;
             &amp;lt;xs:element ref='status'/&amp;gt;&lt;br /&gt;
             &amp;lt;xs:element ref='priority'/&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
           &amp;lt;xs:any     namespace='##other'&lt;br /&gt;
                       minOccurs='0'&lt;br /&gt;
                       maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element ref='error'&lt;br /&gt;
                       minOccurs='0'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='from'&lt;br /&gt;
                       type='xs:string'&lt;br /&gt;
                       use='optional'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='id'&lt;br /&gt;
                       type='xs:NMTOKEN'&lt;br /&gt;
                       use='optional'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='to'&lt;br /&gt;
                       type='xs:string'&lt;br /&gt;
                       use='optional'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='type' use='optional'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
             &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='error'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='probe'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='subscribe'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='subscribed'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='unavailable'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='unsubscribe'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='unsubscribed'/&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='show'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:enumeration value='away'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:enumeration value='chat'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:enumeration value='dnd'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:enumeration value='xa'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='status'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
           &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
             &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='priority' type='xs:byte'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='iq'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
           &amp;lt;xs:any     namespace='##other'&lt;br /&gt;
                       minOccurs='0'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element ref='error'&lt;br /&gt;
                       minOccurs='0'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='from'&lt;br /&gt;
                       type='xs:string'&lt;br /&gt;
                       use='optional'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='id'&lt;br /&gt;
                       type='xs:NMTOKEN'&lt;br /&gt;
                       use='required'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='to'&lt;br /&gt;
                       type='xs:string'&lt;br /&gt;
                       use='optional'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='type' use='required'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
             &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='error'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='get'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='result'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='set'/&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='error'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:sequence  xmlns:err='urn:ietf:params:xml:ns:xmpp-stanzas'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:group   ref='err:stanzaErrorGroup'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element ref='err:text'&lt;br /&gt;
                       minOccurs='0'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='code' type='xs:byte' use='optional'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='type' use='required'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
             &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='auth'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='cancel'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='continue'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='modify'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='wait'/&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===B.2  jabber:server===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;xs:schema&lt;br /&gt;
       xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
       targetNamespace='jabber:server'&lt;br /&gt;
       xmlns='jabber:server'&lt;br /&gt;
       elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:import namespace='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='message'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
           &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
             &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element ref='subject'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element ref='body'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element ref='thread'/&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
             &amp;lt;xs:any     namespace='##other'&lt;br /&gt;
                         minOccurs='0'&lt;br /&gt;
                         maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
             &amp;lt;xs:element ref='error'&lt;br /&gt;
                         minOccurs='0'/&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
           &amp;lt;xs:attribute name='from'&lt;br /&gt;
                         type='xs:string'&lt;br /&gt;
                         use='required'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:attribute name='id'&lt;br /&gt;
                         type='xs:NMTOKEN'&lt;br /&gt;
                         use='optional'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:attribute name='to'&lt;br /&gt;
                         type='xs:string'&lt;br /&gt;
                         use='required'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:attribute name='type' use='optional' default='normal'&amp;gt;&lt;br /&gt;
             &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
               &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
                 &amp;lt;xs:enumeration value='chat'/&amp;gt;&lt;br /&gt;
                 &amp;lt;xs:enumeration value='error'/&amp;gt;&lt;br /&gt;
                 &amp;lt;xs:enumeration value='groupchat'/&amp;gt;&lt;br /&gt;
                 &amp;lt;xs:enumeration value='headline'/&amp;gt;&lt;br /&gt;
                 &amp;lt;xs:enumeration value='normal'/&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
           &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='body'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
           &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
             &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='subject'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
           &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
             &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='thread' type='xs:NMTOKEN'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='presence'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
           &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
             &amp;lt;xs:element ref='show'/&amp;gt;&lt;br /&gt;
             &amp;lt;xs:element ref='status'/&amp;gt;&lt;br /&gt;
             &amp;lt;xs:element ref='priority'/&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
           &amp;lt;xs:any     namespace='##other'&lt;br /&gt;
                       minOccurs='0'&lt;br /&gt;
                       maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element ref='error'&lt;br /&gt;
                       minOccurs='0'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='from'&lt;br /&gt;
                       type='xs:string'&lt;br /&gt;
                       use='required'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='id'&lt;br /&gt;
                       type='xs:NMTOKEN'&lt;br /&gt;
                       use='optional'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='to'&lt;br /&gt;
                       type='xs:string'&lt;br /&gt;
                       use='required'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='type' use='optional'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
             &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='error'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='probe'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='subscribe'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='subscribed'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='unavailable'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='unsubscribe'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='unsubscribed'/&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='show'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:enumeration value='away'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:enumeration value='chat'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:enumeration value='dnd'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:enumeration value='xa'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='status'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
           &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
             &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='priority' type='xs:byte'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='iq'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
           &amp;lt;xs:any     namespace='##other'&lt;br /&gt;
                       minOccurs='0'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element ref='error'&lt;br /&gt;
                       minOccurs='0'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='from'&lt;br /&gt;
                       type='xs:string'&lt;br /&gt;
                       use='required'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='id'&lt;br /&gt;
                       type='xs:NMTOKEN'&lt;br /&gt;
                       use='required'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='to'&lt;br /&gt;
                       type='xs:string'&lt;br /&gt;
                       use='required'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='type' use='required'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
             &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='error'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='get'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='result'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='set'/&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='error'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:sequence  xmlns:err='urn:ietf:params:xml:ns:xmpp-stanzas'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:group   ref='err:stanzaErrorGroup'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element ref='err:text'&lt;br /&gt;
                       minOccurs='0'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='code' type='xs:byte' use='optional'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='type' use='required'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
             &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='auth'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='cancel'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='continue'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='modify'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='wait'/&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===B.3  session===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;xs:schema&lt;br /&gt;
       xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
       targetNamespace='urn:ietf:params:xml:ns:xmpp-session'&lt;br /&gt;
       xmlns='urn:ietf:params:xml:ns:xmpp-session'&lt;br /&gt;
       elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='session' type='empty'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
         &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===B.4  jabber:iq:privacy===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;xs:schema&lt;br /&gt;
       xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
       targetNamespace='jabber:iq:privacy'&lt;br /&gt;
       xmlns='jabber:iq:privacy'&lt;br /&gt;
       elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element ref='active'&lt;br /&gt;
                       minOccurs='0'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element ref='default'&lt;br /&gt;
                       minOccurs='0'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element ref='list'&lt;br /&gt;
                       minOccurs='0'&lt;br /&gt;
                       maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='active'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
           &amp;lt;xs:extension base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
             &amp;lt;xs:attribute name='name'&lt;br /&gt;
                           type='xs:string'&lt;br /&gt;
                           use='optional'/&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='default'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
           &amp;lt;xs:extension base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
             &amp;lt;xs:attribute name='name'&lt;br /&gt;
                           type='xs:string'&lt;br /&gt;
                           use='optional'/&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='list'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element ref='item'&lt;br /&gt;
                       minOccurs='0'&lt;br /&gt;
                       maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='name'&lt;br /&gt;
                       type='xs:string'&lt;br /&gt;
                       use='required'/&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element name='iq'&lt;br /&gt;
                       minOccurs='0'&lt;br /&gt;
                       type='empty'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element name='message'&lt;br /&gt;
                       minOccurs='0'&lt;br /&gt;
                       type='empty'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element name='presence-in'&lt;br /&gt;
                       minOccurs='0'&lt;br /&gt;
                       type='empty'/&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element name='presence-out'&lt;br /&gt;
                       minOccurs='0'&lt;br /&gt;
                       type='empty'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='action' use='required'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
             &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='allow'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='deny'/&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='order'&lt;br /&gt;
                       type='xs:unsignedInt'&lt;br /&gt;
                       use='required'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='type' use='optional'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
             &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='group'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='jid'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='subscription'/&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='value'&lt;br /&gt;
                       type='xs:string'&lt;br /&gt;
                       use='optional'/&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
         &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===B.5  jabber:iq:roster===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;xs:schema&lt;br /&gt;
       xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
       targetNamespace='jabber:iq:roster'&lt;br /&gt;
       xmlns='jabber:iq:roster'&lt;br /&gt;
       elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element ref='item'&lt;br /&gt;
                       minOccurs='0'&lt;br /&gt;
                       maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
       &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
         &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
           &amp;lt;xs:element ref='group'&lt;br /&gt;
                       minOccurs='0'&lt;br /&gt;
                       maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='ask' use='optional'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
             &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='subscribe'/&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='name' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
         &amp;lt;xs:attribute name='subscription' use='optional'&amp;gt;&lt;br /&gt;
           &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
             &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='both'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='from'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='remove'/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:enumeration value='to'/&amp;gt;&lt;br /&gt;
             &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
         &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
       &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;xs:element name='group' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==附录 C.  Jabber IM Presence协议和XMPP之间的不同==&lt;br /&gt;
&lt;br /&gt;
:本章是非标准的.&lt;br /&gt;
&lt;br /&gt;
:译者注：附录D对于新接触XMPP的人没有什么意义，就不翻译了，免得浪费时间。因为现在RFC公布已经很久了，以前的Jabber实现很多都进化到XMPP了。&lt;br /&gt;
&lt;br /&gt;
:XMPP has been adapted from the protocols originally developed in the Jabber open-source community, which can be thought of as &amp;quot;XMPP 0.9&amp;quot;. Because there exists a large installed base of Jabber implementations and deployments, it may be helpful to specify the key differences between the relevant Jabber protocols and XMPP in order to expedite and encourage upgrades of those implementations and deployments to XMPP.  This section summarizes the differences that relate specifically to instant messaging and presence applications, while the corresponding section of [XMPP-CORE|XMPP文档列表/XMPP正式RFC标准/RFC3920] summarizes the differences that relate to all XMPP applications.&lt;br /&gt;
&lt;br /&gt;
===C.1  Session Establishment===&lt;br /&gt;
&lt;br /&gt;
:The client-to-server authentication protocol developed in the Jabber community assumed that every client is an IM client and therefore initiated an IM session upon successful authentication and resource binding, which are performed simultaneously (documentation of this protocol is contained in [JEP-0078], published by the Jabber Software Foundation [JSF]).  XMPP maintains a stricter separation between core functionality and IM functionality; therefore, an IM session is not created until the client specifically requests one using the protocol defined under Session Establishment (Section 3).&lt;br /&gt;
&lt;br /&gt;
===C.2  Privacy Lists===&lt;br /&gt;
&lt;br /&gt;
:The Jabber community began to define a protocol for communications blocking (privacy lists) in late 2001, but that effort was deprecated once the XMPP Working Group was formed.  Therefore the protocol defined under Blocking Communication (Section 10) is the only such protocol defined for use in the Jabber community.&lt;br /&gt;
&lt;br /&gt;
==贡献者==&lt;br /&gt;
&lt;br /&gt;
:XMPP的大部分核心方面是由1999年开始的Jabber开源社区开发的. 这个社区是由 Jeremie Miller建立的, 他于1999年1月发布了最初版的jabber server源代码. 主要的基础协议的早期贡献者还包括 Ryan Eatmon, Peter Millard, Thomas Muldowney,和 Dave Smith. XMPP工作组在即时消息和出席信息方面的工作主要集中在IM会话建立和通信屏蔽(隐私列表); 会话建立协议主要是由 Rob Norris 和 Joe Hildebrand 开发的, 隐私列表协议最初是由 Peter Millard.贡献的&lt;br /&gt;
&lt;br /&gt;
==致谢==&lt;br /&gt;
&lt;br /&gt;
:感谢许多在贡献者名单之外的人们. 尽管很难提供一个完整的名单, 以下个人对于定义协议或评论标准提供了很多帮助:&lt;br /&gt;
:Thomas Charron, Richard Dobson, Schuyler Heath, Jonathan Hogg, Craig Kaes, Jacek Konieczny, Lisa Dusseault, Alexey Melnikov, Keith Minkler, Julian Missig, Pete Resnick, Marshall Rose, Jean-Louis Seguineau, Alexey Shchepin, Iain Shigeoka, and David Waite. 也感谢 XMPP工作组的成员和 IETF 社区在本文的成文过程中一直提供的评论和反馈。&lt;br /&gt;
&lt;br /&gt;
==作者地址==&lt;br /&gt;
&lt;br /&gt;
:Peter Saint-Andre (编辑)&lt;br /&gt;
:Jabber Software Foundation&lt;br /&gt;
&lt;br /&gt;
:EMail: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
==完整的版权声明==&lt;br /&gt;
&lt;br /&gt;
:Copyright (C) The Internet Society (2004).&lt;br /&gt;
&lt;br /&gt;
:This document is subject to the rights, licenses and restrictions contained in BCP 78, and except as set forth therein, the authors retain all their rights. This document and the information contained herein are provided on an &amp;quot;AS IS&amp;quot; basis and THE CONTRIBUTOR, THE ORGANIZATION HE/S HE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.&lt;br /&gt;
&lt;br /&gt;
==知识产权==&lt;br /&gt;
&lt;br /&gt;
:The IETF takes no position regarding the validity or scope of any Intellectual Property Rights or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; nor does it represent that it has made any independent effort to identify any such rights.  Information on the IETF's procedures with respect to rights in IETF Documents can be found in BCP 78 and BCP 79.&lt;br /&gt;
&lt;br /&gt;
:Copies of IPR disclosures made to the IETF Secretariat and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this specification can be obtained from the IETF on-line IPR repository at http://www.ietf.org/ipr.&lt;br /&gt;
&lt;br /&gt;
:The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights that may cover technology that may be required to implement this standard.  Please address the information to the IETF at ietf- ipr@ietf.org.&lt;br /&gt;
&lt;br /&gt;
==感谢==&lt;br /&gt;
&lt;br /&gt;
:目前为RFC编辑活动提供资金的Internet Society.&lt;br /&gt;
[http://essaywritingservices.org/prices.php write my essay]&lt;/div&gt;</summary>
		<author><name>Chruse arroyo</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0004</id>
		<title>XEP-0004</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0004"/>
				<updated>2011-12-12T18:03:13Z</updated>
		
		<summary type="html">&lt;p&gt;Chruse arroyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://xmpp.org/extensions/xep-0004.html XEP-0004]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0004: 数据表单'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP扩展协议用于数据表单，可以用于worklows如服务配置以及特定应用的数据描述和报告。这个协议包括表单处理的轻量级语义(如请求,响应,提交和取消),定义了几种常见的字段类型(布尔、单个或多个选择的列表选项、单行或多行的文本,单个或多个JabberID、隐藏字段,等等),为以后的数据类型提供扩展性,可以用在广泛的应用中。该协议并不是要提供完整的表格处理功能（由W3C XForms技术提供），而是提供这种功能的基本子集给XMPP使用。&lt;br /&gt;
&lt;br /&gt;
作者:	Ryan Eatmon, Joe Hildebrand, Jeremie Miller, Thomas Muldowney, Peter Saint-Andre&lt;br /&gt;
&lt;br /&gt;
XMPP扩展协议的版权(1999-2008)归XMPP标准化基金会(XSF)所有&lt;br /&gt;
&lt;br /&gt;
版权:	© 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0004#法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 最终&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 2.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2007-08-13&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个最终标准.对于实现和布署来说可以被认为是一个稳定技术.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
几个现有的Jabber/XMPP的协议包含用户和应用程序之间的结构数据交换，为常用的任务，如注册（[http://xmpp.org/extensions/xep-0077.html In-Band Registration][[XEP-0004#附录G:备注|1]]）和搜索（[http://xmpp.org/extensions/xep-0055.html Jabber Search] [[XEP-0004#附录G:备注|2]]）。不幸的是，这些早期的协议是“硬编码”，因此很大的限制了可交换信息的范围。此外，其他协议(如，[http://xmpp.org/extensions/xep-0045.html Multi-User Chat] [[XEP-0004#附录G:备注|3]])可能需要以交换数据为目的，例如配置，但是配置选项可能根据具体实施或部署不同。最后，开发人员可能要以灵活的方式扩展其他协议(如, [http://xmpp.org/extensions/xep-0030.html Service Discovery][[XEP-0004#附录G:备注|4]])，以提供在基本协议没有定义的信息。在所有这些情况下，这将有助于使用一个通用的数据描述格式，可以用于动态表单生成和各种情况下的数据“建模”。&lt;br /&gt;
&lt;br /&gt;
一个例子可能会有帮助。试想一下，当用户创建一个文本会议服务的多用户聊天室，该服务允许用户以各种方式配置房间。虽然大多数实现可能提供了一个较为常见的可配置功能集（讨论记录，房间拥有者的最大数量，等等）。还会有一些分歧：也许一个实现允许把房间日志以各种文件类型（XML，HTML，PDF等格式）和各种时间周期（每小时，每天，每周等）保存。而另一个实现，可能只存在登录的开/关选择一种格式（如，在HTML保存每日日志）。很明显，第一个实现比第二个实现有更多的配置选项。而不像“硬编码”每个选项通过不同的XML元素（如，&amp;lt;room_logging_period/&amp;gt;），一个好的设计应该包含更多灵活的格式。&lt;br /&gt;
&lt;br /&gt;
此处所描述的'jabber:x:data'协议为Jabber/XMPP实体的使用定义了灵活的格式，控制在“名称值”对的简单和[http://www.w3.org/TR/xforms/ XForms 1.0] [[XEP-0004#附录G:备注|5]]（当这个协议被设计时才开始发展的）的复杂之间。在很多方面，'jabber:x:data' 与[http://www.w3.org/TR/xhtml1/ XHTML 1.0][[XEP-0004#附录G:备注|6]]的表单模块类似。但它提供一些Jabber特有的数据类型，允许应用程序请求数据字段，更自然地集成到IQ节的“workflow”语义中。而且它可以作为现有的Jabber/XMPP协议的扩展，而当这个协议被开发出来时，XHTML的表单模块却不能（尤其是当时并没有[http://www.w3.org/TR/2004/WD-xhtml-modularization-20040218/ Modularization of XHTML] [[XEP-0004#附录G:备注|7]]）。&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
本文档涉及下列需求:&lt;br /&gt;
&lt;br /&gt;
# '''数据收集''' -- 该协议应允许表单处理实体（通常是一个服务器，服务，或bot）从表单提交实体（通常是一个由用户控制的客户端）收集数据。应该是通过不同的数据字段来做，每个都可以是不同的数据“类型”，而且允许自由格式的输入或多个选项的选择（就像HTML表单一样）。&lt;br /&gt;
# '''数据报告''' -- 该协议应允许表单处理的实体向表单提交的实体报告数据，再通过不同的数据字段。 &lt;br /&gt;
# '''可移植性''' -- 协议应该尽量只定义普通数据格式和基本的数据类型。提示应该在相关的用户界面提供，但应该仅仅是提示，而不是严格的要求。 &lt;br /&gt;
# '''简单''' -- 协议在客户端的实施应该简单，并且大多数复杂的工作（如，数据有效性和处理）应由服务器和组件去完成，而不是客户端。 &lt;br /&gt;
# '''灵活性''' -- 协议应该具有灵活性和可扩展性，而不像“硬编码”。&lt;br /&gt;
# '''兼容性''' -- 协议应该为已有的Jabber/XMPP协议定义一个扩展，而且不破坏已有的实现，除非绝对必要。&lt;br /&gt;
&lt;br /&gt;
==协议==&lt;br /&gt;
&lt;br /&gt;
'jabber:x:data' 命名空间的基本语法如下（正式的描述可以在下面的XML节中找到）:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' &lt;br /&gt;
   type='{form-type}'&amp;gt; &lt;br /&gt;
  &amp;lt;title/&amp;gt; &lt;br /&gt;
  &amp;lt;instructions/&amp;gt; &lt;br /&gt;
  &amp;lt;field var='field-name' &lt;br /&gt;
         type='{field-type}' &lt;br /&gt;
         label='description'&amp;gt; &lt;br /&gt;
    &amp;lt;desc/&amp;gt; &lt;br /&gt;
    &amp;lt;required/&amp;gt; &lt;br /&gt;
    &amp;lt;value&amp;gt;field-value&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;option label='option-label'&amp;gt;&amp;lt;value&amp;gt;option-value&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
    &amp;lt;option label='option-label'&amp;gt;&amp;lt;value&amp;gt;option-value&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
  &amp;lt;/field&amp;gt; &lt;br /&gt;
&amp;lt;/x&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
受'jabber:x:data' 命名空间限制的&amp;lt;x/&amp;gt;元素，应该包括直接作为&amp;lt;message/&amp;gt;节第一级子元素或作为&amp;lt;iq/&amp;gt; 节（其中第一级子元素是由一个&amp;quot;wrapper&amp;quot;命名空间限制的）的第二级子节。参见下文列举的限制。&lt;br /&gt;
&lt;br /&gt;
可选项&amp;lt;title/&amp;gt;和&amp;lt;instructions/&amp;gt;元素，允许表单处理实体把表单标记为一个整体并指定自然语言指令，后面跟着表单提交实体。这些元素的XML字符数据不应包含换行符（\n和\r字符），而任何换行符操作（如，在用户界面显示）在这里不是特指的。但&amp;lt;instructions/&amp;gt;元素的多个实体可以被包括在内。&lt;br /&gt;
&lt;br /&gt;
===表单类型===&lt;br /&gt;
&lt;br /&gt;
'jabber:x:data'表单中数据的收集或提供可以位于不同的上下文。例子包括一个需要填写的空表单，填好的表单，一个提交结果，一个搜索结果，或仅仅是用'jabber:x:data'命名空间封装的一组数据。完整的数据上下文由3个条件提供：&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;wrapper&amp;quot;协议（即，以&amp;lt;iq/&amp;gt;节直接子元素为根元素的命名空间和受'jabber:x:data' 命名空间限制的&amp;lt;x/&amp;gt;元素的父元素）。&lt;br /&gt;
# 一个包含事务（如，一个IQ &amp;quot;set&amp;quot;或&amp;quot;result&amp;quot;）或会话结构（如，一个消息&amp;lt;thread/&amp;gt;）的表单的位置。&lt;br /&gt;
# 表单中&amp;lt;x/&amp;gt;根元素的类型属性&lt;br /&gt;
&lt;br /&gt;
前面2件上下文信息有其他协议提供，而表单类型见下表描述。&lt;br /&gt;
&lt;br /&gt;
:'''表1：表单类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! 类型 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|表单 || 表单处理实体请求表单提交实体去完成表单。&lt;br /&gt;
|-&lt;br /&gt;
|提交 || 表单提交实体提交数据给表单处理实体。提交信息可以包含不是空表单提供的字段，但表单处理实体必须忽略任何无法识别的字段。&lt;br /&gt;
|-&lt;br /&gt;
|取消 || 表单提交实体取消给表单处理实体提交的数据。&lt;br /&gt;
|-&lt;br /&gt;
|结果 || 单处理实体返回数据（如查询结果）给表单提交实体，或数据是一个通用的数据集。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了维护表单类型中获取的数据的上下文，必须遵守以下规则:&lt;br /&gt;
&lt;br /&gt;
:* 对于&amp;lt;iq/&amp;gt;节，受&amp;quot;wrapper&amp;quot; 命名空间限制的根元素，以&amp;quot;form&amp;quot; 或&amp;quot;submit&amp;quot;的一种形式，必须以一种&amp;quot;result&amp;quot;形式的表单返回。受'jabber:x:data'命名空间限制的&amp;lt;x/&amp;gt;元素，必须是&amp;quot;wrapper&amp;quot;命名空间根元素的子元素。根据[http://tools.ietf.org/html/rfc3920 XMPP Core] [[XEP-0004#附录G:备注|8]]所定义， 'id' 属性必须在IQ结果中被复制。对于表单类型为&amp;quot;form&amp;quot; 或 &amp;quot;result&amp;quot;,&amp;lt;iq/&amp;gt;节应该是&amp;quot;result&amp;quot;类型。对于表单类型为&amp;quot;submit&amp;quot; 或&amp;quot;cancel&amp;quot;，  &amp;lt;iq/&amp;gt;节应该是&amp;quot;set&amp;quot;类型。&lt;br /&gt;
&lt;br /&gt;
:* 对于&amp;lt;message/&amp;gt;节，如果提供的话，&amp;lt;thread/&amp;gt;应该在回复中被复制。受'jabber:x:data'命名空间限制的&amp;lt;x/&amp;gt;元素，必须是&amp;lt;message/&amp;gt;节的子元素。&lt;br /&gt;
&lt;br /&gt;
===字段元素===&lt;br /&gt;
&lt;br /&gt;
一个&amp;quot;form&amp;quot;，&amp;quot;submit&amp;quot;，或 &amp;quot;result&amp;quot;类型的数据表单应该包含至少一个&amp;lt;field/&amp;gt;元素。一个&amp;quot;cancel&amp;quot;类型的表单，不应该包含任何&amp;lt;field/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field/&amp;gt;元素可以包含以下任何子元素:&lt;br /&gt;
&lt;br /&gt;
:'''&amp;lt;desc/&amp;gt;'''&lt;br /&gt;
:该元素的XML字符数据提供了该字段一个自然语言的描述，为了在用户代理中介绍（如，作为一个&amp;quot;tool-tip&amp;quot;，帮助按钮，或在字段附近的文本标记）。&amp;lt;desc/&amp;gt;元素不应包含换行符（\n和\r字符），因为布局负责用户代理，任何换行的处理（如，在用户界面演示）在这里是未指明的。（注意：提供一个字段的描述，使用&amp;lt;desc/&amp;gt;元素是被推荐的，而不是一个单独的&amp;quot;fixed&amp;quot;类型的&amp;lt;field/&amp;gt;元素。）&lt;br /&gt;
 &lt;br /&gt;
:'''&amp;lt;required/&amp;gt;'''&lt;br /&gt;
:该元素必须为空，标记所需的字段，为了被表单识别为有效字段。&lt;br /&gt;
 &lt;br /&gt;
:'''&amp;lt;value/&amp;gt;'''&lt;br /&gt;
:该元素的XML字符数据定义了在&amp;quot;form&amp;quot;类型数据表单中的字段（根据表单处理实体）的默认值，在&amp;quot;submit&amp;quot;类型数据表单中由表单提交实体提供的数据，或在&amp;quot;result&amp;quot;类型数据表单中的数据结果。在&amp;quot;form&amp;quot;类型数据表单中，如果表单处理实体通过&amp;lt;value/&amp;gt;元素提供了一个默认值，表单提交实体就不应该尝试去执行一个不同的默认值。&lt;br /&gt;
 &lt;br /&gt;
:'''&amp;lt;option/&amp;gt;'''&lt;br /&gt;
:在&amp;quot;list-single&amp;quot;或&amp;quot;list-multi&amp;quot;字段类型中的一个选项。&amp;lt;value/&amp;gt;子元素的XML字符定义了选项的值，而且标签属性为选项定义了一个人们易读的名称。&amp;lt;option/&amp;gt;元素必须且只能包含一个&amp;lt;value/&amp;gt;子元素。如果字段类型不是&amp;quot;list-single&amp;quot;或&amp;quot;list-multi&amp;quot;，就一定不能包含&amp;lt;option/&amp;gt;元素。&lt;br /&gt;
 &lt;br /&gt;
如果&amp;lt;field/&amp;gt;元素类型是其他的而不是“fixed”（见下文），它必须拥有一个'var'属性在表单中唯一标识字段（如果是“fixed”，可以拥有一个'var'属性）。&amp;lt;field/&amp;gt;元素可以拥有一个标签属性，为字段定义一个人们易读的名称。对于“form”类型的数据表单，每个&amp;lt;field/&amp;gt;元素应该拥有'type'属性，它定义了字段数据的数据 &amp;quot;type&amp;quot;（如果没有'type'被指定，则默认为&amp;quot;text-single&amp;quot;）。在其他表单类型的上下文中提供的字段，也可以拥有一个'type'属性。对于&amp;quot;submit&amp;quot;类型的数据表单，'type'中包含的属性是可选的，因为表单处理实体被假定知道它处理的表单的数据类型。&lt;br /&gt;
&lt;br /&gt;
如果字段出现在用户页面上（如，问卷中的项或表单结果），在XML中的字段元素的顺序，应该决定出现在用户处的项目的顺序。&lt;br /&gt;
&lt;br /&gt;
===字段类型===&lt;br /&gt;
以下字段类型代表Jabber/XMPP实体之间通用的数据类型。这些字段并打算像数据类型一样被广泛定义，如[http://www.w3.org/TR/xmlschema-2/ XML Schema Part 2] [[XEP-0004#附录G:备注|9]], 也没有定义用户界面元素。&lt;br /&gt;
&lt;br /&gt;
:'''表2:字段类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! 类型 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|布尔型 || 该字段允许一个实体收集或提供一个在两个选项中只能二选一的选择。默认值为&amp;quot;false&amp;quot;。[[XEP-0004#附录G:备注|10]]&lt;br /&gt;
|-&lt;br /&gt;
|固定 || 该字段是用于数据的描述（如，人们易读的&amp;quot;section&amp;quot;头信息）而不是数据的收集或提供。&amp;lt;value/&amp;gt;子元素不应该包含换行符（\n和\r字符）；然而一个应用应该生成多个固定的字段，每个都包含&amp;lt;value/&amp;gt;子元素。&lt;br /&gt;
|-&lt;br /&gt;
|隐藏 || 该字段未展现给表单提交实体，但是和表单一起返回。表单提交实体不能修改隐藏字段的值，但如果这种行为被定义为是“使用协议”时可以这样做。&lt;br /&gt;
|-&lt;br /&gt;
|多jid || 该字段允许一个实体收集或提供多个Jabber ID。每个提供的JID应该是唯一的（比较确定的，包括Nodeprep的应用、Nameprep和Resourceprep profiles of Stringprep，按XMPP Core中说明的），而重复的JID一定会被忽略。*&lt;br /&gt;
|-&lt;br /&gt;
|单jid || 该字段允许一个实体收集或提供单个的Jabber ID。&lt;br /&gt;
|-&lt;br /&gt;
|多选项列表 || 该字段允许一个实体从很多选项中收集或提供一个或多个选项。表单提交实体从表单处理实体提交的选项中选择一个或多个项，而且不能插入新的选项。表单处理实体不能修改从表单处理实体处获取的项目的顺序，因为项目的顺序可能很重要。**&lt;br /&gt;
|-&lt;br /&gt;
|单选项列表|| 该字段允许一个实体从很多选项中收集或提供一个选项。表单提交实体从表单处理实体提交的选项中选择一个项，而且不能插入新的选项。**&lt;br /&gt;
|-&lt;br /&gt;
|多文本|| 该字段允许一个实体收集或提供多行的文本。***&lt;br /&gt;
|-&lt;br /&gt;
|私有文本|| 该字段允许一个实体收集或提供一行或一个词的文本，其应该在界面上遮蔽。（如，星号显示的多个实体）&lt;br /&gt;
|-&lt;br /&gt;
|单文本|| 该字段允许一个实体收集或提供一行或一个词的文本，其应该在界面上显示。这个字段类型是缺省的而且必须假定，当一个表单提交实体收到一个不知道的字段类型时。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意：为字段类型&amp;quot;jid-single&amp;quot;或&amp;quot;jid-multi&amp;quot;提供的数据必须包含一个或一个以上的有效Jabber ID，有效性是由XMPP Core（参看后面章节的Data Validation）定义的寻址规则决定的。&lt;br /&gt;
&lt;br /&gt;
注意：在list-multi和list-single中的&amp;lt;option/&amp;gt;元素必须是唯一的，唯一性是由‘label’属性的值和&amp;lt;value/&amp;gt;元素中的XML字符数据决定的。（即，2个都必须是唯一的）&lt;br /&gt;
&lt;br /&gt;
注意：为字段类型&amp;quot;text-multi&amp;quot;提供的数据不应该包含任何换行符（\n和\r字符）。而应用程序应该把数据分为多个字符串（基于平台插入的换行符），然后用不同的&amp;lt;value/&amp;gt;元素中的XML字符数据指定每一个字符串。同样的，以&amp;quot;text-multi&amp;quot;字段类型接收了多个&amp;lt;value/&amp;gt;元素的应用程序，应该把value元素中的XML字符数据合并成一个文本块以提交给用户。每一个字符串为平台适时的通过换行符分开。&lt;br /&gt;
&lt;br /&gt;
===表单结果中的多个项目===&lt;br /&gt;
在某些情况下（如，查询请求的结果），传达多个项目是必须的。因此，一个&amp;quot;result&amp;quot;类型的数据表单可能包含2个上面基本语法没有描述的子元素:&lt;br /&gt;
&lt;br /&gt;
#只有一个&amp;lt;reported/&amp;gt;元素，可以理解为一个“表头”描述数据去遵循。 &lt;br /&gt;
#零个或更多&amp;lt;item/&amp;gt;元素，可以理解为包含符合请求的数据（如果有的话）的&amp;quot;table cells&amp;quot;。 &lt;br /&gt;
&lt;br /&gt;
其语法如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' &lt;br /&gt;
   type='result'&amp;gt; &lt;br /&gt;
  &amp;lt;reported&amp;gt; &lt;br /&gt;
    &amp;lt;field var='field-name' label='description' type='{field-type}'/&amp;gt; &lt;br /&gt;
  &amp;lt;/reported&amp;gt; &lt;br /&gt;
  &amp;lt;item&amp;gt; &lt;br /&gt;
    &amp;lt;field var='field-name'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;field-value&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
  &amp;lt;/item&amp;gt; &lt;br /&gt;
  &amp;lt;item&amp;gt; &lt;br /&gt;
    &amp;lt;field var='field-name'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;field-value&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
  &amp;lt;/item&amp;gt; &lt;br /&gt;
  . &lt;br /&gt;
  . &lt;br /&gt;
  . &lt;br /&gt;
&amp;lt;/x&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些元素每个都必须包含一个或多个&amp;lt;field/&amp;gt;子元素。&amp;lt;reported/&amp;gt;元素为结果项定义数据格式，通过为每个项目指定所期望的字段。为此，除了'var'属性，&amp;lt;field/&amp;gt;元素还应该有'type'属性'label'属性；而且不能包含&amp;lt;value/&amp;gt;元素。在结果集中，每个&amp;lt;item/&amp;gt;元素定义一个项目，而且必须包含在&amp;lt;reported/&amp;gt;元素（虽然&amp;lt;value/&amp;gt;元素中的XML字符数据可能为空）中指定的字段。&lt;br /&gt;
&lt;br /&gt;
==数据有效性==&lt;br /&gt;
&lt;br /&gt;
数据有效性是表单处理实体（通常是一个服务器，服务，或bot）的责任，而不是表单提交实体（通常是一个由用户控制的客户端）。这有助于满足保持客户端实现简单的要求。如果表单处理实体确定提供的数据是无效的，它应该返回一个“不接受”的错误。选择在XMPP &amp;lt;text/&amp;gt;元素中提供文字说明，或识别问题的特殊应用子元素（参考[http://xmpp.org/extensions/xep-0086.html Error Condition Mappings] [[XEP-0004#附录G:备注|11]]中的映射和格式）。&lt;br /&gt;
&lt;br /&gt;
==例子==&lt;br /&gt;
&lt;br /&gt;
对于下面的例子，我们假设存在一个bot hosting服务在Jabber network上，位于&amp;lt;botster.shakespeare.lit&amp;gt;。这个服务允许注册用户创建和配置新的bots，对已经存在的bots查找和交互，等等。我们假定这些交互的发生使用的Ad-Hoc Commands [12]协议，协议被用作表单的&amp;quot;wrapper&amp;quot;协议，受'jabber:x:data'命名空间限制。下面章节中的例子，体现了前文中描述的数据表单协议的大部分特性。&lt;br /&gt;
&lt;br /&gt;
注意：额外的例子可以通过各种“使用协议”的说明书中找到。如XEP-0045:Multi-User Chat和XEP-0055:Jabber Search。&lt;br /&gt;
&lt;br /&gt;
===配置===&lt;br /&gt;
&lt;br /&gt;
:第一步是为用户在主机上创建一个新的bot。我们假设这是通过发送一个“创建”命令给期望的bot来实现的:&lt;br /&gt;
&lt;br /&gt;
:'''例1.用户请求Bot创建'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='romeo@montague.net/home' &lt;br /&gt;
    to='joogle@botster.shakespeare.lit' &lt;br /&gt;
    type='get' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='create1'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='create' &lt;br /&gt;
           action='execute'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:然后主服务返回一个数据表单个用户:&lt;br /&gt;
&lt;br /&gt;
:'''例2.服务返回一个Bot创建表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='joogle@botster.shakespeare.lit' &lt;br /&gt;
    to='romeo@montague.net/home' &lt;br /&gt;
    type='result' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='create1'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands' &lt;br /&gt;
           node='create' &lt;br /&gt;
           sessionid='create:20040408T0128Z' &lt;br /&gt;
           status='executing'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt; &lt;br /&gt;
      &amp;lt;title&amp;gt;Bot Configuration&amp;lt;/title&amp;gt; &lt;br /&gt;
      &amp;lt;instructions&amp;gt;Fill out this form to configure your new bot!&amp;lt;/instructions&amp;gt; &lt;br /&gt;
      &amp;lt;field type='hidden' &lt;br /&gt;
             var='FORM_TYPE'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;jabber:bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&amp;lt;value&amp;gt;Section 1: Bot Info&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' &lt;br /&gt;
             label='The name of your bot' &lt;br /&gt;
             var='botname'/&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-multi' &lt;br /&gt;
             label='Helpful description of your bot' &lt;br /&gt;
             var='description'/&amp;gt; &lt;br /&gt;
      &amp;lt;field type='boolean' &lt;br /&gt;
             label='Public bot?' &lt;br /&gt;
             var='public'&amp;gt; &lt;br /&gt;
        &amp;lt;required/&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-private' &lt;br /&gt;
             label='Password for special access' &lt;br /&gt;
             var='password'/&amp;gt; &lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&amp;lt;value&amp;gt;Section 2: Features&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-multi' &lt;br /&gt;
             label='What features will the bot support?' &lt;br /&gt;
             var='features'&amp;gt; &lt;br /&gt;
        &amp;lt;option label='Contests'&amp;gt;&amp;lt;value&amp;gt;contests&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='News'&amp;gt;&amp;lt;value&amp;gt;news&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='Polls'&amp;gt;&amp;lt;value&amp;gt;polls&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='Reminders'&amp;gt;&amp;lt;value&amp;gt;reminders&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='Search'&amp;gt;&amp;lt;value&amp;gt;search&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;news&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;search&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&amp;lt;value&amp;gt;Section 3: Subscriber List&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-single' &lt;br /&gt;
             label='Maximum number of subscribers' &lt;br /&gt;
             var='maxsubs'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&amp;lt;value&amp;gt;Section 4: Invitations&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='jid-multi' &lt;br /&gt;
             label='People to invite' &lt;br /&gt;
             var='invitelist'&amp;gt; &lt;br /&gt;
        &amp;lt;desc&amp;gt;Tell all your friends about your new bot!&amp;lt;/desc&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:然后用户提交配置表单:&lt;br /&gt;
&lt;br /&gt;
:'''例3.用户提交bot创建表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='romeo@montague.net/home' &lt;br /&gt;
    to='joogle@botster.shakespeare.lit' &lt;br /&gt;
    type='set' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='create2'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands' &lt;br /&gt;
           node='create' &lt;br /&gt;
           sessionid='create:20040408T0128Z'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt; &lt;br /&gt;
      &amp;lt;field type='hidden' var='FORM_TYPE'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;jabber:bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' var='botname'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;The Jabber Google Bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-multi' var='description'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;This bot enables you to send requests to&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;Google and receive the search results right&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;in your Jabber client. It&amp;amp;apos; really cool!&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;It even supports Google News!&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='boolean' var='public'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-private' var='password'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;v3r0na&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-multi' var='features'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;news&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;search&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-single' var='maxsubs'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='jid-multi' var='invitelist'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;juliet@capulet.com&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;benvolio@montague.net&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:然后服务返回结果给用户:&lt;br /&gt;
&lt;br /&gt;
:'''例4.服务返回bot创建的结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='joogle@botster.shakespeare.lit' &lt;br /&gt;
    to='romeo@montague.net/home' &lt;br /&gt;
    type='result' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='create2'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands' &lt;br /&gt;
           node='create' &lt;br /&gt;
           sessionid='create:20040408T0128Z' &lt;br /&gt;
           status='completed'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;field type='hidden' var='FORM_TYPE'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;jabber:bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' var='botname'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;The Jabber Google Bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='boolean' var='public'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-private' var='password'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;v3r0na&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-multi' var='features'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;news&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;search&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-single' var='maxsubs'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='jid-multi' var='invitelist'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;juliet@capulet.com&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;benvolio@montague.net&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===搜索===&lt;br /&gt;
&lt;br /&gt;
既然用户已经创建了这个搜索bot,我们假设他所邀请的好友中的一个，决定通过发送一个搜索请求来试一试:&lt;br /&gt;
&lt;br /&gt;
:'''例5.用户请求搜索表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='juliet@capulet.com/chamber' &lt;br /&gt;
    to='joogle@botster.shakespeare.lit' &lt;br /&gt;
    type='get' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='search1'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='search' &lt;br /&gt;
           action='execute'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''例6.服务返回搜索表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='joogle@botster.shakespeare.lit' &lt;br /&gt;
    to='juliet@capulet.com/chamber' &lt;br /&gt;
    type='result' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='search1'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='search' &lt;br /&gt;
           status='executing'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt; &lt;br /&gt;
      &amp;lt;title&amp;gt;Joogle Search&amp;lt;/title&amp;gt; &lt;br /&gt;
      &amp;lt;instructions&amp;gt;Fill out this form to search for information!&amp;lt;/instructions&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' &lt;br /&gt;
             var='search_request'&amp;gt; &lt;br /&gt;
        &amp;lt;required/&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''例7.用户提交搜索表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='juliet@capulet.com/chamber' &lt;br /&gt;
    to='joogle@botster.shakespeare.lit' &lt;br /&gt;
    type='get' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='search2'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='search'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' var='search_request'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;verona&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''例8.服务返回搜索结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='joogle@botster.shakespeare.lit' &lt;br /&gt;
    to='juliet@capulet.com/chamber' &lt;br /&gt;
    type='result' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='search2'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='search' &lt;br /&gt;
           status='completed'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;title&amp;gt;Joogle Search: verona&amp;lt;/title&amp;gt; &lt;br /&gt;
      &amp;lt;reported&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'/&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'/&amp;gt; &lt;br /&gt;
      &amp;lt;/reported&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;Comune di Verona - Benvenuti nel sito ufficiale&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.comune.verona.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;benvenuto!&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.hellasverona.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;Universita degli Studi di Verona - Home Page&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.univr.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;Aeroporti del Garda&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.aeroportoverona.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;Veronafiere - fiera di Verona&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.veronafiere.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==服务发现==&lt;br /&gt;
&lt;br /&gt;
如果一个实体支持包含受'jabber:x:data'命名空间限制的&amp;lt;x/&amp;gt;元素作为&amp;lt;message/&amp;gt;节直接子元素，它必须报告支持包含一个&amp;quot;jabber:x:data&amp;quot;（参看Protocol Namespaces中关于一个或多个永久命名空间的发行）的服务搜索特征，去响应服务搜索信息请求:&lt;br /&gt;
&lt;br /&gt;
:'''例9.服务搜索信息请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get' &lt;br /&gt;
    from='romeo@montague.net/orchard' &lt;br /&gt;
    to='juliet@capulet.com/balcony' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''例10.服务搜索信息响应'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result' &lt;br /&gt;
    from='juliet@capulet.com/balcony' &lt;br /&gt;
    to='romeo@montague.net/orchard' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt; &lt;br /&gt;
    ... &lt;br /&gt;
    &amp;lt;feature var='jabber:x:data'/&amp;gt; &lt;br /&gt;
    ... &lt;br /&gt;
  &amp;lt;/query&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果实体支持数据表单，间接的通过在wrapper命名空间中包含数据表单，它不能为'jabber:x:data'命名空间通知支持，因为在wrapper协助中的支持是隐性的。&lt;br /&gt;
&lt;br /&gt;
==安全性考虑==&lt;br /&gt;
&lt;br /&gt;
没有安全问题与上述的规范和XMPP Core中相关章节的描述有关。&lt;br /&gt;
&lt;br /&gt;
==IANA考虑==&lt;br /&gt;
&lt;br /&gt;
这份文档与[http://www.iana.org/ Internet Assigned Numbers Authority (IANA)] [[XEP-0004#附录G:备注|13]]无关。&lt;br /&gt;
&lt;br /&gt;
==XMPP注册考虑==&lt;br /&gt;
&lt;br /&gt;
===协议命名空间===&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/registrar/ XMPP Registrar] [[XEP-0004#附录G:备注|14]]在它注册的协议命名空间中包含'jabber:x:data'命名空间。&lt;br /&gt;
&lt;br /&gt;
===参数值===&lt;br /&gt;
&lt;br /&gt;
XMPP注册员维持着一个与'jabber:x:data'命名空间相关的注册参数值。具体定义在[http://xmpp.org/extensions/xep-0068.html Field Standardization for Data Forms] [[XEP-0004#附录G:备注|15]]。注册的地方是&amp;lt;http://xmpp.org/registrar/formtypes.html&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==XML 架构==&lt;br /&gt;
&lt;br /&gt;
该架构是描述性的，不是规范的。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;xs:schema &lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema' &lt;br /&gt;
    targetNamespace='jabber:x:data' &lt;br /&gt;
    xmlns='jabber:x:data' &lt;br /&gt;
    elementFormDefault='qualified'&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt; &lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt; &lt;br /&gt;
      The protocol documented by this schema is defined in &lt;br /&gt;
      XEP-0004: http://www.xmpp.org/extensions/xep-0004.html &lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element name='instructions'  &lt;br /&gt;
                    minOccurs='0'  &lt;br /&gt;
                    maxOccurs='unbounded'  &lt;br /&gt;
                    type='xs:string'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element name='title' minOccurs='0' type='xs:string'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='field' minOccurs='0' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='reported' minOccurs='0' maxOccurs='1'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='item' minOccurs='0' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='type' use='required'&amp;gt; &lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt; &lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='cancel'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='form'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='result'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='submit'/&amp;gt; &lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt; &lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='field'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element name='desc' minOccurs='0' type='xs:string'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element name='required' minOccurs='0' type='empty'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='value' minOccurs='0' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='option' minOccurs='0' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='label' type='xs:string' use='optional'/&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='type' use='optional'&amp;gt; &lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt; &lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='boolean'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='fixed'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='hidden'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='jid-multi'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='jid-single'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='list-multi'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='list-single'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='text-multi'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='text-private'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='text-single'/&amp;gt; &lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt; &lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='var' type='xs:string' use='optional'/&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='option'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='value'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='label' type='xs:string' use='optional'/&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='value' type='xs:string'/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='reported'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:annotation&amp;gt; &lt;br /&gt;
      &amp;lt;xs:documentation&amp;gt; &lt;br /&gt;
        When contained in a &amp;quot;reported&amp;quot; element, the &amp;quot;field&amp;quot; element &lt;br /&gt;
        SHOULD NOT contain a &amp;quot;value&amp;quot; child. &lt;br /&gt;
      &amp;lt;/xs:documentation&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:annotation&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='field' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='field' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt; &lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/xs:schema&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==最终状态的修改==&lt;br /&gt;
&lt;br /&gt;
当本规范已经是最终状态时，下面的实体协议已经做了修改：&lt;br /&gt;
&lt;br /&gt;
* 指定的'var'属性是所有字段类型所必须的，除了&amp;quot;fixed&amp;quot;, 因为'var'属性是可选的。&lt;br /&gt;
&lt;br /&gt;
* 通过服务搜索指定何时去通知支持。&lt;br /&gt;
  &lt;br /&gt;
* 移除引用&amp;lt;presence/&amp;gt;节。&lt;br /&gt;
&lt;br /&gt;
==草稿状态的修改==&lt;br /&gt;
&lt;br /&gt;
当本规范在草稿状态时，下面的实体协议已经做了修改：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;x/&amp;gt;元素可能直接包含在&amp;lt;message/&amp;gt;和&amp;lt;presence/&amp;gt;节中。&lt;br /&gt;
* &amp;lt;x/&amp;gt;元素可能包含一个&amp;lt;title/&amp;gt;子元素，在表单或结果中。&lt;br /&gt;
* &amp;lt;x/&amp;gt;元素必须拥有一个‘类型’属性。&lt;br /&gt;
* &amp;lt;field/&amp;gt;元素可能是类型='jid-single'。&lt;br /&gt;
* 结果可能以&amp;lt;item/&amp;gt;标签的方式返回报告。&lt;br /&gt;
* 结果可能包含一个&amp;lt;reported/&amp;gt;元素的结果集。&lt;br /&gt;
* &amp;lt;reported/&amp;gt;字段可能拥有一个‘类型’属性，提供如何与数据交互的提示（类型='jid-single'是最有用的）。&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0004&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://www.xmpp.org/extensions/xep-0001.html#states-Final 终结版]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：2.9&lt;br /&gt;
&lt;br /&gt;
最后更新：2007-07-13&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：[[RFC3920|XMPP Core]]&lt;br /&gt;
&lt;br /&gt;
替代标准：无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：x-data&lt;br /&gt;
&lt;br /&gt;
XML架构:&amp;lt;http://www.xmpp.org/schemas/x-data.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0004.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0004.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0004.xml XML] [http://xmpp.org/extensions/xep-0004.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
&lt;br /&gt;
'''Ryan Eatmon'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:reatmon@jabber.org reatmon@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: reatmon@jabber.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Joe Hildebrand'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:jhildebr@cisco.com jhildebr@cisco.com]&lt;br /&gt;
&lt;br /&gt;
JabberID: hildjj@jabber.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Jeremie Miller'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:jer@jabber.org jer@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: jer@jabber.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Thomas Muldowney'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:temas@jabber.org temas@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: temas@jabber.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
#XEP-0077: In-Band Registration &amp;lt;http://xmpp.org/extensions/xep-0077.html&amp;gt;.&lt;br /&gt;
#XEP-0055: Jabber Search &amp;lt;http://xmpp.org/extensions/xep-0055.html&amp;gt;.&lt;br /&gt;
#XEP-0045: Multi-User Chat &amp;lt;http://xmpp.org/extensions/xep-0045.html&amp;gt;.&lt;br /&gt;
#XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
#XForms 1.0 &amp;lt;http://www.w3.org/TR/xforms&amp;gt;.&lt;br /&gt;
#XHTML 1.0 &amp;lt;http://www.w3.org/TR/xhtml1&amp;gt;.&lt;br /&gt;
#Modularization of XHTML &amp;lt;http://www.w3.org/TR/2004/WD-xhtml-modularization-20040218/&amp;gt;.&lt;br /&gt;
#RFC 3920: Extensible Messaging and Presence Protocol (XMPP): Core &amp;lt;http://tools.ietf.org/html/rfc3920&amp;gt;.&lt;br /&gt;
#XML Schema Part 2: Datatypes &amp;lt;http://www.w3.org/TR/xmlschema-2/&amp;gt;.&lt;br /&gt;
#In accordance with Section 3.2.2.1 of XML Schema Part 2: Datatypes, the allowable lexical representations for the xs:boolean datatype are the strings &amp;quot;0&amp;quot; and &amp;quot;false&amp;quot; for the concept 'false' and the strings &amp;quot;1&amp;quot; and &amp;quot;true&amp;quot; for the concept 'true'; implementations MUST support both styles of lexical representation.&lt;br /&gt;
#XEP-0086: Error Condition Mappings &amp;lt;http://xmpp.org/extensions/xep-0086.html&amp;gt;.&lt;br /&gt;
#XEP-0050: Ad-Hoc Commands &amp;lt;http://xmpp.org/extensions/xep-0050.html&amp;gt;.&lt;br /&gt;
#The Internet Assigned Numbers Authority (IANA) is the central coordinator for the assignment of unique parameter values for Internet protocols, such as port numbers and URI schemes. For further information, see &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
#The XMPP Registrar maintains a list of reserved protocol namespaces as well as registries of parameters used in the context of XMPP extension protocols approved by the XMPP Standards Foundation. For further information, see &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
#XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===附录H:修订历史===&lt;br /&gt;
&lt;br /&gt;
注意: &lt;br /&gt;
&lt;br /&gt;
'''版本 2.9 (2007-08-13)'''&lt;br /&gt;
&lt;br /&gt;
Clarified the definition and handling of the list-multi and list-single field types; specified that hidden field values should not be modified unless such behavior is defined for the using protocol; specified that a submission should include all fields provided in the empty form and may include additional fields, but that additional fields must be ignored if not understood by the form-processing entity.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 2.8 (2007-05-21)'''&lt;br /&gt;
&lt;br /&gt;
Removed mentions of presence stanzas; added section on discovering support; added section on substantive changes in Final state.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 2.7 (2006-01-25)'''&lt;br /&gt;
&lt;br /&gt;
Incorporated errata: (1) clarified rules regarding inclusion of option and value elements depending on field type; (2) clarified handling of default values; (3) added value elements to list-multi field in Example 2; (4) harmonized spelling of form-processing entity and form-submitting entity.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
Version 2.6 (2004-10-13)&lt;br /&gt;
Incorporated errata: (1) corrected syntax of &amp;lt;reported/&amp;gt; element (&amp;lt;field/&amp;gt; element should not contain a &amp;lt;value/&amp;gt; child); (2) corrected Example 8.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.5 (2004-05-07)&lt;br /&gt;
Clarified terminology regarding form-processing entities and form-submitting entities; corrected several small errors in the schema.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.4 (2004-05-04)&lt;br /&gt;
Per discussion by the authors and Jabber Council, specified that the 'var' attribute is required for all field types except &amp;quot;fixed&amp;quot;, for which the 'var' attribute is optional.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.3 (2004-03-31)&lt;br /&gt;
Formalization and further editorial revisions.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.2 (2004-01-22)&lt;br /&gt;
Editorial revisions.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.1 (2003-02-16)&lt;br /&gt;
Added schema.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.0 (2002-12-09)&lt;br /&gt;
Per a vote of the Jabber Council, changed status to Final.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 1.1 (2002-10-15)&lt;br /&gt;
Call for Experience changes (see Changes in Draft State section). This version voted to Final on 2002-12-09.&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 1.0 (2002-04-24)&lt;br /&gt;
Per a vote of the Jabber Council, changed status to Draft.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 0.6 (2002-03-15)&lt;br /&gt;
Protocol tweaks based on Standards list discussion.&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.5 (2002-02-06)&lt;br /&gt;
Protocol tweaks based on implementation and discussion.&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.4 (2001-11-16)&lt;br /&gt;
Major redesign to attempt to clarify the scope of this document and limit what it is trying to solve.&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.3 (2001-07-23)&lt;br /&gt;
Protocol update&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.2 (2001-06-29)&lt;br /&gt;
Protocol update and DocBook version&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.1 (2001-01-25)&lt;br /&gt;
Initial release&lt;br /&gt;
&lt;br /&gt;
(rwe)&lt;br /&gt;
[http://essaywritingservices.org/index.php essay writing service]&lt;/div&gt;</summary>
		<author><name>Chruse arroyo</name></author>	</entry>

	</feed>