为什么 W3C RDF 验证器不使用完整名称空间替换 URI?

Why doesn't the W3C RDF validator replace the URI using the full namespace?

我尝试使用 W3C RDF Validator 在线验证一个非常简单的手动编写的 RDF。令我惊讶的是,它正确地解析了来自 rdf 命名空间的 URI,但不是来自不同的命名空间(也来自 W3C)。为什么会这样?

我们以

为例
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:org="http://www.w3.org/ns/org#" >
  <rdf:Description rdf:about="https://stackexchange.com/">
    <rdf:type rdf:resource="org:Organization"/>
  </rdf:Description>
</rdf:RDF>

这会验证并解析为

如您所见,谓词 (rdf:type) 得到很好的扩展,并且可以单击它。对象 (org:Organization) 根本没有展开,而且当我尝试单击 link 时,它确实将“org:Organization”发送到浏览器,从而产生错误。但是命名空间org已经像rdf命名空间一样定义了,如果我手动访问http://www.w3.org/ns/org#Organization,我得到一个Turtle文档

所以,我的问题是:为什么不把 http://www.w3.org/ns/org#Organization 放在对象中?我应该更改什么以使解析器正确执行此操作?

解析器 实际上做得很好。问题是您试图在属性值(rdf:resource 属性的值)中使用 XML 名称空间前缀,而不是作为实际 XML [=28 上的限定符=] 名称本身(例如 rdf:type,这是一个 XML 元素名称)。

换句话说:您不能在字符串值中使用 XML 命名空间。因此,解析器不会尝试“扩展”命名空间,而只是将文字字符串值解析为 URI,并且由于 org:Organization 实际上是一个语法上合法的 URI,所以它会产生这种结果。

要获得所需的输出,您必须写出完整的 IRI 字符串,如下所示:

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:org="http://www.w3.org/ns/org#" >
  <rdf:Description rdf:about="https://stackexchange.com/">
    <rdf:type rdf:resource="http://www.w3.org/ns/org#Organization"/>
  </rdf:Description>
</rdf:RDF>

或者如果你愿意,你可以使用缩写的 RDF/XML 语法,得到这个:

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:org="http://www.w3.org/ns/org#" >
  <org:Organization rdf:about="https://stackexchange.com/" />
</rdf:RDF>

顺便说一句:RDF/XML 是一个众所周知的棘手语法。 RDF 还有其他更简单的语法格式,例如 Turtle。就说吧。