混合 JSON-LD CollectionPage 和 Schema.org 的 Microdata `hasPart`

Mixing JSON-LD CollectionPage and Microdata `hasPart` of Schema.org

下面的微数据标记工作得很好,Google's structured data testing tool 将一个 CollectionPageWebSite/WebPage 显示为 children。

<body itemscope itemtype="https://schema.org/CollectionPage">
  <span itemscope itemtype="https://schema.org/WebSite" itemprop="hasPart">
    <a href="https://springfield-xxxx.us" itemprop="url">Official site of Springfield</a>
  </span>
  <span itemscope itemtype="https://schema.org/WebPage" itemprop="hasPart">
    <a href="https://facebook.com/group/XXXX" itemprop="url">Local events in Springfield</a>
  </span>
  <span itemscope itemtype="https://schema.org/WebPage" itemprop="hasPart">
    <a href="https://news.us/city/springfield-xxxx" itemprop="url">Latest news in Springfield</a>
  </span>
</body>

然而,当我添加 JSON-LD Google's structured data testing tool 时,objects CollectionPageWebPage/WebSite 分别显示,就像它们没有连接一样。这是 JSON-LD:

的示例
<!DOCTYPE html>
<html>
<head>
  <script type="application/ld+json">
    {
      "description": "...",
      "author": {"@type":"Person", "name": "Homer J. Simpson"},
      "@type": "CollectionPage",
      "url": "http://my-springfield.us/sites",
      "publisher": {
        "@type": "Organization",
        "logo": "Object of type ImageObject here",
        "name": "Homer J. Simpson"
      },
      "image": "...",
      "headline": "Springfield Sites",
      "sameAs": ["..."],
      "@context": "http://schema.org"
    }
  </script>
</head>
<body>
  <span itemscope itemtype="https://schema.org/WebSite" itemprop="hasPart">
    <a href="https://springfield-xxxx.us" itemprop="url">Official site of Springfield</a>
  </span>
  <span itemscope itemtype="https://schema.org/WebPage" itemprop="hasPart">
    <a href="https://facebook.com/group/XXXX" itemprop="url">Local events in Springfield</a>
  </span>
  <span itemscope itemtype="https://schema.org/WebPage" itemprop="hasPart">
    <a href="https://news.us/city/springfield-xxxx" itemprop="url">Latest news in Springfield</a>
  </span>
</body>
</html>

我尝试将 @id 放入 JSON-LD 并将 itemid 放入 body 无济于事:Google 测试工具显示两个单独的 CollectionPages 或两个单独的 CollectionPages其他类型的项目。

我的问题:如何连接JSON-LD和微数据,以便Google测试工具显示一个CollectionPageWebPage/WebSite作为 children/props?

like if they had no connection

好吧,在您的示例中,它们 没有 连接。 JSON-LD 和 Microdata 无法在语法级别上协同工作。

如果你想连接以不同语法定义的实体,唯一的方法是

  • 为这些实体提供 URI(如果它们是同一事物,则为相同的 URI),并且
  • 将这些 URI 引用为 属性 值(如果一个实体是另一个实体的 属性 的值)。

Giving entities URIs 以您提到的方式工作:在 JSON-LD 中使用 @id,在 Microdata 中使用 itemid(在 resource 中RDFa 精简版)。

消费者(搜索引擎或 Google 的 SDTT 等服务,浏览器插件等本地客户端)必须支持以下引用(并非所有人都支持),如果他们支持以下引用, 他们还必须支持解析附加语法(并非全部支持)。

但即使您使用此类 URI 引用,也不会改变您使用的语法的一致性要求。您的 HTML 文档无效,因为您有 itemprop 个不属于 itemscope 的属性。这是不允许的。因此,如果您想继续使用 Microdata,您也必须在 Microdata 中提供父项(CollectionPage 在您的情况下)。

这将是传达两个 CollectionPage 事件代表相同实体的方式(它们具有相同的 URI = 当前文档的基础 URL):

<script type="application/ld+json">
  {
    "@context": "http://schema.org",
    "@type": "CollectionPage",
    "@id": ""
  }
</script>

<div itemscope itemtype="http://schema.org/CollectionPage" itemid="">
  <span itemprop="hasPart" itemscope itemtype="http://schema.org/WebSite"></span>
  <span itemprop="hasPart" itemscope itemtype="http://schema.org/WebSite"></span>
  <span itemprop="hasPart" itemscope itemtype="http://schema.org/WebPage"></span>
</div>

Google的SDTT仍然显示两个CollectionPage条目(if syntaxes are mixed), but they (correctly) have the same URI. It’s up to Google to decide what to do with this information for their various structured data features. Maybe mixed-syntax references are supported for none/some/all of their features ();他们的 SDTT 如何显示事物并不一定反映他们如何解释其特征。

更多示例