Mixing JSON-LD and Microdata Schema.org

守給你的承諾、 提交于 2019-12-05 07:25:20
unor

This is not possible like that. If you use the itemprop attribute on the script element, the property value will be the textContent of script. This would be essentially something like itemprop="{ "@context": "http://schema.org", "@type": "CollegeOrUniversity", "name": "MIT OpenCourseWare" }", so the value is the plain text, not JSON-LD (and not interpreted as JSON-LD).

If you don’t want to have the publisher name visible on your page, you could use a meta element:

<div itemprop="publisher" itemscope itemtype="http://schema.org/CollegeOrUniversity">
  <meta itemprop="name" content="MIT OpenCourseWare" />
</div>

It would also be possible to use a node identifier (@id) for the JSON-LD node and reference this URI in Microdata, but some consumers might not support it (some might not follow references at all, some might only recognize what Schema.org expects for the publisher property: Organization/Person, but not URL):

<script type="application/ld+json">
{
    "@context": "http://schema.org",
    "@type": "CollegeOrUniversity",
    "@id": "http://example.com/mit-opencourseware#thing",
    "name": "MIT OpenCourseWare"
}
</script>
<link itemprop="publisher" href="http://example.com/mit-opencourseware#thing" />

In pure JSON-LD, this kind of relationship would be expressed by nesting the properties, like this:

   <body>
      <h1>Lecture 12: Graphs, networks, incidence matrices</h1>
      <p>These video lectures of Professor Gilbert
        Strang teaching 18.06 were  recorded in Fall 1999 and do not
        correspond precisely to the current  edition of the textbook.</p>
      <script type="application/ld+json">
        {
            "@context": "http://schema.org",
            "@type" : "WebPage",
            "name" : "Web page name",
            "description" : "Web page desc",
            "license" : "http://creativecommons.org/licenses/by-nc-sa/3.0/us/deed.en_US",
            "publisher" : {
                "@context": "http://schema.org",
                "@type": "CollegeOrUniversity",
                "name": "MIT OpenCourseWare"
            }

        }
    </script>
      <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/deed.en_US"><img
        src="/images/cc_by-nc-sa.png" alt="Creative Commons logo with terms BY-NC-SA." /></a>
    </body>

But if you keep WebPage also in your HTML as microdata, you will end up with 2 instances of WebPage when testing in https://developers.google.com/structured-data/testing-tool/ I think it would be better to stick to just microdata or JSON-LD on one page.

The whole point of Lined Data is that anyone can say anything anywhere. In this case, you can use @itemid in your Microdata to identify a resource URI and use the same URI as the value (explicit or implicit) of an @id in your JSON-LD. This is certainly how the Steuctured Data Linter interprets it. You'd need to try with Google's Structured Data Testing Tool to see how they interpret it.

If you want to refer to the same resources in Microdata and JSON-LD (or RDFa) this is the only mechanism you have. @itemrel on a script element does not do anything.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!