关于RDFa Processing的翻译,其实已经很早就翻译了一遍,但是总觉得自己的翻译不够给力,有过一些修改,考虑到缺乏一些实例的直观性,后期打算整理一份详细点的文档,这里先把译文贴一下吧
解析一个文档的RDFa triples是从文档对象开始,然后按文档顺序依次访问它的每一个子节点,逐一应用解析规则,通过递归循环进行至其子孙元素(注意:在某些环境下,起始的位置可能不是文档根节点而是文档本身。之所以这样定义主要是由于某些环境下,重要信息是在document对象上展现而不是根节点)
随着进程的执行,会有许多依照规则产生的triples,同时由于解析环境的迁移而进行到其后辈元素(这里要注意的是,在RDFa 1.1的规范中并没有说明应该如何衍生triples,或者解析程序怎样产生更多的triples。但是有一点可以证实的是,一个RDFa处理器至少需要像本节内容一样来应用规则,产生一个单一的RDF图表。正如RDFa processor conformance中讲述的,任何额外产生的triples都不能出现在默认的RDF图表中)
解析环境(Evaluating Text)——在进程进行时,规则都会依次适用于相关的解析语境。在进程刚开始的时候,会初始化一个环境,该环境有以下几部分:
Base: 这通常是被解析的文档的URL,但也可能是一些由其他机制所设置的URL,例如XHTML的base元素。Base的重要性在于它提供了建立相对URL的基础,以便相对路径可以被解析(说明一点,RDF图表都是绝对地址)
parent subject: 它的初始值和base的初始值一样,但是在解析程序进行的过程中会发生变化
parent object: 有时候,一个语句的object可能会成为另一个嵌套语句的subject, 而parent object这个属性通常可以传递这个值。需要注意的是,这个值可能是一个空白节点bnode, 因为某些情况下会有许多嵌套的语句集合在一个空白节点bnode上。这就意味着bnode必须设置在容器语句上并且传递下去,即parent object所做的事情
A list of current URI mappings 一个当前作用范围的URI映射列表
A list of incomplete Triples 一个 未完成的triples 的列表:关于未完成的triples,详见hanging rel(ww)
language 请注意没有默认的语言
Term mappings: 一系列的terms以及相关联的URIs
Default voculabory: 当term使用的时候作为前缀URI的一个值,这里没有指明默认的词汇。Host languages 可能有一个初始化设置
在处理期间,新的解析过程会递归到每个子元素。下面阐述的规则会决定语境中的items值。此外,一些规则会结合由解析环境所处元素提供的信息创建一些triples。在处理期间,以下一些局部作用值是需要的:
一个初始化为空的URI映射列表,即URI映射本地列表(local list of URI mappings)
一个初始化为空的问完成triples 列表,即未完成triples本地列表(local list of incomplete triples)
一个初始化为空的语言值(language)
一个递归标志位(recurse flag)——解析程序一般通过递归循环来遍历整个元素树。但是,如果作者声明一些分支应该按照XML文本来进行处理,那么处理程序就不会对该分支进行解析,而这通过设置递归标志为false就会有这个效果。
跳过元素的标志(skip element flag)——它声明当前元素是否可以直接跳过,因为该元素未使用相关的RDFa属性。需注意的是,其子孙元素依旧会被解析。
一个新的subject值(new subject)
一个表示当前object literal 的值,创建有文本object的triples时使用的literal
一个表示当前object resource 的值,创建有resouce的triples时使用的resource
一个term及其相关联的URIs列表(local term mappings)
一个本地默认词汇,在使用一个term时作为一个前缀映射到URI (local default vocabulary)
链锁作用(Chaining)——之前一片文章提到过google对于语义支持的书写范例,在那里我们可以清楚的看到这样的写法:
<div xmlns:v="http://rdf.data-vocabulary.org/#" typeof="v:Person">
My name is <span property="v:name">Bob Smith</span>,
but people call me <span property="v:nickname">Smithy</span>.
Here is my homepage:
<a href="http://www.example.com" rel="v:url">www.example.com</a>.
I live in
<span rel="v:address">
<span typeof="v:Address">
<span property="v:locality">Albuquerque</span>,
<span property="v:region">NM</span>
</span>
</span>
and work as an <span property="v:title">engineer</span>
at <span property="v:affiliation">ACME Corp</span>.
My friends:
<a href="http://darryl-blog.example.com" rel="v:friend">Darryl</a>,
<a href="http://edna-blog.example.com" rel="v:friend">Edna</a>
</div>
很简单的一段代码,但是由于大量无用的span进行着嵌套,这不是我们所期望的,实际上RDFa是可以解决这些的,解决方式就是这里的链锁作用chaining。在RDFa中,链锁是RDFa的一个特性,它使得RDF语句可以链接在一起的同时减少一些不必要的标签重复。具体实例,可以参看RDFa 1.1文档中的chaining部分。但是,由于由于google未采用这点,因而其书写方面显得相当之臃肿,而这也不是我们所期望的方式
CURIE和URI 处理——RDFa本质上是传输RDF的一种方式,所以其核思想就是resource和它的URI表现。RDF处理的是完整的URIs,而在RDFa转化为triples的时候,会通过一些已经定义的算法,根据base URIs将相对URIs解析为完整的URIs. 代表RDFa属性值的URIs有三种格式: URI,SafeCURIE or CURIE or URI, TERM or CURIE or AbsURI. 这些通过进程处理后都回映射到相应的URIs.对这三种属性值的操作如下
URI 内容为一个URI时,直接使用该URI
SafeCURIE or CURIE or URI
当值被尖括号包围时,尖括号内的内容会被作为CURIE来处理;一旦该值不是有效的CURIE,那么该值就会被忽略
没有被尖括号包围时,该值会被作为CURIE处理,如果是有效的CURIE,将使用计算出来的URI,若不是,则作为URI来处理
TERM or CURIE or URI
如果属性值为一个命名空间,那么它会被作为一个项目(General Use of Terms in Attributes)来处理。注意这一步可能意味着该值会被忽略.
如果值为一个空的CURIE,那么会使用resulting URI
如果值为一个绝对URI,那么直接使用该值
否则,忽略该值
(注意的一点是,可能一个属性的所有值都会被忽略,如果这种情况出现,该属性直接视作空的)
常用CURIE方式: 通过XML的命名空间的方式xmlns来进行URI的缩写,作为使用者,可以从任意位置将URI进行断开,但是必须从左侧开始; 由于复用性比较大的是一些管理terms的书库,例如,像dbpedia就包括了许多resources的列表,用dbpedia就比使用自己创建的要更高效,如下
<div prefix="dbr: http://dbpedia.org/resource/">
<div about="dbr:Albert_Einstein">
...
</div>
<div about="dbr:Baruch_Spinoza">
...
</div>
</div>
上面说了处理方式,这里简单说下在属性中常用的CURIE使用方式,尽管很多属性可以使用CURIE,但是解析却不同:
1) 一个属性可能允许多个CURIEs和URI混合的属性值,这种情况下,任何值都不是CURIE,会被作为一个URI来处理
2) 属性值如果被方括号包裹,那么方括号内的内容按照CURIE语法来处理,如果该内容不是CURIE,那么直接无视之,即不产生RDF意义(此处需要注意的是typeof,即使是空的,也是一个CURIE)
例如,about属性可以接CURIE/ URI,about=http://dbpedia.org/resource/Albert_Einstein亦可写作about=”dbr:Albert_Einstein” 、或者about=”[Albert_Einstein]”形式的safe CURIE,需要注意的是about=”Albert_Einstein”也会设置一个subject,尽管不是一个CURIE,但是是一个有效的相对URI
Prefix的作用范围——prefix定义的元素及其子孙元素,例如
<div prefix=”dbr: http://dbpedia.org/resource/>
<div about=”dbr:Albert_Einstain”>…</div>
</div>所作用的范围就与
<div prefix=”dbr: http://someotherdbpedia.org/resource/>
<div about=”dbr:Albert_Einstain”>…</div>
</div>的作用范围不一样
TERM在属性中的应用——有些RDFa属性允许term作为其值,定义这种使用语法如下:
Term := NCName
当一个RDFa属性可以带term属性值时,其值的解析与上述term介绍的解析一样,遵循以下逻辑:
如果term是一个本地term映射,使用相关联的URI;
如果有一个本地默认词汇,URI按照该规则进行解析;
如果没有本地默认词汇且term没有相关联的URI,那么就直接忽略掉该term
注意:该规则的一个衍生是,如果一个属性具有TERM/CURIE/URI的数据类型,其值符合term介绍中的但是没有一个本地默认词汇,那么该term会被忽略掉