将几个分开的Microdata <div>链接在一起?


11

我要添加schema.org语义标记,并希望将网页中非常不同的部分链接在一起。

这工作时,我将其指定为父/子:

<div itemscope itemtype="http://schema.org/ExerciseAction">
  <span itemprop="distance">11 km</span>
  <div itemprop="event" itemscope itemtype="http://schema.org/Event">
      <span itemprop="name">first event</span>
      <span itemprop="startDate">2001-01-01</span>
  </div>
</div>

但是,当它们被大量的HTML分隔时,我不知道如何链接它们:

<div itemscope itemtype="http://schema.org/Event">
      <span itemprop="name">some event</span>
      <span itemprop="startDate">2002-02-02</span>
</div>

<!-- 
   ....
   zillion other HTML stuff
   ...
 -->

<div itemscope itemtype="http://schema.org/ExerciseAction">
      <span itemprop="distance">22 km</span>
</div>

我想我应该使用“ itemref”或某种链接相关范围的东西,但是我无法使其正常工作。查看类似的问题在这种情况下无济于事。

更新:请注意,我专门在寻找通过某种引用起作用的解决方案,并且不能通过任何类型的嵌套起作用。同样,第二(非工作)示例的顺序必须保持不变(事件优先,运动动作第二)。(有几个原因使我无法控制)。

具体来说,“有效”的定义至少是Google丰富网页摘要工具,该工具可将项目链接在一起(如第一个工作示例所示)

Answers:


9

您可以使用该itemref属性。

根据微数据W3C工作组说明)规范:

  • 4.2基本语法

    itemscope可以使用该itemref属性将不是具有该属性的元素的后代的属性与该项目相关联。除了对具有该itemscope属性的元素的子代进行爬网之外,此属性还获取要爬网的元素ID的列表。

  • 5.2项目itemref

    具有itemscope属性的元素可能具有itemref指定的属性,以提供其他元素列表以进行爬网以查找项目的名称/值对。


编辑:这应该根据问题中提到的要求工作:

<div itemprop="event" itemscope itemtype="http://schema.org/Event" id="event001">
  <span itemprop="name">first event</span>
  <span itemprop="startDate">2001-01-01</span>
</div>

<!-- zillion other HTML stuff -->

<div itemscope itemtype="http://schema.org/ExerciseAction" itemref="event001">
  <span itemprop="distance" id="entfernung">11 km</span>
</div>

编辑2(每额外的要求):如果父元素指定的另一个项目(例如,WebPagebody)中,上述溶液中不工作,因为那时的event属性将也适用于WebPage,这将是不正确的。

没有完美的解决方案。

一个丑陋的修复方法是添加另一个项目(带有itemscope),但没有任何类型(不带itemtype)作为的父项Event。这样,该event属性将应用于此无类型的项目,而不是WebPage

<body itemscope itemtype="http://schema.org/WebPage">

  <div itemscope> <!-- dummy item -->
    <div itemprop="event" itemscope itemtype="http://schema.org/Event" id="event001">
      <span itemprop="name">first event</span>
      <span itemprop="startDate">2001-01-01</span>
    </div>
  </div>

  <!-- zillion other HTML stuff -->

  <div itemscope itemtype="http://schema.org/ExerciseAction" itemref="event001">
    <span itemprop="distance" id="entfernung">11 km</span>
  </div>

</body>

您能举一个上面给出的例子吗?我已经尝试了几个小时,但没有设法使其正常工作(例如在Google丰富摘要代码工具上进行了验证)。我所能做的就是使它包括几个其他的name = value对,它们在另一个itemscope中重复并且具有相同的名称-如类似问题中所述;但我没有设法包括另一个itemscope-这就是问题所在)
Matija Nalis

@MatijaNalis:我已将代码段添加到我的答案中。
13年

谢谢,这几乎正是我想要的!它确实按照简化的独立HTML示例中的要求将它们链接在一起。不幸的是,谷歌丰富的摘要工具在一个更复杂的示例中引发了一个错误,错误为“错误:页面包含属性“事件”,该属性不属于架构。” (整页具有多个父的div,有问题的一个是例如schema.org/Webpage
Matija NALIS

任何想法如何解决?从schema.org/Event中删除itemprop =“ event”无济于事,因为那样的话它不会将itemscopes链接在一起...
Matija Nalis 2013年

@MatijaNalis:我添加了另一个代码段,但这可能无法解决此问题。我猜您也必须拆开父WebPage标记并在其中使用itemref,这样它才不会包含(无关的)项类型作为子项。应该可能是另一个问题。
13年

1

如果我正确理解了您的问题,请不要关闭该div。

<div itemscope itemtype="http://schema.org/Event">
  <span itemprop="name">some event</span>
  <span itemprop="startDate">2002-02-02</span>


<!-- ....zillion other HTML stuff... -->

    <div itemscope itemtype="http://schema.org/ExerciseAction">
      <span itemprop="distance">22 km</span>
    </div>
</div>

只要找不到匹配的标记,该初始div内的任何内容仍将被视为该初始div(在这种情况下为Event)的一部分。


不幸的是,我不能使用任何类型的嵌套(在原始的,复杂得多的项目中,它们处于完全不同的子模板中,每个子模板必须是封闭的HTML结构),也不能更改顺序(显示原因除其他外)。我已经更新了问题以澄清这一点。另外,请注意,您的答案将无法验证,因为ExerciseAction不能是事件的子代(只能进行反向转换),因此不需要将它们链接在一起的itemprop。
Matija Nalis

@MatijaNalis唯一无法验证的原因是因为我复制了您在问题中提供的文本。发生错误是因为该事件设置为从过去的2002-02-02开始。当更新为将来的日期时,它将起作用。另外,我知道您现在已经更新了您的问题,显示了您不希望进行任何形式的嵌套,只是为了让您知道,只要您为原始“事件”输入的数据的第二部分不在“ ExerciseAction” div,它将仍然有效。例如,将“ startDate”从我的答案移到“ ExerciseAction”关闭div之后,它仍然可以工作。
13年

1

@Guisasso是正确的,只是不关闭该元素。但要注意的是,您不限于仅在DIV元素内使用架构,而是按照建议的方式使用跨度(仅作为示例)。如果整个页面都涉及事件相关的内容,并且它遍及整个站点,那么使用body元素可能更有意义,这意味着您的模板(如果有的话)会自动处理打开模式和关闭操作。这样,您的文章就可以在模板设置时填充该内容。

例如:

<body itemscope itemtype="http://schema.org/Event">
   <article>
       <h1 itemprop="name">Some Event</h1>
       <span itemprop="startDate">2002-02-02</span>
       <p itemprop="description">I am the super awesome event infromation</p>
       <div itemscope itemtype="http://schema.org/ExerciseAction">
           <span itemprop="distance">22 km</span>
       </div>
   </article>
</body>

或者,如果您使用的是HTML5,则可以在MAINARTICLE元素中使用它。


看到对Guisasso的评论,您的答案出于几乎相同的原因而行不通。我已更新问题以阐明我的需求。
Matija Nalis

1

我还运行了extraType属性,该属性可以如下使用

<div itemscope itemtype="http://schema.org/Event">
      <span itemprop="name">some event</span>
      <span itemprop="startDate">2002-02-02</span>


<!-- 
   ....
   zillion other HTML stuff
   ...
 -->

  <div itemprop="additionalType" itemscope itemtype="http://schema.org/ExerciseAction">
      <span itemprop="distance">22 km</span>
  </div>
</div>

虽然这有助于解决我的主要问题(无法重新排序ExerciseAction / Event子父母关系),但对其他问题(不能嵌套这些div)没有帮助,而且有点糊涂(不产生与原始工作示例相同的语义)。但是,它非常有用,因为它允许链接没有预期元素的schema.org项类型,因此您可以将Book链接到SportsEvent等。

我在这里回答自己,以防万一它对其他有类似问题的人有所帮助,因为它并没有真正帮助我(尽管如果没有更好的解决方法,这可能是最后的选择)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.