Mixing JSON-LD and Microdata Schema.org

一世执手 提交于 2019-12-07 03:24:17

问题


If I have the following markup:

<body itemscope="" itemtype="http://schema.org/WebPage">
  <h1 itemprop="name">Lecture 12: Graphs, networks, incidence matrices</h1>
  <p itemprop="description">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>
  <div itemprop="publisher" itemscope="" itemtype="http://schema.org/CollegeOrUniversity">
    <h4 class="footer">About <span itemprop="name">MIT OpenCourseWare</span></h4>
  </div>
  <a itemprop="license"
    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>

And I want to refactor the publisher property because it's complicated and I don't want to necessarily display it and do this:

<body itemscope="" itemtype="http://schema.org/WebPage">
  <h1 itemprop="name">Lecture 12: Graphs, networks, incidence matrices</h1>
  <p itemprop="description">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": "CollegeOrUniversity",
        "name": "MIT OpenCourseWare"
    }
</script>
  <a itemprop="license"
    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>

How do I say that the <script> block relates to the itemprop="publisher" property?

I guess the two options are i). adding an itemprop attribute to the script tag or ii). adding an @attribute to in lieu of itemprop to the JSON-LD block.

I cannot find documentation on either. Does anyone know the answer?


回答1:


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" />



回答2:


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.




回答3:


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.



来源:https://stackoverflow.com/questions/35844485/mixing-json-ld-and-microdata-schema-org

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