RDF 1.2 XML 语法

W3C 工作草案

关于本文档的更多详细信息
此版本:
https://www.w3.org/TR/2026/WD-rdf12-xml-20260618/
最新发布版本:
https://www.w3.org/TR/rdf12-xml/
最新编辑草案:
https://w3c.github.io/rdf-xml/spec/
历史:
https://www.w3.org/standards/history/rdf12-xml/
提交历史
测试套件:
https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-xml/
最新推荐标准:
https://www.w3.org/TR/rdf-syntax-grammar
编辑:
Gregg Kellogg(至 2025-09-06),谨以 纪念
Jerven Bolleman
前任编辑:
Fabien Gandon
Guus Schreiber
Dave Beckett
Ora Lassilla
Ralph Swick
作者:
Dave Beckett
反馈:
GitHub w3c/rdf-xml (拉取请求, 新议题, 未关闭议题)
public-rdf-star-wg@w3.org 主题行请写为 [rdf12-xml] … 消息主题 …存档

摘要

资源描述框架 (RDF) 是一种 用于表示 Web 中信息的通用语言。

本文档根据 XML 命名空间、 XML 信息集 [XML-INFOSET] 和 XML Base [XMLBASE],定义了一种称为 RDF/XML 的 RDF XML 语法。

RDF 1.2 XML 语法引入了三元组项, 作为第四种 RDF, 它可用作另一 三元组宾语, 从而能够对其他陈述作出陈述。 三元组项通常不会显式使用, 因为一般更倾向于使用注解构造。 RDF 1.2 XML 语法还增加了对 带方向的语言标记字符串的支持。

本文档状态

本节描述本文档在发布时的状态。 当前 W3C 出版物列表以及本技术报告的最新修订版本可在 W3C 标准与草案 索引中找到。

本文档是 RDF 1.2 文档套件的一部分。 本文档定义了 RDF/XML 语法, 即 RDF [RDF12-CONCEPTS] 的一种具体语法。

自 [rdf-syntax-grammar] 以来, 本文档没有实质性变更。 如有少量编辑性变更, 会在 B. RDF 1.1 与 RDF 1.2 之间的变更中详述。

本文档由 RDF & SPARQL 工作组作为 工作草案发布,并使用 推荐标准 轨道

作为 工作草案发布并不表示 获得 W3C 及其成员的认可。

这是一份草案文档,随时可能被更新、替换或废弃。 除作为进行中的工作引用外,不宜以其他方式引用本文档。 对这一即将形成的推荐标准的未来更新可能会纳入 新特性

本文档由一个 根据 W3C 专利 政策运作的小组制作。 W3C 维护着一份与该小组交付成果相关的 任何专利披露的公开列表; 该页面还包括 披露专利的说明。若个人实际 知晓某项专利,并认为该专利包含 必要权利要求, 则必须按照 W3C 专利政策第 6 节披露该信息。

本文档受 2025 年 8 月 18 日 W3C 流程文档约束。

1. 引言

本节为非规范性内容。

本文档定义了用于 RDF的 XML [XML11] 语法。

本文档根据 XML 信息集 [XML-INFOSET] 信息项修订了最初的 RDF/XML 语法 [RDF-SYNTAX-GRAMMAR-19990222], 从而脱离了 XML 中相当底层的细节,例如空元素的特定 形式。这使语法可以被更精确地 记录,并且从 XML 语法到 RDF的映射可以更清楚地展示。 到 RDF的映射 是通过 以 N-Triples [RDF12-N-TRIPLES] 格式发出陈述来完成的。

若要从历史 视角了解 RDF/XML 语法的更长篇介绍,请参见“RDF:理解条带化 RDF/XML 语法” [STRIPEDRDF]。

2. RDF 的一种 XML 语法

本节为非规范性内容。

本节介绍 RDF/XML 语法,描述它如何 编码 RDF, 并用示例加以说明。如果这种非正式描述与第 5. 语法数据模型 和第 6. RDF/XML 语法 中对语法和文法的形式化描述之间存在任何冲突, 后两节优先适用。

2.1 引言

RDF 概念和抽象语法文档 [RDF12-CONCEPTS] 定义了 RDF 数据模型和 RDF 抽象语法。 与 RDF 语义 [RDF12-SEMANTICS] 一起,它为该抽象语法提供了形式化语义。 RDF 数据模型具有节点 和带标签的有向, 用来连接成对节点,并被表示为一组 RDF 三元组, 其中每个三元组包含一个 主语节点谓词宾语节点。 节点可以是 IRI字面量,或 空节点。 空节点可以被赋予一个称为 空节点标识符的文档局部标识符。 谓词是 IRI, 可以解释为两个节点之间的关系, 或解释为为某个主语节点定义一个属性值(宾语节点)。

为了在 XML 中编码图,节点和谓词必须以 XML 术语 表示——元素名、属性名、元素内容 和属性值。 RDF/XML 使用 XML QName (按 XML 命名空间 [XML-NAMES] 中的定义)来表示 IRI。 所有 QName 都有一个命名空间名称,它是一个 IRI, 以及一个简短的 本地 名称。 此外,QName 可以具有一个简短的 前缀, 也可以通过默认命名空间声明来声明并且没有前缀(但 仍具有一个 命名空间名称

IRI 表示的 QName 是通过把 QName 的 本地 名称 部分附加到 QName 的 命名空间名称IRI)部分之后来确定的。 这用于缩短所有谓词和一些节点的 IRI。 标识 主语和宾语节点的 IRI 也可以存储为 XML 属性值。 只能作为宾语节点的 RDF 字面量 会成为 XML 元素文本内容或 XML 属性值。

图可以被视为由 node, predicate arc, node, predicate arc, node, predicate arc, ... node 形式的路径组成的集合, 这些路径覆盖整个图。在 RDF/XML 中,这些路径 转换为元素内部的元素序列,并在表示节点 和谓词弧的元素之间交替。这被称为一系列 node/arc 条带。序列开头的节点会变成 最外层元素,下一个谓词弧会变成子元素, 依此类推。条带通常从 RDF/XML 文档的顶层开始,并且总是以节点开头。

以下各节给出了若干 RDF/XML 示例, 逐步构建到完整的 RDF/XML 文档。示例 7 是第一个完整的 RDF/XML 文档。

2.2 节点元素和 属性元素

RDF/XML 示例 4 的图。
1 示例 4中描述的 RDF/XML 示例的图。

一个 RDF1中给出, 其中节点表示为椭圆,椭圆中包含它们的 IRI(如果有的话), 所有谓词弧都用 IRI 标注, 而字符串字面量节点被写在矩形中。

如果我们沿着 2所示图中的一条 node, predicate arc ... , node 路径:

RDF/XML 示例 4 的图中的一条路径。
2 示例 4 中描述的图中的一条路径, 突出显示从 <https://www.w3.org/TR/rdf12-xml/><https://greggkellogg.net/> 的路径。 路径上的元素以粗体文本标记。

2 图的左侧对应于 node/predicate arc 条带:

  1. 具有 IRI https://www.w3.org/TR/rdf12-xml/ 的节点
  2. 标记为 IRI http://example.org/terms/editor 的谓词弧
  3. 没有 IRI 的节点
  4. 标记为 IRI http://example.org/terms/homePage 的谓词弧
  5. 具有 IRI https://greggkellogg.net/ 的节点

RDF/XML 中, 2左侧由 5 个节点和谓词弧组成的序列对应于 使用五个 XML 元素,这些元素分为两类:用于图节点和 谓词弧。它们通常分别称为节点元素属性元素。在 示例 1所示的条带化表示中,rdf:Description节点元素(用于三个节点,共使用三次),而 ex:editorex:homePage 是两个 属性元素

示例 1:条带化 RDF/XML(节点和谓词弧)

<span class="hl-bold"><rdf:Description></span>
<ex:editor>
  <span class="hl-bold"><rdf:Description></span>
    <ex:homePage>
      <rdf:Description>
      </rdf:Description>
    </ex:homePage>
  <span class="hl-bold"></rdf:Description></span>
</ex:editor>
<span class="hl-bold"></rdf:Description></span>

2中的图包含一些 是 IRI 的节点(以及其他不是 IRI 的节点,称为空节点元素),可以通过在节点 元素上使用 rdf:about 属性将这些信息加入到 RDF/XML, 得到示例 2中的结果:

示例 2:添加了 IRI 的节点 元素

<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/">
  <ex:editor>
    <rdf:Description>
      <ex:homePage>
        <rdf:Description rdf:about="https://greggkellogg.net/">
        </rdf:Description>
      </ex:homePage>
    </rdf:Description>
  </ex:editor>
</rdf:Description>

1 中另外两条穿过该图的路径加入 示例 2里的 RDF/XML, 得到示例 3所示的结果 (此示例未能显示该空节点在两条路径之间 是共享的, 参见 2.11 标识空节点:rdf:nodeID):

示例 3:所有图路径的完整 描述

<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/">
  <ex:editor>
    <rdf:Description>
      <ex:homePage>
        <rdf:Description rdf:about="https://greggkellogg.net/">
        </rdf:Description>
      </ex:homePage>
    </rdf:Description>
  </ex:editor>
</rdf:Description>

<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/">
  <ex:editor>
    <rdf:Description>
      <ex:fullName>Gregg Kellogg</ex:fullName>
    </rdf:Description>
  </ex:editor>
</rdf:Description>

<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/">
  <dc:title>RDF 1.2 XML Syntax</dc:title>
</rdf:Description>

2.3 多个属性元素

有若干缩写形式可用于使常见 用法更容易写出。特别是, RDF中的主语节点通常具有多个外出谓词弧。RDF/XML 在关于某个资源的节点元素具有多个属性元素时, 为相应语法提供一种缩写形式。可以通过在描述主语节点的节点 元素内部使用多个子属性元素来缩写。

示例 3为例,有 两个节点元素可以包含多个属性元素。 具有 IRI https://www.w3.org/TR/rdf12-xml/ 的主语节点具有属性元素 ex:editordc:title, 而用于空节点节点元素可以包含 ex:homePageex:fullName。这种缩写 得到示例 4所示的结果 (此示例确实显示只有一个空节点):

示例 4:在节点元素上使用 多个属性元素

<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/">
  <ex:editor>
    <rdf:Description>
      <ex:homePage>
        <rdf:Description rdf:about="https://greggkellogg.net/">
        </rdf:Description>
      </ex:homePage>
      <ex:fullName>Gregg Kellogg</ex:fullName>
    </rdf:Description>
  </ex:editor>
  <dc:title>RDF 1.2 XML Syntax</dc:title>
</rdf:Description>

2.4 空属性元素

RDF中的谓词弧指向一个没有 进一步谓词弧的宾语节点时,它在 RDF/XML 中表现为 一个空的节点元素 <rdf:Description rdf:about="..."> </rdf:Description> (或 <rdf:Description rdf:about="..." />), 这种形式可以被缩短。做法是在包含它的属性元素上使用 XML 属性 rdf:resource, 其值为宾语节点的 IRI, 并使该属性元素为空。

在此示例中,属性元素 ex:homePage 包含一个空的节点元素,其 IRIhttps://greggkellogg.net/。这可以替换为 空属性元素形式, 得到示例 5所示的结果:

示例 5:空 属性元素
 
<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/">
  <ex:editor>
    <rdf:Description>
      <ex:homePage rdf:resource="https://greggkellogg.net/"/>
      <ex:fullName>Gregg Kellogg</ex:fullName>
    </rdf:Description>
  </ex:editor>
  <dc:title>RDF 1.2 XML Syntax</dc:title>
</rdf:Description>
 

2.5 属性特性

属性元素的内容是字符串 字面量时, 可能可以将它作为 XML 属性放在包含它的 节点元素上。 只有当属性元素名称不重复 (XML 要求——XML 元素上的属性名是唯一的), 并且属性元素字符串字面量上任何作用域内的 xml:lang(如果有)都相同 (参见 2.7 语言:xml:lang)时, 才能对同一节点元素上的多个属性这样做。 这种缩写称为属性特性, 并且可应用于任何节点元素

属性元素rdf:type 且它具有一个 rdf:resource 属性时, 也可以使用这种缩写;该属性的值被解释为一个 IRI 宾语 节点。

示例 5中: 有两个带字符串字面量内容的属性元素, 即 dc:titleex:fullName 属性元素。它们可以替换为属性特性, 得到示例 6所示的结果:

示例 6: 将带字符串字面量内容的属性元素替换为属性特性

<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/"
           dc:title="RDF 1.2 XML Syntax">
  <ex:editor>
    <rdf:Description ex:fullName="Gregg Kellogg">
      <ex:homePage rdf:resource="https://greggkellogg.net/"/>
    </rdf:Description>
  </ex:editor>
</rdf:Description>

2.6 完成文档:文档元素和 XML 声明

为了创建完整的 RDF/XML 文档, 将图序列化为 XML 后通常包含在一个 rdf:RDF XML 元素内部,该元素成为顶层 XML 文档 元素。 按惯例,rdf:RDF 元素 也用于声明所使用的 XML 命名空间,尽管这并非 必需。当 rdf:RDF 内部 只有一个顶层节点元素时, 可以省略 rdf:RDF, 但任何 XML 命名空间仍然必须声明。

XML 规范还允许在文档顶部使用一个 XML 声明, 其中包含 XML 版本,以及可能包含 XML 内容编码。这是可选的,但推荐使用。

可以对从 示例 4开始的任何正确 完整图示例完成 RDF/XML, 但取最小的 示例 6并添加最终组成部分, 会得到 1中原始图的完整 RDF/XML 表示, 如示例 7所示:

可以在上面的示例 7中省略 rdf:RDF, 因为 rdf:RDF 内部只有一个 rdf:Description, 但此处未展示这种形式。

2.7 语言:xml:lang

RDF/XML 允许使用 XML 1.1 [XML11] 的 2.12 语言标识 所定义的 xml:lang 属性,以允许标识内容语言。 xml:lang 属性可用于任何节点元素属性元素, 表示所包含的内容使用给定语言。 类型化字面量, 包括 XML 字面量, 不受此属性影响。 当前作用域内最具体的语言(如果有) 会应用于属性元素的字符串字面量内容或 属性特性值。xml:lang="" 形式 表示不存在语言标识符。

RDF 属性标记内容语言的一些示例如 示例 8所示:

2.8 基方向:its:dir

RDF 1.2 引入了基方向的概念, 可用于指定语言标记字符串的初始文本方向, 以创建带方向的语言标记 字符串。 这是通过在任意 节点元素属性元素上添加 its:dir 属性来指定的, 其中 its 是 ITS 命名空间 http://www.w3.org/2005/11/its 的典型前缀。 its:dir 支持的值为 "ltr""rtl", 这是带方向的语言标记 字符串所要求的。

RDF 属性标记基方向的一些示例如 示例 9所示:

its:dir 属性专门绑定到 [ITS20] 的 2.0 版本,如 顶层 XML 文档元素 上的 its:version="2.0" 所示。

2.9 XML 字面量: rdf:parseType="Literal"

RDF 允许将 XML 字面量 [RDF12-CONCEPTS] 作为谓词的宾语节点给出。 在 RDF/XML 中,它们写作属性元素的内容(而不是 属性特性),并通过在包含它的 属性元素上使用 rdf:parseType="Literal" 属性来指示。

写出 XML 字面量的一个示例如 示例 10所示,其中 有一个单独的 RDF 三元组,其主语节点 IRIhttp://example.org/item01,谓词 IRIhttp://example.org/stuff/1.0/prop(来自 ex:prop),宾语节点带有以 a:Box 开头的 XML 字面量内容。

2.10 类型化字面量: rdf:datatype

RDF 允许将类型化字面量 作为谓词的宾语节点给出。类型化字面量由一个字面量 字符串和一个数据类型 IRI组成。 在 RDF/XML 中,它们使用 属性元素形式中的字面量字符串节点的相同语法 (而不是属性特性),但在 属性元素上额外带有 rdf:datatype="datatypeURI" 属性。 任意 IRI 都可 用作该属性值。

一个 RDF 类型化 字面量 的示例如示例 11所示,其中 有一个单独的 RDF 三元组,其主语节点 IRIhttp://example.org/item01,谓词 IRIhttp://example.org/stuff/1.0/size(来自 ex:size),宾语节点带有 类型化字面量 ("123", http://www.w3.org/2001/XMLSchema#int), 它将被解释为 XML Schema [XMLSCHEMA11-2] 数据类型 int

2.11 标识空节点: rdf:nodeID

RDF 中的空节点是彼此不同的,但没有 IRI。 有时需要在 RDF/XML 的多个位置引用同一个 空节点,例如作为多个 RDF 三元组的主语和宾语。 在这种情况下,可以给空节点一个 空节点标识符, 用于在文档中标识它。 RDF/XML 中的空节点标识符的作用域限定在包含它的 XML 信息集 [XML-INFOSET] 文档信息项内。 空节点标识符 可用于节点元素以替换 rdf:about="IRI", 或用于属性元素以替换 rdf:resource="IRI", 在两种情况下都使用 rdf:nodeID="blank node identifier"

示例 7为例,显式地给其中的 空节点赋予一个值为 abc空节点标识符, 得到示例 12所示的结果。 第二个 rdf:Description 属性元素 关涉该空节点

2.12 省略空 节点:rdf:parseType="Resource"

空节点(而非 IRI 节点) 可以在 RDF中写成一种允许省略 <rdf:Description> </rdf:Description> 对的形式。 省略是通过在包含它的属性元素上放置 rdf:parseType="Resource" 属性来完成的, 该属性会把属性元素变成一个属性兼节点元素, 它本身可以同时具有属性元素属性 特性。 在属性兼节点元素上不允许使用属性特性rdf:nodeID 属性。

取前面的示例 7ex:editor 属性元素的内容 可以改用这种方式来表达, 得到示例 13所示的形式:

2.13 省略节点:空属性元素上的属性特性

如果空节点 元素上的所有属性元素都具有 相同作用域内 xml:lang 值(如果存在)的字符串字面量值,并且每个此类属性元素至多出现 一次,并且至多有一个带有 IRI 宾语节点的 rdf:type 属性 元素,则这些元素可以通过移动到包含它们的属性 元素上作为属性特性来缩写,并使该属性 元素成为空元素。

取前面的示例 5ex:editor 属性元素包含一个 空节点元素,该元素有两个属性元素 ex:fullnameex:homePageex:homePage 在这里不适合,因为它 没有字符串字面量值,因此在本示例中会被 忽略。 缩写形式会移除 ex:fullName 属性元素, 并向 ex:editor 属性元素添加一个新的属性特性 ex:fullName, 其值为被删除属性元素的字符串字面量值。 空节点元素在现在为空的 ex:editor 属性元素中变为隐式。结果见 示例 14

2.14 类型化节点元素

RDF中常见的是主语节点具有 rdf:type 谓词。 它们在图中通常称为类型化 节点,或在 RDF/XML 中称为类型化节点元素RDF/XML 允许通过把 rdf:Description 节点元素名替换为 与类型关系值的 IRI 相对应的带命名空间元素, 来更简洁地表达这些三元组。当然,可以有多个 rdf:type 谓词,但只有一个可以用这种方式使用,其他谓词必须保持为 属性元素属性 特性

类型化节点元素在 RDF/XML 中常与 RDF 词汇表中的内建类一起使用: rdf:Seqrdf:Bagrdf:Altrdf:Statementrdf:Propertyrdf:List

例如,15 中的 RDF/XML 可以写成示例 16所示的形式。

2.15 缩写 IRI: rdf:IDxml:base

RDF/XML 允许通过两种方式在 XML 属性中进一步缩写 IRI。 XML Infoset 提供了一个基 URI 属性 xml:base, 它为解析相对 IRI 引用设置基 IRI,否则 基 IRI 就是文档的 IRI。基 IRI 适用于 所有处理 IRIRDF/XML 属性, 即 rdf:aboutrdf:resourcerdf:IDrdf:datatype

节点元素上的 rdf:ID 属性 (不是在属性元素上; 在那里它有另一种含义)可以用来代替 rdf:about,并给出一个等价于 #rdf:ID 属性值串联而成的相对 IRI 引用。因此, 例如如果 rdf:ID="name",它将等价于 rdf:about="#name"rdf:ID 提供了一个额外的 检查,因为同一个 namexml:base 值(或文档,如果未给出)的作用域中只能出现一次, 因此对于定义一组相对于同一 IRI 的不同、 相关术语很有用。

两种形式都要求确定一个基 IRI,可以来自作用域内的 xml:base,也可以来自 RDF/XML 文档的 URL。

示例 17展示了使用 http://example.org/here/xml:baserdf:Description 节点元素上的 rdf:ID, 缩写节点 IRI http://example.org/here/#snackex:prop 谓词的宾语节点是一个 IRI, 它由 rdf:resource XML 属性值根据作用域内基 IRI 解析得到,即 IRI http://example.org/here/fruit/apple

2.16 容器成员属性元素:rdf:lirdf:_n

RDF 有一组容器成员属性 和对应的属性元素,它们主要与 rdf:Seqrdf:Bagrdf:Alt 类的实例一起使用,这些实例可以写作类型化节点元素。列表属性是 rdf:_1rdf:_2 等,并且可以写作 属性元素属性 特性,如 示例 18所示。还有一个 rdf:li 特殊属性元素,它按顺序等价于 rdf:_1rdf:_2, 详见 6.4 列表展开规则。 到容器成员属性的映射 始终按 rdf:li 特殊 属性元素在 XML 中出现的顺序完成——文档顺序 是有意义的。 与示例 18等价的 RDF/XML 若以这种形式编写,如示例 19所示。

2.17 集合: rdf:parseType="Collection"

RDF/XML 允许在 属性元素上使用 rdf:parseType="Collection" 属性,使其能够包含多个节点 元素。这些包含的节点元素给出该集合的主语 节点集合。这种语法形式对应于一组三元组, 用于连接主语节点集合;生成的具体三元组 在 6.2.20 产生式 parseTypeCollectionPropertyElt中详细描述。 集合构造始终按节点元素在 XML 文档中出现的顺序完成。 节点集合的顺序是否有意义是应用程序问题, 此处不作定义。

示例 20展示了在 ex:hasFruit 属性元素末尾使用这种形式表示三个 节点元素的集合。

2.18 具象化陈述: rdf:ID

rdf:ID 属性可以用于属性 元素,以具象化它生成的三元组(完整细节见 6.3 具象化 规则)。 三元组的标识符应构造为一个 IRI, 它由 #rdf:ID 属性值串联而成的相对 IRI 引用 针对作用域内基 IRI 解析得到。因此,例如如果 rdf:ID="triple",它将等价于由相对 IRI 引用 #triple 针对基 IRI 形成的 IRI。 每一对(rdf:ID 属性值,基 IRI) 在 RDF/XML 文档中都必须唯一, 参见constraint-id

示例 21展示了使用 rdf:ID 来具象化由 ex:prop 属性元素生成的三元组,并给具象化三元组赋予 IRI http://example.org/triples/#triple1

2.19 三元组项: rdf:parseType="Triple"

三元组项 可以是 RDF 三元组宾语三元组项RDF中可以写成一种形式, 允许一个三元组项 被写作一个资源, 用来编码单个 RDF 三元组。 这是通过在属性元素上添加 rdf:parseType="Triple" 属性来描述单个三元组项完成的, 该三元组项本身可能不会作为三元组出现在图中;参见 6.2.19 产生式 parseTypeTriplePropertyElt

三元组项具象化陈述扮演类似角色, 区别在于三元组项是 RDF 1.2 抽象语法 [RDF12-CONCEPTS] 的核心部分, 而具象化陈述会发出三元组来描述 已断言图中的另一个三元组。 三元组项描述的是不一定被断言的三元组。 若要同时断言并描述一个三元组, 请参见 2.20 注解 三元组:rdf:annotationrdf:annotationNodeID

2.20 注解三元组:rdf:annotationrdf:annotationNodeID

RDF 1.2 XML 语法还包括用于 注解三元组的语法, 它既通过显式标识符断言该三元组, 又使与该三元组项关联的具象化器成为 后续三元组的 主语宾语。 如果被显式标识,同一个具象化器随后可用作其他 三元组和/或三元组项主语宾语

可以使用 rdf:annotation(用于 IRI 具象化器) 或 rdf:annotationNodeID(用于空节点 具象化器), 将一个具象化器作为属性 特性添加。 此具象化器也可用作其他三元组的主语, 作为一种方式,把那些三元组与由某个属性元素关联的主语、谓词和宾语组成的三元组项 相关联。

3. 一致性

除标记为非规范性的章节外,本规范中的所有编写指南、图表、示例和注释均为非规范性内容。除此之外,本规范中的所有内容均为规范性内容。

本文档中的关键词 MAYMUSTREQUIREDSHOULDSHOULD NOT 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述解释,且仅当它们以全大写形式出现时, 如此处所示。

凡未进一步限定而使用的字符串,均指 Unicode [UNICODE] 字符串; 即由 Unicode 中的码点表示的字符序列。

定义:
RDF/XML 文档是一个 以本文档定义的 RDF XML 语法编写的 RDF 文档
一致性:
如果一个 RDF/XML 文档遵守本文档定义的规范,则它是一个 一致的 RDF/XML 文档

3.1 RDF/XML 互联网媒体类型和文件扩展名

联系人:
Dan Brickley
另请参见:
如何为 W3C 规范注册媒体类型
互联网媒体类型注册,使用的一致性
TAG 结论,2002 年 6 月 3 日(2002 年 9 月 4 日修订)

RDF/XML 的互联网媒体类型(以前称为 MIME 类型)是 application/rdf+xml — [RFC3870]。

建议 RDF/XML 文件在所有平台上使用 扩展名 ".rdf" (全部小写)。

RDF 1.2 中引入的特性要求在作用域内的 节点元素上使用 rdf:version 属性作出版本 声明,且该属性具有除 "1.1" 之外的已定义值。 rdf:version 的可接受值定义在 [RDF12-CONCEPTS] 的 2.1 版本标签中。 对于版本值的解析器行为除此之外未作定义,并且MAY用于 发出错误或警告信号。

application/rdf+xml 媒体类型已经在 IANA 注册为 [RFC3870]。

3.2 隐私考虑

本节为非规范性内容。

RDF/XML 格式用于表达任意 应用数据, 其中可能包含个人身份信息(PII) 或其他可能被视为敏感的信息。 建议发布此类信息的作者仔细 考虑发布此类信息的必要性和用途, 以及数据预期被消费并可能被披露的地区所适用的法规(例如 GDPRCCPA其他法规), 尤其是访问数据是否需要授权措施。

3.3 安全考虑

本节为非规范性内容。

参见 [RFC3870] 的 安全考虑章节

4. 全局问题

4.1 RDF 命名空间和词汇表

RDF 命名空间 IRI(或命名空间名称)是 http://www.w3.org/1999/02/22-rdf-syntax-ns#, 并且通常在 XML 中以 rdf 前缀使用, 尽管也可以使用其他前缀字符串。 RDF 词汇表 由此命名空间名称标识,并且仅由以下名称组成:

语法名称 — 不是概念

RDF Description ID about annotation annotationNodeID datatype li nodeID parseType resource version

类名

Seq Bag Alt Statement Property XMLLiteral List

属性名

subject predicate object type value first rest _n
其中 n 是一个大于零且无前导零的十进制整数。

资源名

nil

任何其他名称均未定义,遇到时SHOULD生成警告, 但除此之外应正常运行。

RDF/XML 文档中,不允许使用 XML 命名空间, 其命名空间名称RDF 命名空间 IRI 与附加字符串联而成的结果。

在整个本文档中,术语 rdf:name 将用于表示 name 来自 RDF 词汇表, 并且其 IRIRDF 命名空间 IRIname 的串联。 例如,rdf:type 具有 IRI http://www.w3.org/1999/02/22-rdf-syntax-ns#type

4.2 标识符

RDF 概念文档 [RDF12-CONCEPTS] 定义了四类可以充当节点 和/或谓词的 RDF 数据:

IRI

IRI 可以充当节点(主语和宾语)以及 谓词。

IRI 可以是:

  • 作为 XML 属性值给出,并被解释为相对 IRI 引用, 这些引用会按照 4.3 解析 IRI 中的描述,针对作用域内基 IRI 解析, 以得到已解析的 IRI
  • 从 XML 命名空间限定的元素名和属性名 (QName)转换而来
  • rdf:ID 属性值转换而来。

RDF/XML 中,XML QName 会被转换 为 IRI, 方法是将 XML 本地名称附加到命名空间名称(IRI)之后。 例如,如果 XML 命名空间前缀 foo 的 命名空间名称(IRI)为 http://example.org/somewhere/,那么 QName foo:bar 将对应于 IRI http://example.org/somewhere/bar。请注意,这会 限制可构造的 IRI, 并且同一个 IRI 可以通过多种方式给出。

rdf:ID 值会被转换为 IRI, 方法是将该属性值附加到 在作用域内基 IRI 后附加 "#" 的结果之后;该作用域内基 IRI 定义在 4.3 解析 IRI中。

字面量

字面量只能充当宾语节点。

字面量总是具有数据类型。 语言标记字符串获得 数据类型 rdf:langString。当未指定 语言标签或数据类型时,该字面量会被视为已指定数据类型 xsd:string

空节点

空节点可以充当主语节点和宾语 节点。

空节点RDF中具有不同身份。 当图以 RDF/XML 等语法编写时,这些 空节点可能需要文档局部标识符 以及一种语法, 以保留这种区别。这些局部标识符称为 空节点标识符, 并在 RDF/XML 中用作 rdf:nodeID 属性的值, 其语法见 产生式 nodeIdAttrRDF/XML 中的空节点标识符的作用域限定在 XML 信息集 [XML-INFOSET] 文档信息项内。

如果未通过 rdf:nodeID 属性值显式给出空节点标识符, 则需要生成一个(使用 generated-blank-node-id, 参见 5.3.3 语法动作记法)。 这种生成的空节点标识符 MUST 不得与任何从 rdf:nodeID 属性值 得出的空节点标识符冲突。这可以通过任何能够保留图中所有 空节点不同身份的方法实现,也就是说,同一个空节点标识符 不会被赋予不同的空节点。一种可行方法是 为所有 rdf:nodeID 属性值添加一个固定前缀, 并确保任何生成的空节点标识符都不会使用该 前缀。另一种方法是将所有 rdf:nodeID 属性 值映射为新的生成空节点标识符,并在 RDF/XML 文档中对所有此类值执行该映射。

三元组项

三元组项只能充当宾语节点。

三元组项描述一个三元组,该三元组可能已在图中断言,也可能未断言。

4.3 解析 IRI

RDF/XML 支持 XML Base [XMLBASE], 后者为每个 ·root event··element event·定义了一个 ·base-iri· 访问器。 相对 IRI 引用按照 [XMLBASE] 中指定的算法, 并依据 统一资源标识符(URI):通用 语法 [RFC3986] 中第 5.2 节的 基本算法,解析为 IRI。 这些规范没有指定将单独的 片段标识符(例如 #foo)或空 字符串 "" 解析为 IRI 的算法。在 RDF/XML 中,片段标识符 通过将该片段标识符附加到作用域内基 IRI 来转换为 IRI。空 字符串通过替换为作用域内基 IRI 来转换 为 IRI

空的同文档引用 "" 会针对基 IRI 的 URI 部分进行解析;任何片段部分 都会被忽略。参见 统一资源标识符(URI)[RFC3986]。

实现说明(资料性): 当使用没有路径组件(/)的层级式基 URI 时,必须先添加路径组件,然后才能将其用作解析时的 基 IRI。

4.4 约束

constraint-id

产生式 idAttr 的每一次应用 都匹配一个属性。 所匹配属性的 ·rdf-term· 访问器在单个 RDF/XML 文档中是唯一的。

名称的语法MUST匹配 rdf-id 产生式

5. 语法数据模型

本文档将 RDF/XML 的语法规定为 符号字母表上的一种语法。 这些符号被称为事件, 风格类似于 XPATH   信息集映射。 事件序列通常从 XML 文档派生; 在这种情况下,它们按照下面 5.2 信息集 映射中定义的文档顺序排列。 这些事件形成的序列旨在类似于从同一个 XML 文档 通过 [SAX] XML API 产生的事件序列。 可以根据语法检查事件序列,以确定它们是否是语法上 良构的 RDF/XML。

RDF 1.2 概念与抽象语法规范 [RDF12-CONCEPTS] 定义了四类 RDFIRI字面量空 节点,以及 三元组项。 字面量由一个词法形式 和一个可选语言标签 [BCP47] ——可能包括一个基方向—— 或一个数据类型 IRI组成。 在解析期间还使用额外类型 prefix,以将字符串标识符映射 到命名空间 IRI。

语法产生式可以包含在 产生式被识别时触发的动作。总体而言,这些动作定义了一种 转换,即将任何语法良构的 RDF/XML 事件 序列转换为一组三元组,方法是把匹配的产生式 映射到 RDF或其组成部分(例如语言 标签、字面量的词法形式)。 语法产生式会改变解析器状态并发出三元组。

这里给出的模型说明了一种从 RDF/XML 文档 创建 RDF 表示的方法。它不规定任何实现 方法——只要能得到同一 RDF的表示,任何其他方法都可以使用。

特别是:

该语法不支持非良构 XML 文档,也不支持 没有 XML 信息集 [XML-INFOSET] 的文档; 例如,不符合 XML 命名空间 [XML-NAMES] 的文档。

信息集要求支持 XML Base [XMLBASE]。 RDF/XML 使用信息项属性 [base IRI], 该属性在 4.3 解析 IRI 中讨论。

本规范要求一个 XML 信息集 [XML-INFOSET], 该信息集至少支持以下用于 RDF/XML 的信息项和 属性:

文档信息项
[document element]、[children]、[base IRI]
元素信息项
[local name]、[namespace name]、[children]、[attributes]、[parent]、[base IRI]
属性信息项
[local name]、[namespace name]、[normalized value]
字符信息项
[character code]

以下各项没有到数据模型事件的映射:

其他信息项和属性没有映射到 语法数据模型事件。

具有保留 XML 名称的元素信息项 (参见 可扩展标记语言(XML) 1.1(第二版) 中的 Name) 不会映射到数据模型元素事件。 这些包括所有属性 [prefix] 以 xml 开头(不区分大小写比较)的项,以及所有 [prefix] 属性 没有值且 [local name] 以 xml 开头(不区分大小写比较)的项。

所有包含在匹配 parseTypeLiteralPropertyElt 产生式的 XML 元素内部的信息项会形成 XML 字面量,并且不遵循此映射。 更多信息参见 parseTypeLiteralPropertyElt

本节旨在满足 [XML-INFOSET] 规范中 一致性 的要求。 它规定了实现本规范所需的 信息项和属性。

5.1 事件

以下小节中定义了九类事件。 大多数事件由信息集信息项构造(除了 IRI空节点没有显式数据类型的字面量类型化字面量之外)。事件 构造器的作用是创建一个具有唯一身份的新事件, 与所有其他事件不同。事件具有访问器操作, 并且大多数具有 string-valueIRIrdf-termliteralbnode 访问器,这些访问器可以是静态值 或计算值。

5.1.1 根事件

文档信息项 构造,并采用以下访问器和值。

document-element
设置为文档信息项属性 [document-element] 的值。
children
设置为文档信息项属性 [children] 的值。
base-iri
设置为文档信息项属性 [base IRI] 的值。
language
设置为空字符串。
direction
设置为空字符串。
graph
用于收集发出三元组的图, 初始化为新的 RDF

5.1.2 元素事件

元素信息项 构造,并采用以下访问器和值:

local-name
设置为元素信息项属性 [local name] 的值。
namespace-name
设置为元素信息项属性 [namespace name] 的值。
children
设置为元素信息项属性 [children] 的值。
parent
设置为元素信息项属性 [parent] 的值。
base-iri
设置为元素信息项属性 [base IRI] 的值。
attributes

由元素信息项属性 [attributes] 的值构成, 该值是一组属性 信息项。

如果此集合包含一个属性信息项 xml:lang([namespace name] 属性的值为 "http://www.w3.org/XML/1998/namespace", 且 [local name] 属性值为 "lang"), 则它会从属性信息项集合中移除,并将 ·language· 访问器设置为该属性信息项的 [normalized-value] 属性。

如果元素具有 version 访问器, 其值为 "1.2-basic""1.2" 或更高, 并且此集合包含一个属性信息项 its:dir([namespace name] 属性的值为 "http://www.w3.org/2005/11/its", 且 [local name] 属性值为 "dir"), 则它会从属性信息项集合中移除,并将 ·direction· 访问器设置为该属性信息项的 [normalized-value] 属性, 其值MUST"ltr""rtl" 或 空字符串之一。

如果元素具有 version 访问器, 其值为 "1.2-basic""1.2" 或更高, 并且此集合包含一个属性信息项 its:version([namespace name] 属性的值为 "http://www.w3.org/2005/11/its", 且 [local name] 属性值为 "version"), 则它会从属性信息项集合中移除,并将 ·its-version· 访问器设置为该属性信息项的 [normalized-value] 属性。

所有剩余的保留 XML 名称 (参见 可扩展 标记语言(XML)1.1(第二版) 中的 Name) 现在都会从集合中移除。 这些是集合中所有属性 [prefix] 以 xml 开头 (不区分大小写比较)的属性信息项,以及所有 [prefix] 属性没有值且 [local name] 以 xml 开头(不区分大小写比较)的属性信息项。 请注意,[base IRI] 访问器是在任何 xml:base 属性信息项被删除之前由 XML Base 计算的。

剩余的属性信息项集合随后用于 构造新的 属性事件 集合,并将其指定为此访问器的值。

IRI
设置为一个 IRI,该 IRI 由 namespace-name 访问器的值与 local-name 访问器的值 串联构造而成。
li-counter
设置为整数值 1。
language
按照上述方式,从 ·attributes· 设置。 如果没有从属性给出值,则该值设置为父事件 (根事件元素事件)上的 language 访问器的值,该值可以是空字符串。
direction
按照上述方式,从 ·attributes· 设置。 如果没有从属性给出值,则该值设置为父事件 (根事件元素事件)上的 direction 访问器的值,该值可以是空字符串。
version
按照上述方式,从 ·attributes· 设置。 如果没有从属性给出值,则该值设置为父事件 (根事件元素事件)上的 version 访问器的值。
its-version
按照上述方式,从 ·attributes· 设置。 如果没有从属性给出值,则该值设置为父事件 (根事件元素事件)上的 version 访问器的值,该值SHOULD设置 为 "2.0"
subject
没有初始值。取一个值,该值为 标识符事件, 或一个三元组项。 此访问器用于处理 RDF中一个节点的元素, 该节点通常是 RDF 三元组主语
graph
用于收集发出三元组的图。 初始值取自父事件 (根事件元素事件), 如果未设置,则为新的 RDF。 可以由 parseType="Triple" 属性修改。

5.1.3 结束元素事件

没有访问器。标记序列中 所含元素的结束。

5.1.4 属性事件

属性信息项 构造,并采用以下访问器和值:

local-name
设置为属性信息项属性 [local name] 的值。
namespace-name
设置为属性信息项属性 [namespace name] 的值。
string-value
设置为属性信息项 属性 [normalized value] 的值,如 [XML11] 所规定 (如果某个属性的规范化 值是零长度字符串,则 string-value 也是 零长度字符串)。
IRI

如果存在 ·namespace-name·, 则设置为一个由 ·namespace-name· 访问器 的值与 ·local-name· 访问器的值 串联构造的 IRI。 否则,如果 ·local-name·IDaboutparseTyperesourcetypeversion, 则设置为一个 IRI,该 IRI 由 RDF 命名空间 IRIlocal-name 访问器的值 串联构造而成。 其他无命名空间的 ·local-name· 访问器值被 禁止。

对有限集合的无命名空间名称的支持是 REQUIRED 的,旨在允许 [RDF-SYNTAX-GRAMMAR-19990222] 中规定的 RDF/XML 文档保持有效;新文档 SHOULD NOT 使用这些未限定属性,应用程序MAY 选择在文档中看到未限定形式时发出警告。

从 XML 属性构造 IRI 可能从不同的 XML 属性生成相同的 IRI。这会在匹配属性事件时导致语法歧义 (例如当 rdf:aboutabout XML 属性 同时存在时)。具有这种情况的文档是非法的。

rdf-term
该值是一个 IRI, 它由 string-value 针对包含元素的 ·base-iri· 访问器解析而构造。

5.1.5 文本事件

由一个或多个连续 字符信息项的序列构造。 具有单个访问器:

string-value
设置为通过串联每个字符信息项的 [character code] 属性而形成的字符串的值。

5.1.6 IRI 事件

用于 IRI 的事件,具有以下访问器:

identifier
取一个用作 IRI 的字符串值。
rdf-term
该值是一个 IRI,由 ·identifier· 访问器的值构造。

这些事件通过为 ·identifier· 访问器赋值来构造。

关于 RDF 中标识符的更多信息, 请参见 4.2 标识符

5.1.7 三元组项事件

用于三元组项的事件,具有以下访问器:

rdf-term
该值是一个三元组项

这些事件通过给 rdf-term 访问器赋值来构造。

5.1.8 空节点标识符 事件

用于空节点标识符 的事件,具有以下访问器:

identifier
取一个字符串值。
blank-node
该值是一个空节点,其局部标识符取自 ·identifier· 访问器。 在 RDF/XML 文档中, 由同一标识符标识的所有空节点 表示同一个空节点

这些事件通过为 ·identifier· 访问器赋值来构造。

关于 RDF 中标识符的更多信息, 请参见 4.2 标识符

5.1.9 无数据类型 字面量事件

RDF 1.2 中没有显式 数据类型的 RDF/XML 字面量 被视为 具有数据类型 xsd:string 的字面量的语法糖(当没有语言标签时), 或视为具有数据类型 rdf:langString 的字面量(当 存在语言标签且不存在方向时), 或视为具有数据类型 rdf:dirLangString 的字面量 (当语言标签和方向都存在时)。 本小节中定义的到 N-Triples 的映射 不受此变更影响。

用于没有显式数据类型的字面量的事件,可以具有以下访问器:

literal-value
取一个字符串值。
literal-language
取一个在语言标记字符串中用作语言标签的字符串值。
literal-direction
取一个在带方向的语言标记 字符串中用作方向标签的字符串值。
literal

该值是一个由其他访问器按如下方式构造的 RDF 字面量

如果 ·literal-language· 是空 字符串, 则该值是一个 RDF 字面量,其 词法形式取自 ·literal-value· 访问器的值, 且数据类型 IRIxsd:string

否则,如果 ·literal-direction· 是空 字符串, 则该值是一个语言标记字符串,其 词法形式取自 ·literal-value· 访问器的值, 并且语言标签取自 ·literal-language· 访问器的值。

否则,该值是一个带方向的 语言标记字符串, 其 词法形式取自 ·literal-value· 访问器的值, 语言标签取自 ·literal-language· 访问器的值, 而基方向 取自 ·literal-direction· 访问器的值。

这些事件通过为 ·literal-value··literal-language··literal-direction· 访问器赋值来构造。

互操作性说明(资料性): 允许以 Unicode 组合字符开头的字面量, 但它们可能导致互操作性问题。 更多信息参见 [CHARMOD]。

5.1.10 类型化字面量事件

用于类型化字面量的事件,可以具有以下访问器:

literal-value
取一个字符串值。
literal-datatype
取一个用作 IRI 的字符串值。
literal

该值是一个 RDF 字面量,其 词法形式取自 ·literal-value· 访问器的值, 且数据类型 IRI 取自 ·literal-datatype· 访问器的值。

这些事件通过为 ·literal-value··literal-datatype· 访问器赋值来构造。

互操作性说明(资料性): 允许以 Unicode 组合字符开头的字面量, 但它们可能导致互操作性问题。 更多信息参见 [CHARMOD]。

实现说明(资料性): 在 XML Schema(第 1 部分)[XMLSCHEMA11-2] 中, 空白规范化 会在验证期间根据 whiteSpace facet 的值发生。本文档使用的语法映射发生在此之后, 因此 whiteSpace facet 在形式上不再具有进一步作用。

5.2 信息集映射

为了按文档顺序将信息集转换为事件序列, 每个信息项会按照上述方式转换,以生成 一棵带有访问器和值的事件树。随后每个元素事件会 按如下描述进行替换,以将事件树 转换为文档顺序中的序列。

  1. 原始的元素事件
  2. children 访问器的值递归转换得到的、可能为空的有序事件列表。
  3. 一个结束元素事件

5.3 语法记法

以下记法用于描述如何匹配 5. 语法数据模型 中给出的数据模型事件序列, 以及对匹配执行的动作。 RDF/XML 语法以从这些匹配的 数据模型事件到三元组的映射来定义,使用如下形式的记法:

number event-type event-content

action...

Triple(s)

其中 event-content 是一个匹配 event-types(如 5.1 事件中定义)的表达式, 使用以下章节给出的记法。 数字用于引用目的。 语法action可能包括向图生成 新三元组。

以下章节描述所使用的通用记法,以及 事件匹配和动作的记法。

5.3.1 语法通用记法

记法 含义
event.accessor 事件访问器的值。
rdf:X 4.1 RDF 命名空间和词汇表中定义的 URI。
"ABC" 字符 A、B、C 按顺序组成的字符串。

5.3.2 语法事件 匹配记法

记法 含义
A == B 事件访问器 A 匹配表达式 B。
A != B A 不等于 B。
A | B | ... A、B、... 项是备选项。
A - B A 中的项,但排除 B 中的所有项。
anyURI. 任意 URI。
anyString. 任意字符串。
list(item1, item2, ...); list() 有序事件列表。空列表。
set(item1, item2, ...); set() 无序事件集合。空集合。
* 前一项出现零次或多次。
? 前一项出现零次或一次。
+ 前一项出现一次或多次。
root(acc1 == value1,
    acc2 == value2, ...)
匹配一个带有访问器的根事件
start-element(acc1 == value1,
    acc2 == value2, ...)
children
end-element()
匹配由一个带有访问器的 元素事件、 一个作为元素内容的可能为空的事件列表,以及一个 结束元素事件组成的序列。
attribute(acc1 == value1,
    acc2 == value2, ...)
匹配一个带有访问器的属性事件
text() 匹配一个文本事件

5.3.3 语法动作记法

记法 含义
A := B 将值 B 赋给 A。
concat(A, B, ..) 按顺序串联各项而创建的字符串。
resolve(e, s) 通过将 s 解释为相对于 e·base-iri· 访问器的相对 IRI 引用而创建的 IRI, 如 4.3 解析 IRI中所定义。
generated-blank-node-id() 新的不同生成 空节点标识符 的字符串值,如 4.2 标识符中所定义。
event.accessor := value 将事件访问器设置为给定值。
iri(identifier := value) 创建新的 IRI 事件
bnodeid(identifier := value) 创建新的空节点标识符事件。 另请参见 4.2 标识符一节。
literal(literal-value := string,
    literal-language := language,
    literal-direction := direction, ...)
创建新的无数据类型字面量事件
string(iri) IRI字符串值。
typed-literal(literal-value := string, ...) 创建新的类型化字面量事件
triple(s, p, o) 创建新的三元组项事件, 由 spo 组成。

6. RDF/XML 语法

6.1 语法概要

6.2.2 产生式 coreSyntaxTerms rdf:RDF | rdf:ID | rdf:about | rdf:annotation | rdf:annotationNodeID | rdf:parseType | rdf:resource | rdf:nodeID | rdf:datatype | rdf:version
6.2.3 产生式 syntaxTerms coreSyntaxTerms | rdf:Description | rdf:li
6.2.4 产生式 oldTerms rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID
6.2.5 产生式 nodeElementIRIs anyURI - ( coreSyntaxTerms | rdf:li | oldTerms )
6.2.6 产生式 propertyElementURIs anyURI - ( coreSyntaxTerms | rdf:Description | oldTerms )
6.2.7 产生式 propertyAttributeIRIs anyURI - ( coreSyntaxTerms | rdf:Description | rdf:li | oldTerms )
6.2.8 产生式 doc root(document-element == RDF, children == list(RDF))
6.2.9 产生式 RDF start-element(IRI == rdf:RDF, attributes == set())
nodeElementList
end-element()
6.2.10 产生式 nodeElementList ws* (nodeElement ws* )*
6.2.11 产生式 nodeElement start-element(IRI == nodeElementIRIs
    attributes == set(idAttr | nodeIdAttr | aboutAttr )?, propertyAttr*)
propertyEltList
end-element()
6.2.12 产生式 ws 匹配 XML [XML11] 定义 White Space 规则 [3] S 中定义的空白的 文本事件, 该规则位于 通用语法 构造一节
6.2.13 产生式 propertyEltList ws* (propertyElt ws* ) *
6.2.14 产生式 propertyElt resourcePropertyElt | literalPropertyElt | parseTypeLiteralPropertyElt | parseTypeResourcePropertyElt | parseTypeTriplePropertyElt | parseTypeCollectionPropertyElt | parseTypeOtherPropertyElt | emptyPropertyElt
6.2.15 产生式 resourcePropertyElt start-element(IRI == propertyElementURIs ), attributes == set(idAttr?))
ws* nodeElement ws*
end-element()
6.2.16 产生式 literalPropertyElt start-element(IRI == propertyElementURIs ), attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, datatypeAttr?))
text()
end-element()
6.2.17 产生式 parseTypeLiteralPropertyElt start-element(IRI == propertyElementURIs ), attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseLiteral))
literal
end-element()
6.2.18 产生式 parseTypeResourcePropertyElt start-element(IRI == propertyElementURIs ), attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseResource))
propertyEltList
end-element()
6.2.19 产生式 parseTypeTriplePropertyElt start-element(IRI == propertyElementURIs ), attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseTriple))
propertyEltList
end-element()
6.2.20 产生式 parseTypeCollectionPropertyElt start-element(IRI == propertyElementURIs ), attributes == set(idAttr?, parseCollection))
nodeElementList
end-element()
6.2.21 产生式 parseTypeOtherPropertyElt start-element(IRI == propertyElementURIs ), attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseOther))
propertyEltList
end-element()
6.2.22 产生式 emptyPropertyElt start-element(IRI == propertyElementURIs ), attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, ( resourceAttr | nodeIdAttr | datatypeAttr )?, propertyAttr*))
end-element()
6.2.23 产生式 idAttr attribute(IRI == rdf:ID, string-value == rdf-id)
6.2.24 产生式 nodeIdAttr attribute(IRI == rdf:nodeID, string-value == rdf-id)
6.2.25 产生式 aboutAttr attribute(IRI == rdf:about, string-value == string(IRI))
6.2.28 产生式 propertyAttr attribute(IRI == propertyAttributeIRIs, string-value == anyString)
6.2.29 产生式 resourceAttr attribute(IRI == rdf:resource, string-value == string(IRI))
6.2.30 产生式 datatypeAttr attribute(IRI == rdf:datatype, string-value == string(IRI))
6.2.31 产生式 parseLiteral attribute(IRI == rdf:parseType, string-value == "Literal")
6.2.32 产生式 parseResource attribute(IRI == rdf:parseType, string-value == "Resource")
6.2.33 产生式 parseTriple attribute(IRI == rdf:parseType, string-value == "Triple")
6.2.34 产生式 parseCollection attribute(IRI == rdf:parseType, string-value == "Collection")
6.2.35 产生式 parseOther attribute(IRI == rdf:parseType, string-value == anyString - ("Resource" | "Literal" | "Collection") )
6.2.36 产生式 IRI 一个 IRI
6.2.37 产生式 literal 根据 [XML11] 定义 Content of Elements 规则 [43] content 所允许的任何 XML 元素内容。 位于 3.1 开始标签、结束标签和空元素标签一节
6.2.38 产生式 rdf-id 一个属性 ·string-value·, 匹配任意合法的 [XML-NAMES] 标记 NCName

6.2 语法产生式

6.2.1 语法起点

如果 RDF/XML 是一个独立 XML 文档 (通过呈现为一个 application/rdf+xml RDF 媒体类型对象 或通过其他方式标识),那么语法可以从 产生式 doc 或 产生式 nodeElement 开始。

如果上下文已知内容是 RDF/XML, 例如当 RDF/XML 嵌入在其他 XML 内容中时, 那么语法可以从 元素事件  RDF 开始 (仅当在 XML 中该位置允许元素时), 或从产生式 nodeElementList 开始 (仅当允许元素内容时,因为这是一个元素列表)。 对于这种嵌入式 RDF/XML, 最外层元素上的 ·base-iri·MUST从包含它的 XML 初始化,因为没有 根事件 可用。 请注意,如果发生这种嵌入,语法可能被进入 多次,但不期望保留任何状态。

编辑注

为嵌入式 RDF/XML 添加测试。

起始节点被称为顶层 XML 文档元素

6.2.2 产生式 coreSyntaxTerms

rdf:RDF | rdf:ID | rdf:about | rdf:parseType | rdf:resource | rdf:nodeID | rdf:datatype | rdf:version

来自 RDF 词汇表中语法术语的一个子集, 见 4.1 RDF 命名空间和词汇表, 它们用于 RDF/XML。

6.2.3 产生式 syntaxTerms

coreSyntaxTerms | rdf:Description | rdf:li

来自 RDF 词汇表的所有语法术语, 见 4.1 RDF 命名空间和词汇表, 它们用于 RDF/XML。

6.2.4 产生式 oldTerms

rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID

这些是 RDF 词汇表中 已从语言中撤回的名称。更多信息参见 议题 rdfms-aboutEach-on-object、 议题 rdfms-abouteachprefix 以及 最后征求意见议题 timbl-01 的决议。

6.2.5 产生式 nodeElementIRIs

anyURI - ( coreSyntaxTerms | rdf:li | oldTerms )

允许在节点元素上使用的 IRI

6.2.6 产生式 propertyElementURIs

anyURI - ( coreSyntaxTerms | rdf:Description | oldTerms )

允许在属性元素上使用的 URI。

6.2.7 产生式 propertyAttributeIRIs

anyURI - ( coreSyntaxTerms | rdf:Description | rdf:li | oldTerms )

允许在属性特性上使用的 IRI

6.2.8 产生式 doc

root(document-element == RDF,
    children == list(RDF))

6.2.9 产生式 RDF

start-element(IRI == rdf:RDF,
    attributes == set())
nodeElementList
end-element()

6.2.10 产生式 nodeElementList

ws* (nodeElement ws* )*

6.2.11 产生式 nodeElement

start-element(IRI == nodeElementIRIs
    attributes == set(idAttr | nodeIdAttr | aboutAttr )?, propertyAttr*)
propertyEltList
end-element()

对于节点元素 e,某些属性的处理 必须在其他工作之前完成,例如处理子事件 或其他属性。这些属性可以按任意顺序处理:

如果 e.subject 为空, 则 e.subject := bnodeid(identifier := generated-blank-node-id())。

随后可按任意顺序执行以下操作:

6.2.12 产生式 ws

匹配 [XML11] 定义 White Space 规则 [3] S 中定义的空白的文本事件, 该规则位于 通用语法构造一节

6.2.13 产生式 propertyEltList

ws* (propertyElt ws* ) *

6.2.14 产生式 propertyElt

如果元素 e 具有 e.IRI = rdf:li,则对元素 e.parent 应用 6.4 列表 展开规则中的列表展开规则, 得到一个新的 IRI u,并令 e.IRI := u

此产生式的动作MUST在任何子匹配(resourcePropertyElt ... emptyPropertyElt)的动作之前完成。 或者,结果MUST等同于好像此动作 先执行一样,例如作为所有子匹配的第一个 动作执行。

6.2.15 产生式 resourcePropertyElt

start-element(IRI == propertyElementURIs ),
    attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?)
ws* nodeElement ws*
end-element()

对于元素 e 和唯一包含的 nodeElement n,首先 n MUST 使用产生式 nodeElement 进行处理。 然后将以下陈述添加到 e.parent.graph

如果给出了 rdf:ID 属性 a,则上述 陈述会用 i := iri(identifier := resolve(e, concat("#", a.string-value))) 进行具象化,使用 6.3 具象化 规则, 并且 e.subject := i

如果给出了 rdf:annotationrdf:annotationNodeID 属性 a 之一, 则上述陈述用于创建一个三元组项 t, 并将以下陈述添加到 e.parent.graph

   a.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#reifies> t.rdf-term .

6.2.16 产生式 literalPropertyElt

start-element(IRI == propertyElementURIs ),
    attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, datatypeAttr?))
text()
end-element()

请注意,空字面量情况在产生式 emptyPropertyElt 中定义。

对于元素 e 和文本事件 t。 Unicode 字符串 t.string-value SHOULD 采用规范化形式 C [NFC]。 如果给出了 rdf:datatype 属性 d, 则 o := typed-literal(literal-value := t.string-value, literal-datatype := d.rdf-term); 否则 o := literal(literal-value := t.string-value, literal-language := e.language, literal-direction := e.direction), 并将以下陈述添加到 e.parent.graph

如果给出了 rdf:ID 属性 a,则上述 陈述会用 i := iri(identifier := resolve(e, concat("#", a.string-value))) 进行具象化,使用 6.3 具象化 规则, 并且 e.subject := i

如果给出了 rdf:annotationrdf:annotationNodeID 属性 a 之一, 则上述陈述用于创建一个三元组项 t, 并将以下陈述添加到 e.parent.graph

   a.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#reifies> t.rdf-term .

6.2.17 产生式 parseTypeLiteralPropertyElt

本节为非规范性内容。

start-element(IRI == propertyElementURIs ),
    attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseLiteral))
literal
end-element()

对于元素 e 和作为 rdf:parseType="Literal" 内容的字面量 litlit 不会由语法数据模型映射转换为事件 (如 5. 语法数据模型中所述), 而是保持为 XML 信息项的 XML 信息集。

lit 通过以下算法转换为 XML 字面量RDF x 中的词法形式(Unicode 字符串)。 这并不规定任何实现 方法——任何给出相同结果的其他方法都可以使用。

  1. 使用 lit 构造一个 XPath 序列 [XPATH-DATAMODEL-30]。
  2. https://www.w3.org/TR/xpath-functions-30/#func-serialize [XPATH-FUNCTIONS-30] 应用于此序列,以得到 xsd:string x
  3. Unicode 字符串 x 用作 lit 的词法形式。
  4. 此 Unicode 字符串 x SHOULD 采用 NFC 规范化形式 C [NFC]

然后 o := typed-literal(literal-value := x, literal-datatype := http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral ), 并将以下陈述添加到 e.parent.graph

如果给出了 rdf:ID 属性 a,则上述 陈述会用 i := iri(identifier := resolve(e, concat("#", a.string-value))) 进行具象化,使用 6.3 具象化 规则, 并且 e.subject := i

如果给出了 rdf:annotationrdf:annotationNodeID 属性 a 之一, 则上述陈述用于创建一个三元组项 t, 并将以下陈述添加到 e.parent.graph

   a.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#reifies> t.rdf-term .

6.2.18 产生式 parseTypeResourcePropertyElt

start-element(IRI == propertyElementURIs ),
    attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseResource))
propertyEltList
end-element()

对于元素 e,其元素内容 c 可能为空。

n := bnodeid(identifier := generated-blank-node-id()).

将以下陈述添加到 e.parent.graph

如果给出了 rdf:ID 属性 a,则 上述陈述会用 i := iri(identifier := resolve(e, concat("#", a.string-value))) 进行具象化,使用 6.3 具象化 规则, 并且 e.subject := i

如果给出了 rdf:annotationrdf:annotationNodeID 属性 a 之一, 则上述陈述用于创建一个三元组项 t, 并将以下陈述添加到 e.parent.graph

   a.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#reifies> t.rdf-term .

如果元素内容 c 非空,则使用事件 n 创建一个新的事件序列,如下所示:

start-element(IRI := rdf:Description,
    subject := n,
    attributes := set())
c
end-element()

然后 使用产生式 nodeElement 处理所得序列。

6.2.19 产生式 parseTypeTriplePropertyElt

start-element(IRI == propertyElementURIs ),
    attributes == set(parseTriple))
propertyEltList
end-element()

对于元素 e,其元素内容为 c

创建一个新的事件序列,如下所示:

start-element(IRI := nodeElementIRIs,
    attributes := set())
    graph := 一个新的 RDF)
c
end-element()

然后使用产生式 nodeElement 处理所得序列。

处理节点序列后, e.parent.graph MUST 是一个包含单个三元组的 RDF

e.subject := triple(s, p, o),其中 spoe.parent.graph 中唯一三元组的 主语谓词宾语

将以下陈述添加到 e.parent.graph

6.2.20 产生式 parseTypeCollectionPropertyElt

start-element(IRI == propertyElementURIs ),
    attributes == set(idAttr?, parseCollection))
nodeElementList
end-element()

对于元素事件 e,其 nodeElementList nel 可能为空。设置 s:=list()。

对于 nel 中的每个元素事件 fn := bnodeid(identifier := generated-blank-node-id()),并将 n 附加到 s,以得到事件序列。

如果 s 非空,ns 中第一个事件标识符,并将以下陈述添加到 e.parent.graph

否则将以下陈述添加到 e.parent.graph

e.parent.subject.rdf-term e.IRI <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .

如果给出了 rdf:ID 属性 a, 则上述任一陈述会用 i := iri(identifier := resolve(e, concat("#", a.string-value))) 进行具象化,使用 6.3 具象化 规则

如果给出了 rdf:annotationrdf:annotationNodeID 属性 a 之一, 则上述陈述用于创建一个三元组项 t, 并将以下陈述添加到 e.parent.graph

   a.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#reifies> t.rdf-term .

如果 s 为空,则不执行进一步工作。

对于 s 中的每个事件 n 以及 nel 中对应的元素事件 f,将以下 陈述添加到 e.parent.graph

n.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> f.rdf-term .

对于 s 中每一对连续且重叠的事件 (n, o),将以下陈述 添加到 e.parent.graph

n.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> o.rdf-term .

如果 s 非空,ns 中最后一个事件标识符,则将以下陈述添加到 e.parent.graph

n.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .

6.2.21 产生式 parseTypeOtherPropertyElt

start-element(IRI == propertyElementURIs ),
    attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseOther))
propertyEltList
end-element()

除字符串 "Resource"、"Literal"、"Collection" 或 "Triple" 之外的所有 rdf:parseType 属性值, 都会被视为其值为 "Literal"。 此产生式进行匹配,并按产生式 parseTypeLiteralPropertyElt 已匹配的方式执行。 对于其他 rdf:parseType 值,不会生成额外三元组。

6.2.22 产生式 emptyPropertyElt

start-element(IRI == propertyElementURIs ),
    attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, ( resourceAttr | nodeIdAttr | datatypeAttr )?, propertyAttr*))
end-element()

6.2.23 产生式 idAttr

attribute(IRI == rdf:ID,
    string-value == rdf-id)

约束:constraint-id 适用于 rdf:ID 属性的值

6.2.24 产生式 nodeIdAttr

attribute(IRI == rdf:nodeID,
    string-value == rdf-id)

6.2.25 产生式 aboutAttr

attribute(IRI == rdf:about,
    string-value == string(IRI))

6.2.26 产生式 annotationAttr

attribute(IRI == rdf:annotation,
    string-value == string(IRI))

除非 rdf:version"1.2" 或更高,否则此产生式MAY被忽略。

6.2.27 产生式 annotationNodeIDAttr

attribute(IRI == rdf:annotationNodeID,
    rdf-term == bnodeid(rdf-id))

除非 rdf:version"1.2" 或更高,否则此产生式MAY被忽略。

6.2.28 产生式 propertyAttr

attribute(IRI == propertyAttributeIRIs,
    string-value == anyString)

6.2.29 产生式 resourceAttr

attribute(IRI == rdf:resource,
    string-value == string(IRI))

6.2.30 产生式 datatypeAttr

attribute(IRI == rdf:datatype,
    string-value == string(IRI))

6.2.31 产生式 parseLiteral

attribute(IRI == rdf:parseType,
    string-value == "Literal")

6.2.32 产生式 parseResource

attribute(IRI == rdf:parseType,
    string-value == "Resource")

6.2.33 产生式 parseTriple

attribute(IRI == rdf:parseType,
    string-value == "Triple")

6.2.34 产生式 parseCollection

attribute(IRI == rdf:parseType,
    string-value == "Collection")

6.2.35 产生式 parseOther

attribute(IRI == rdf:parseType,
    string-value == anyString - ("Resource" | "Literal" | "Collection") )

6.2.36 产生式 IRI

一个 IRI

6.2.37 产生式 literal

根据 XML 定义 Content of Elements 规则 [43] content 允许的任何 XML 元素内容。 位于 3.1 开始标签、 结束标签和空元素标签一节

所得事件的 string-value 在 6.2.17 产生式 parseTypeLiteralPropertyElt中讨论。

6.2.38 产生式 rdf-id

一个属性 ·string-value·, 匹配任意合法的 [XML-NAMES] 标记 NCName

6.3 具象化规则

对于给定的 IRI 事件 r 和 具有项 spo 的陈述, 它对应于以下 N-Triples:

s p o .

将以下陈述添加到图:

r.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#subject> s .
r.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#predicate> p .
r.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#object> o .
r.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Statement> .

6.4 列表展开规则

对于给定元素 e,创建一个新的 IRI u := concat("http://www.w3.org/1999/02/22-rdf-syntax-ns#_", e.li-counter), 将 e.li-counter 属性加 1,并返回 u

7. RDF 图序列化为 RDF/XML

有些 RDF 如 [RDF12-CONCEPTS] 中定义,不能 序列化为 RDF/XML。这些图:

使用无法转换为 XML 命名空间限定名称的属性名。
XML 命名空间限定名称 (QName) 对合法字符有限制,因此并非所有属性 URI 都可以表示为这些名称。 建议 RDF 序列化器的实现者,为了 将 URI 拆分为命名空间名称本地 名称,在最后一个 XML 非 NCName 字符之后进行拆分,并确保名称的第一个字符是 Letter 或 "_"。 如果 URI 以 非 NCName 字符结尾,则抛出“此图不能序列化为 RDF/XML” 异常或错误。
将不适当的保留名称用作属性
例如,某个属性具有与任何 syntaxTerms 产生式相同的 URI。

实现说明(资料性): 当一个 RDF被序列化为 RDF/XML 并具有 XML Schema 数据类型(XSD)时,它SHOULD写成不需要 空白处理的形式。RDFRDF/XML 不要求支持 XSD, 因此这是可选的。

8. RDF/XML 与 SVG 配合使用

本节为非规范性内容。

存在一种标准化方法,用于将 RDF 兼容的 元数据与 SVG 关联起来——即专为此目的显式 设计的 metadata 元素,其定义见 第 21 节 元数据 ,位于 可缩放矢量图形 (SVG) 1.0 规范 [SVG10] 和 可缩放矢量图形 (SVG) 1.1(第二版) [SVG11]。

本文档包含两个 SVG 示例图,其中在 metadata 元素内 嵌入了这种 RDF/XML: 图 1图 2

A. 致谢

本节为非规范性内容。

A.1 对原始规范的 致谢

本节为非规范性内容。

本文档是 RDF Core 工作组长期审议的成果,其成员包括:Art Barstow (W3C) Dave Beckett (ILRT), Dan Brickley (W3C/ILRT), Dan Connolly (W3C), Jeremy Carroll (Hewlett Packard), Ron Daniel (Interwoven Inc), Bill dehOra (InterX), Jos De Roo (AGFA), Jan Grant (ILRT), Graham Klyne (Clearswift and Nine by Nine), Frank Manola (MITRE Corporation), Brian McBride (Hewlett Packard), Eric Miller (W3C), Stephen Petschulat (IBM), Patrick Stickler (Nokia), Aaron Swartz (HWG), Mike Dean (BBN Technologies / Verizon), R. V. Guha (Alpiri Inc), Pat Hayes (IHMC), Sergey Melnik (Stanford University), Martyn Horner (Profium Ltd)。

本规范还借鉴了早期的 RDF Model and Syntax 文档,该文档由 Ora Lassilla 和 Ralph Swick 编辑,以及由 Dan Brickley 和 R. V. Guha 编辑的 RDF Schema。 为这项早期工作作出贡献的 RDFRDF Schema 工作 组成员包括: Nick Arnett (Verity), Tim Berners-Lee (W3C), Tim Bray (Textuality), Dan Brickley (ILRT / University of Bristol), Walter Chang (Adobe), Sailesh Chutani (Oracle), Dan Connolly (W3C), Ron Daniel (DATAFUSION), Charles Frankston (Microsoft), Patrick Gannon (CommerceNet), RV Guha (Epinions, previously of Netscape Communications), Tom Hill (Apple Computer), Arthur van Hoff (Marimba), Renato Iannella (DSTC), Sandeep Jain (Oracle), Kevin Jones, (InterMind), Emiko Kezuka (Digital Vision Laboratories), Joe Lapp (webMethods Inc.), Ora Lassila (Nokia Research Center), Andrew Layman (Microsoft), Ralph LeVan (OCLC), John McCarthy (Lawrence Berkeley National Laboratory), Chris McConnell (Microsoft), Murray Maloney (Grif), Michael Mealling (Network Solutions), Norbert Mikula (DataChannel), Eric Miller (OCLC), Jim Miller (W3C, emeritus), Frank Olken (Lawrence Berkeley National Laboratory), Jean Paoli (Microsoft), Sri Raghavan (Digital/Compaq), Lisa Rein (webMethods Inc.), Paul Resnick (University of Michigan), Bill Roberts (KnowledgeCite), Tsuyoshi Sakata (Digital Vision Laboratories), Bob Schloss (IBM), Leon Shklar (Pencom Web Works), David Singer (IBM), Wei (William) Song (SISU), Neel Sundaresan (IBM), Ralph Swick (W3C), Naohiko Uramoto (IBM), Charles Wicksteed (Reuters Ltd.), Misha Wolf (Reuters Ltd.), Lauren Wood (SoftQuad)。

A.2 RDF 1.1 的致谢

本节为非规范性内容。

Gavin Carothers 为 产生式 parseTypeLiteralPropertyElt 提供了 RDF 1.1 更新。Ivan Herman 提供了宝贵 意见并重做了图 1 和图 2。

本规范是 RDFcore 工作组以及 RDFRDF Schema 工作组成员长期审议的成果。

以下人员为本文档作出了宝贵贡献:

A.3 RDF 1.2 的致谢

本节为非规范性内容。

除编辑之外,以下人员也为本规范作出了贡献: Andy Seaborne, Denis Ah-Kang, Dominik Tomaszuk, Gregory Todd Williams, John Walker, Niklas Lindström, Peter F. Patel-Schneider, Pierre-Antoine Champin, Ted Thibodeau Jr, and Thomas Tanon

RDF & SPARQL 工作组的成员 包括
James Anderson, Dörthe Arndt, Jerven Bolleman, Erich Bremer, Pierre-Antoine Champin, Souripriya Das, Enrico Franconi, Adrian Gschwend, Olaf Hartig, Gregg Kellogg†, Ora Lassila, Niklas Lindström, Thomas Lörtsch, Peter Patel-Schneider, Dave Raggett, Felix Sasaki, Andy Seaborne, Ruben Taelman, Thomas Pellissier Tanon, Ted Thibodeau Jr, Dominik Tomaszuk, Gregory Williams, William Van Woensel, and Antoine Zimmermann
† Gregg Kellogg 于 2025 年 9 月去世。谨此感谢他对 RDF 以及相关标准更广泛生态系统作出的巨大贡献。

编辑注

是否鸣谢任务组成员?贡献者列表并不容易找到。

B. RDF 1.1 和 RDF 1.2 之间的变更

本节为非规范性内容。

C. 语法模式

本节为非规范性内容。

本附录包含用于验证 RDF/XML 形式的 XML 模式。 这些是仅供参考的示例模式,并非 本规范的一部分。

C.1 RELAX NG 紧凑模式

本节为非规范性内容。

这是一个用于 RDF/XML 的 RELAX NG Compact 中的示例 模式(为便于阅读)。 应用程序也可以使用 RELAX NG XML 版本。 这些格式在 信息 技术——文档模式定义语言(DSDL)——第 2 部分:基于正则语法的 验证——RELAX NG [RELAXNG-SCHEMA] 中描述。

RNGC 模式已更新,以尝试匹配该语法,但 这尚未经过检查,也未用于验证 RDF/XML。

#
# RDF/XML 语法的 RELAX NG Compact Schema
#
# 此模式仅供参考,且为非规范性内容
#
# 它基于 James Clark 最初编写的一个模式,见
# https://lists.w3.org/Archives/Public/www-rdf-comments/2001JulSep/0248.html
# 并随后根据后续变更进行了更新。
#

namespace local = ""
namespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
namespace its = "http://www.w3.org/2005/11/its"

start = doc

# 我似乎无法在 RNGC 中做到这一点,因此它们以内联方式展开

# coreSyntaxTerms = rdf:RDF | rdf:ID | rdf:annotation | rdf:annotationNodeID | rdf:about | rdf:parseType | rdf:resource | rdf:nodeID | rdf:datatype | rdf:version
# syntaxTerms = coreSyntaxTerms | rdf:Description | rdf:li
# oldTerms    = rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID
# nodeElementIRIs       = * - ( coreSyntaxTerms | rdf:li | oldTerms )
# propertyElementURIs   = * - ( coreSyntaxTerms | rdf:Description | oldTerms )
# propertyAttributeIRIs = * - ( coreSyntaxTerms | rdf:Description | rdf:li | oldTerms )

# 还需要允许所有属性元素产生式上出现 rdf:li
# 因为我们无法在 relaxng 中捕获 rdf:li 到 rdf_<n> 的重写

# 需要显式添加这些
xmllang = attribute xml:lang { text }
xmlbase = attribute xml:base { text }
# 并禁止其他所有 xml:* 属性和元素

doc =
  RDF | nodeElement

RDF =
  element rdf:RDF {
     xmllang?, xmlbase?, nodeElementList
}

nodeElementList =
  nodeElement*

  # 应类似于:
  #  ws* , (  nodeElement , ws* )*
  # 但 RELAXNG 默认会这样做,忽略分隔标签的空白。

nodeElement =
  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
                rdf:resource | rdf:nodeID | rdf:datatype | rdf:li |
                rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID ) {
      (idAttr | nodeIdAttr | aboutAttr )?, xmllang?, xmlbase?, propertyAttr*, propertyEltList
  }

  # 不可能在 RELAX NG 中表达“且不是
  # rdf: 命名空间中以下划线开头的项”。

ws =
  " "

  # 在此 RELAX NG 模式中未使用;但应是以下位置定义的任意合法 XML
  # 空白:https://www.w3.org/TR/2000/REC-xml-20001006#NT-S


propertyEltList =
  propertyElt*

  # 应类似于:
  #  ws* , ( propertyElt , ws* )*
  # 但 RELAXNG 默认会这样做,忽略分隔标签的空白。

propertyElt =
  resourcePropertyElt |
  literalPropertyElt |
  parseTypeLiteralPropertyElt |
  parseTypeResourcePropertyElt |
  parseTypeTriplePropertyElt |
  parseTypeCollectionPropertyElt |
  parseTypeOtherPropertyElt |
  emptyPropertyElt

resourcePropertyElt =
  element * - ( local:* | rdf:RDF | rdf:ID |
                rdf:annotation | rdf:annotationNodeID |
                rdf:about | rdf:parseType |
                rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
                its:dir | its:version |
                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
                xml:* ) {
      idAttr?, (annotationAttr | annotationNodeIDAttr)?, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, nodeElement
  }

literalPropertyElt =
  element * - ( local:* | rdf:RDF | rdf:ID |
                rdf:annotation | rdf:annotationNodeID |
                rdf:about | rdf:parseType |
                rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
                its:dir | its:version |
                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
                xml:* ) {
      idAttr? , (annotationAttr | annotationNodeIDAttr)?, datatypeAttr?, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, text
  }

parseTypeLiteralPropertyElt =
  element * - ( local:* | rdf:RDF | rdf:ID |
                rdf:annotation | rdf:annotationNodeID |
                rdf:about | rdf:parseType |
                rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
                its:dir | its:version |
                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
                xml:* ) {
      idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseLiteral, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, literal
  }

parseTypeResourcePropertyElt =
  element * - ( local:* | rdf:RDF | rdf:ID |
                rdf:annotation | rdf:annotationNodeID |
                rdf:about | rdf:parseType |
                rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
                its:dir | its:version |
                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
                xml:* ) {
      idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseResource, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, propertyEltList
  }

parseTypeTriplePropertyElt =
  element * - ( local:* | rdf:RDF | rdf:about | rdf:parseType |
                rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
                its:dir | its:version |
                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
                xml:* ) {
      idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseResource, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, propertyEltList
  }

parseTypeCollectionPropertyElt =
  element * - ( local:* | rdf:RDF | rdf:ID |
                rdf:annotation | rdf:annotationNodeID |
                rdf:about | rdf:parseType |
                rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
                its:dir | its:version |
                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
                xml:* ) {
      idAttr?, (annotationAttr | annotationNodeIDAttr)?, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, parseCollection, nodeElementList
  }

parseTypeOtherPropertyElt =
  element * - ( local:* | rdf:RDF | rdf:ID |
                rdf:annotation | rdf:annotationNodeID |
                rdf:about | rdf:parseType |
                rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
                its:dir | its:version |
                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
                xml:* ) {
      idAttr?, (annotationAttr | annotationNodeIDAttr)?, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, parseOther, any
  }

emptyPropertyElt =
   element * - ( local:* | rdf:RDF | rdf:ID |
                 rdf:annotation | rdf:annotationNodeID |
                 rdf:about | rdf:parseType |
                 rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
                 its:dir | its:version |
                 rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
                 xml:* ) {
       idAttr?, (resourceAttr | nodeIdAttr | datatypeAttr )?, xmllang?,
       xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, propertyAttr*
   }

idAttr =
  attribute rdf:ID {
      IDsymbol
  }

nodeIdAttr =
  attribute rdf:nodeID {
      IDsymbol
  }

aboutAttr =
  attribute rdf:about {
      IRI
  }

propertyAttr =
  attribute * - ( local:* | rdf:RDF | rdf:ID |
                  rdf:annotation | rdf:annotationNodeID |
                  rdf:about | rdf:parseType |
                  rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
                  rdf:li | its:dir | | its:version
                  rdf:Description | rdf:aboutEach |
                  rdf:aboutEachPrefix | rdf:bagID |
                  xml:* ) {
      string
  }

resourceAttr =
  attribute rdf:resource {
      IRI
  }

datatypeAttr =
  attribute rdf:datatype {
      IRI
  }

parseLiteral =
  attribute rdf:parseType {
      "Literal"
  }

parseResource =
  attribute rdf:parseType {
      "Resource"
  }

parseTriple =
  attribute rdf:parseType {
      "Triple"
  }

parseCollection =
  attribute rdf:parseType {
      "Collection"
  }

parseOther =
  attribute rdf:parseType {
      text
  }

versionAttr =
  attribute rdf:version {
      text
  }

dirAttr =
  attribute its:dir {
      text
  }

itsVersionAttr =
  attribute its:version {
      text
  }

IRI =
  string

literal =
  any

IDsymbol =
  xsd:NMTOKEN

any =
  mixed { element * { attribute * { text }*, any }* }

D. 索引

D.1 由本 规范定义的术语

D.2 通过引用定义的术语

E. 参考文献

E.1 规范性参考文献

[BCP47]
用于标识语言的标签. A. Phillips, Ed.; M. Davis, Ed. IETF. 2009 年 9 月。最佳当前实践。URL: https://www.rfc-editor.org/rfc/rfc5646
[NFC]
Web NFC API. Luc Yriarte; Samuel Ortiz; Don Coleman. W3C. 2015 年 6 月 16 日。W3C 工作组说明。URL: https://www.w3.org/TR/nfc/
[RDF-SYNTAX-GRAMMAR-19990222]
资源描述框架 (RDF) 模型与语法规范. Ora Lassila. W3C. 1999 年 2 月 22 日。W3C 推荐标准。URL: https://www.w3.org/TR/1999/REC-rdf-syntax-19990222/
[RDF12-CONCEPTS]
RDF 1.2 概念与抽象数据 模型. Andy Seaborne; Gregg Kellogg; Olaf Hartig; Pierre-Antoine Champin. W3C. 2026 年 4 月 7 日。W3C 候选推荐标准。URL: https://www.w3.org/TR/rdf12-concepts/
[RDF12-N-TRIPLES]
RDF 1.2 N-Triples. Gregg Kellogg; Dominik Tomaszuk. W3C. 2026 年 5 月 15 日。W3C 工作草案。URL: https://www.w3.org/TR/rdf12-n-triples/
[RFC2119]
用于在 RFC 中指示 要求级别的关键词. S. Bradner. IETF. 1997 年 3 月。最佳当前实践。URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC3870]
application/rdf+xml 媒体类型 注册. A. Swartz. IETF. 2004 年 9 月。资料性。URL: https://www.rfc-editor.org/rfc/rfc3870
[RFC3986]
统一资源标识符(URI):通用 语法. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005 年 1 月。互联网 标准。URL: https://www.rfc-editor.org/rfc/rfc3986
[RFC8174]
RFC 2119 关键词中大写与小写的歧义. B. Leiba. IETF. 2017 年 5 月。最佳当前实践。URL: https://www.rfc-editor.org/rfc/rfc8174
[SAX]
SAX – XML 的简单 API. Steve Cornish. 1999 年 10 月。URL: https://accu.org/journals/overload/7/34/cornish_515/
[UNICODE]
Unicode 标准. Unicode Consortium. URL: https://www.unicode.org/versions/latest/
[XML-INFOSET]
XML 信息集(第二版). John Cowan; Richard Tobin. W3C. 2004 年 2 月 4 日。W3C 推荐标准。URL: https://www.w3.org/TR/xml-infoset/
[XML-NAMES]
XML 1.0 中的命名空间(第三版). Tim Bray; Dave Hollander; Andrew Layman; Richard Tobin; Henry Thompson et al. W3C. 2009 年 12 月 8 日。 W3C 推荐标准。URL: https://www.w3.org/TR/xml-names/
[XML11]
可扩展标记语言(XML)1.1(第二 版). Tim Bray; Jean Paoli; Michael Sperberg-McQueen; Eve Maler; François Yergeau; John Cowan et al. W3C. 2006 年 8 月 16 日。W3C 推荐标准。URL: https://www.w3.org/TR/xml11/
[XMLBASE]
XML Base(第二版). Jonathan Marsh; Richard Tobin. W3C. 2009 年 1 月 28 日。W3C 推荐标准。URL: https://www.w3.org/TR/xmlbase/
[XMLSCHEMA11-2]
W3C XML Schema 定义语言(XSD)1.1 第 2 部分:数据类型. David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron et al. W3C. 2012 年 4 月 5 日。W3C 推荐标准。URL: https://www.w3.org/TR/xmlschema11-2/
[XPATH]
XML 路径语言(XPath)版本 1.0. James Clark; Steven DeRose. W3C. 1999 年 11 月 16 日。W3C 推荐标准。URL: https://www.w3.org/TR/xpath-10/

E.2 资料性参考文献

[CHARMOD]
万维网字符模型 1.0: 基础. Martin Dürst; François Yergeau; Richard Ishida; Misha Wolf; Tex Texin et al. W3C. 2005 年 2 月 15 日。W3C 推荐标准。URL: https://www.w3.org/TR/charmod/
[ITS20]
国际化标签集(ITS)版本 2.0. David Filip; Shaun McCance; David Lewis; Christian Lieske; Arle Lommel; Jirka Kosek; Felix Sasaki; Yves Savourel. W3C. 2013 年 10 月 29 日。W3C 推荐标准。URL: https://www.w3.org/TR/its20/
[JSON-LD11]
JSON-LD 1.1. Gregg Kellogg; Pierre-Antoine Champin; Dave Longley. W3C. 2020 年 7 月 16 日。W3C 推荐标准。URL: https://www.w3.org/TR/json-ld11/
[RDF-SCHEMA]
RDF Schema 1.1. Dan Brickley; Ramanathan Guha. W3C. 2014 年 2 月 25 日。W3C 推荐标准。URL: https://www.w3.org/TR/rdf-schema/
[rdf-syntax-grammar]
RDF 1.1 XML 语法. Fabien Gandon; Guus Schreiber. W3C. 2014 年 2 月 25 日。W3C 推荐标准。URL: https://www.w3.org/TR/rdf-syntax-grammar/
[RDF12-INTEROP]
RDF 1.2 互操作性. Pierre-Antoine Champin. W3C. W3C 编辑草案。URL: https://w3c.github.io/rdf-interop/spec/
[RDF12-N-QUADS]
RDF 1.2 N-Quads. Gregg Kellogg; Dominik Tomaszuk. W3C. 2026 年 5 月 28 日。W3C 工作草案。URL: https://www.w3.org/TR/rdf12-n-quads/
[RDF12-NEW]
RDF 1.2 新增内容. The W3C RDF & SPARQL Working Group. W3C. W3C 编辑草案。URL: https://w3c.github.io/rdf-new/spec/
[RDF12-PRIMER]
RDF 1.2 入门. Pierre-Antoine Champin; Niklas Lindström. W3C. 2026 年 4 月 16 日。DNOTE。URL: https://www.w3.org/TR/rdf12-primer/
[RDF12-SCHEMA]
RDF 1.2 Schema. Dominik Tomaszuk. W3C. 2026 年 3 月 28 日。W3C 工作草案。URL: https://www.w3.org/TR/rdf12-schema/
[RDF12-SEMANTICS]
RDF 1.2 语义. Peter Patel-Schneider; Enrico Franconi; Dörthe Arndt. W3C. 2026 年 4 月 7 日。W3C 候选推荐标准。 URL: https://www.w3.org/TR/rdf12-semantics/
[RDF12-TRIG]
RDF 1.2 TriG. Gregg Kellogg; Dominik Tomaszuk. W3C. 2026 年 5 月 28 日。W3C 工作草案。URL: https://www.w3.org/TR/rdf12-trig/
[RDF12-TURTLE]
RDF 1.2 Turtle. Gregg Kellogg; Andy Seaborne; Dominik Tomaszuk. W3C. 2026 年 5 月 28 日。W3C 工作草案。URL: https://www.w3.org/TR/rdf12-turtle/
[RDFA-PRIMER]
RDFa 1.1 入门 - 第三版. Ivan Herman; Ben Adida; Manu Sporny; Mark Birbeck. W3C. 2015 年 3 月 17 日。W3C 工作组说明。URL: https://www.w3.org/TR/rdfa-primer/
[RELAXNG-SCHEMA]
信息 技术——文档模式定义语言(DSDL)——第 2 部分:基于正则语法的 验证——RELAX NG. ISO/IEC. 2008. URL: http://standards.iso.org/ittf/PubliclyAvailableStandards/c052348_ISO_IEC_19757-2_2008(E).zip
[SPARQL12-CONCEPTS]
SPARQL 1.2 概念. The W3C RDF & SPARQL Working Group. W3C. W3C 编辑草案。URL: https://w3c.github.io/sparql-concepts/spec/
[SPARQL12-ENTAILMENT]
SPARQL 1.2 蕴涵制度. Peter Patel-Schneider. W3C. 2026 年 4 月 9 日。W3C 工作草案。URL: https://www.w3.org/TR/sparql12-entailment/
[SPARQL12-FEDERATED-QUERY]
SPARQL 1.2 联合 查询. Ruben Taelman; Gregory Williams. W3C. 2026 年 4 月 23 日。W3C 工作草案。 URL: https://www.w3.org/TR/sparql12-federated-query/
[SPARQL12-GRAPH-STORE-PROTOCOL]
SPARQL 1.2 图存储 协议. Andy Seaborne; Thomas Pellissier Tanon. W3C. 2024 年 12 月 19 日。W3C 工作草案。URL: https://www.w3.org/TR/sparql12-graph-store-protocol/
[SPARQL12-NEW]
SPARQL 1.2 新增内容. The W3C RDF & SPARQL Working Group. W3C. W3C 编辑草案。URL: https://w3c.github.io/sparql-new/spec/
[SPARQL12-PROTOCOL]
SPARQL 1.2 协议. Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 4 月 26 日。W3C 工作 草案。URL: https://www.w3.org/TR/sparql12-protocol/
[SPARQL12-QUERY]
SPARQL 1.2 查询语言. Olaf Hartig; Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 5 月 28 日。 W3C 工作草案。URL: https://www.w3.org/TR/sparql12-query/
[SPARQL12-RESULTS-CSV-TSV]
SPARQL 1.2 查询结果 CSV 和 TSV 格式. Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 3 月 28 日。 W3C 工作草案。URL: https://www.w3.org/TR/sparql12-results-csv-tsv/
[SPARQL12-RESULTS-JSON]
SPARQL 1.2 查询结果 JSON 格式. Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 3 月 28 日。W3C 工作草案。URL: https://www.w3.org/TR/sparql12-results-json/
[SPARQL12-RESULTS-XML]
SPARQL 1.2 查询结果 XML 格式. Ruben Taelman; Dominik Tomaszuk; Thomas Pellissier Tanon. W3C. 2024 年 12 月 27 日。W3C 工作草案。URL: https://www.w3.org/TR/sparql12-results-xml/
[SPARQL12-SERVICE-DESCRIPTION]
SPARQL 1.2 服务 描述. Ruben Taelman; Gregory Williams. W3C. 2026 年 4 月 23 日。W3C 工作 草案。URL: https://www.w3.org/TR/sparql12-service-description/
[SPARQL12-UPDATE]
SPARQL 1.2 更新. Ruben Taelman; Andy Seaborne; Thomas Pellissier Tanon. W3C. 2026 年 4 月 23 日。W3C 工作草案。URL: https://www.w3.org/TR/sparql12-update/
[STRIPEDRDF]
RDF:理解条纹式 RDF/XML 语法. W3C. 2001. 团队提交。URL: http://www.w3.org/2001/10/stripes/
[SVG10]
可缩放矢量图形(SVG)1.0 规范. Jon Ferraiolo. W3C. 2001 年 9 月 4 日。W3C 推荐标准。URL: https://www.w3.org/TR/SVG/
[SVG11]
可缩放矢量图形(SVG)1.1(第二 版). Erik Dahlström; Patrick Dengler; Anthony Grasso; Chris Lilley; Cameron McCormack; Doug Schepers; Jonathan Watt; Jon Ferraiolo; Jun Fujisawa; Dean Jackson et al. W3C. 2011 年 8 月 16 日。W3C 推荐标准。URL: https://www.w3.org/TR/SVG11/
[XPATH-DATAMODEL-30]
XQuery 和 XPath 数据模型 3.0. Norman Walsh; Anders Berglund; John Snelson. W3C. 2014 年 4 月 8 日。W3C 推荐标准。URL: https://www.w3.org/TR/xpath-datamodel-30/
[XPATH-FUNCTIONS-30]
XPath 和 XQuery 函数与运算符 3.0. Michael Kay. W3C. 2014 年 4 月 8 日。W3C 推荐标准。URL: https://www.w3.org/TR/xpath-functions-30/