我如何使用schema.org将一个人(不重复自己)标记为组织成员和书籍作者?

时间:2014-01-23 17:41:17

标签: html5 microdata schema.org

我正在尝试将schema.org标记添加到律师事务所的网站(itemtype = schema.org / Attorney)。该网站包含一个专门针对公司中每位律师的页面(itemtype = schema.org / Person)。这些个人资料页面包含已发布作品的列表(例如itemtype = schema.org / Book)。我想指明该人是该组织的成员和该书的作者。我正在努力实现这一目标。

以下是我正在使用的一些代码:

<body itemscope itemtype="http://schema.org/Attorney">
    <!-- this stuff just so the Yandex validator doesn't freak out -->
    <meta itemprop="name" content="some law firm">
    <meta itemprop="address" content="some address">
    <meta itemprop="telephone" content="555-555-5555">
    <h1>Book Test</h1>
    <div id="profile" itemscope itemtype="http://schema.org/Person">
        <h1 itemprop="name">John Smith</h1>
        <h3>Published Works</h3>
        <ul>
            <li itemscope itemtype="http://schema.org/Book"><span itemprop="name">Some Book</span><meta itemprop="author" itemref="profile"></li>
        </ul>
    </div>
    <meta itemprop="member" itemref="profile">
</body>

https://dl.dropboxusercontent.com/u/292741/schema-test-book-stackoverflow.html

的浏览器中查看

使用Google的结构化数据工具(google.com/webmasters/tools/richsnippets)或Yandex(webmaster.yandex.com/microtest.xml)进行测试时,我无法获得我想要的结果。在这种情况下,成员和作者属性未注册。

我尝试了很多变化。以下是一些重要的内容:

如果我在member和author属性元标记上放置了itemscope和itemtype = Person,那么属性就会注册,但工具认为我在谈论三个不同的人(就好像itemref没有注册)。

如果我将成员和作者属性放在#profile上,它们可以正常工作,但是我会收到错误,因为组织没有作者,书籍也没有成员。

这两者的组合只是部分成功。因此,将just成员属性放在#profile上并通过元标记执行作者会导致author属性被忽略(当我没有给它自己的范围和type = Person时)或者它适用于一些与之无关的随机人员。一个由#profile定义的(当我给它的ow范围等时)。

我也尝试过使用schema.org/WriteAction作为另一种方式来了解书与人之间的关系,但我遇到了同样的问题。我可以让组织 - >成员或写作 - >代理工作,而不是两者。

这是我得到的结构(由Google的工具代表):

  Item 
    type:   schema.org/attorney
    property:   
      name:   some law firm
      address:  some address
      telephone:  555-555-5555
      member:

  Item 
    type:   schema.org/book
    property:   
      name:   Some Book
      author:

  Item
    type:   schema.org/person
    property:   
      name:   John Smith

我想要的结构(由Google的工具代表)是这样的:

  Item 
    type:   schema.org/attorney
    property:   
      name:   some law firm
      address:  some address
      telephone:  555-555-5555
      member: Item 1 <-- now references the person

  Item 
    type:   schema.org/book
    property:   
      name:   Some Book
      author: Item 1 <-- now references the person

  Item 1
    type:   schema.org/person
    property:   
      name:   John Smith

我真的很感激任何建议。谢谢!

1 个答案:

答案 0 :(得分:2)

更新(2016)

多类型实体的使用似乎赶上了Microdata,因此使用未为所有指定类型定义的属性(如我在下面的旧答案中所述)在Schema.org中可能没问题。

无论如何,对标识符的支持(在Microdata:itemid中)似乎现在好一些(至少在Google的测试工具中得到支持),这可能是适合您案例的解决方案:

  • itemid
  • 中为此人提供URI
  • 将此URI引用为authormember
  • 的值

示例:

<div itemscope itemtype="http://schema.org/Person" itemid="/team/alice#i">
</div>

<div itemscope itemtype="http://schema.org/LegalService">
  <link itemprop="member" href="/team/alice#i" />
</div>

<div itemscope itemtype="http://schema.org/Book">
  <link itemprop="author" href="/team/alice#i" />
</div>

请注意,Attorney类型现已弃用,因此我在此示例中使用了LegalService


旧答案(2014)

(请注意,您对itemref的使用不正确,因为它can only be used on elements with itemscope。)

Microdata无法做到这一点。

这将导致使用对其父级无效的属性(无论是通过嵌套还是通过itemref)itemtype:

您无法通过itemref为律师和本书引用此人,因为这需要在Person上使用itemprop="author member"is valid语法明智的),但是author不是律师的有效财产,member不是Book的有效财产。

如果你在Book下面嵌入Person并使用itemref从律师那里引用同一个人,那么同样的问题。或相反亦然。

所以我能看到的唯一方法是复制信息,这很可惜。