【问题标题】:Linking independent elements in Microdata链接微数据中的独立元素
【发布时间】:2016-07-29 14:34:54
【问题描述】:

我正在创建一个关于作者的网站。他是主线。在这个网站上也展示了他的成书。

不幸的是,我找不到将这些书籍链接到主要人物元素的解决方案。我试过itemref,但是当链接到没有itemprop 值的这种“独立”元素时它不起作用(谷歌测试工具说)。以下两个“书”案例都不起作用。

<div id="author" itemscope="" itemtype="http://schema.org/Person">
  <span itemprop="name">Marvin</span>
</div>

<div itemscope="" itemtype="http://schema.org/Book">
  <span itemprop="name">Nice Book</span>
  <meta itemprop="author" itemref="author" />
</div>

<div itemscope="" itemtype="http://schema.org/Book">
  <span itemprop="name">Best Book</span>
  <meta itemprop="author" itemscope="" itemtype="http://schema.org/Person" itemref="author" />
</div>

还有其他想法吗?

【问题讨论】:

    标签: html schema.org microdata


    【解决方案1】:

    你有三个选择。

    itemid

    作为described by @Dharmang。你给Person 一个URI(带有itemid 属性)并在每个Book 中使用author 属性引用这个URI。

    <div itemscope itemtype="http://schema.org/Person" itemid="#person-1">
    </div>
    
    <div itemscope itemtype="http://schema.org/Book">
      <link itemprop="author" href="#person-1" />
    </div>
    
    <div itemscope itemtype="http://schema.org/Book">
      <link itemprop="author" href="#person-1" />
    </div>
    

    (然后,其他人也可以使用此 URI 来谈论这个人,或者想识别那个人。所以[your-domain]/[your-path]#person-1 是一个代表实际人的 URI,而不仅仅是关于那个人的页面. 如果该人已经有这样的 URI,您可能希望重用它而不是创建自己的。)

    问题:消费者支持可能不是最好的(但 Google 的测试工具似乎可以识别)。

    itemref

    您必须将itemprop="author" 添加到Person 项目,并使用itemref 属性从每个Book 引用其id。您不必为此添加meta 元素,只需在带有itemscope 的元素上添加即可。

    <div itemprop="author" itemscope itemtype="http://schema.org/Person" id="author">
    </div>
    
    <div itemscope itemtype="http://schema.org/Book" itemref="author">
    </div>
    
    <div itemscope itemtype="http://schema.org/Book" itemref="author">
    </div>
    

    问题:Person 项不能有一个带有itemscope 的父项(因为它的author 属性将被添加到它)。因此,这意味着,例如,您不能使用mainEntity 属性来表示PersonWebPage 的主要主题。

    itemprop-reverse

    如果您可以将Book 项嵌套在Person 项中,则可以使用itemprop-reverse 属性,它允许您在另一个方向使用属性:

    <div itemscope itemtype="http://schema.org/Person">
    
      <div itemprop-reverse="author" itemscope itemtype="http://schema.org/Book">
      </div>
    
      <div itemprop-reverse="author" itemscope itemtype="http://schema.org/Book">
      </div>
    
    </div>
    

    (如果你不能嵌套,你仍然可以将它与 URI 值一起使用,但在这种情况下使用 itemid 可能是更好的选择。)

    问题:此属性不是微数据规范的一部分。这是defined in W3C’s Microdata to RDF Note。所以消费者的支持可能不是那么好。 Google 的测试工具似乎无法识别它。

    【讨论】:

    • 谢谢,但正如您所提到的,前两个解决方案将“删除”人员元素。当第三种解决方案无法被 google 的测试工具读取时,它的爬虫可能也会这样做。这很棘手。
    • @Less: 有了“cut out”,你的意思是谷歌的测试工具没有在自己的部分显示Person?如果是,那应该没问题:它只以这种方式列出顶级项目;所有其他项目都嵌套在这样的部分内(例如,在您的情况下,在 Book 内)。这正是 Google 决定显示输出的方式。
    • 是的,这就是我的想法。我不认为这只是测试工具的显示问题。在我看来,Google 不会将 Person 视为文档的主要实体。
    • @Less:我认为你必须告诉消费者主要实体应该是什么。拥有顶级项目并不意味着它们比嵌套项目更重要。要表示哪个项目是主要实体,您可以使用 mainEntity property (WebPagemainEntityPerson)(或者如果您不想要 WebPage 项目,则使用相反的 mainEntityOfPage)。
    • 好的,我找到了您的其他帮助:stackoverflow.com/questions/34466028/… 测试工具仍将 book-elements 显示为顶级项目,但使用 mainEntityOfPage 应该很清楚,Person 是主要话题。谢谢!
    【解决方案2】:

    你可以使用link标签来实现这个,检查下面的sn-p:

    <div itemid="#author-marvin" itemscope="" itemtype="http://schema.org/Person">
      <span itemprop="name">Marvin</span>
    </div>
    <div itemscope="" itemtype="http://schema.org/Book">
      <span itemprop="name">Nice Book</span>
      <link itemprop="author" href="#author-marvin">
    </div>
    <div itemscope="" itemtype="http://schema.org/Book">
      <span itemprop="name">Best Book</span>
      <link itemprop="author" href="#author-marvin">
    </div>
    

    作者 sn-p 的itemid 应与整个页面标记中书籍 sn-p 中的linkhref 匹配。

    更多例子here

    【讨论】:

    • 谢谢,但在这个解决方案中,只会留下书籍模式,没有人的实例。
    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多