¿Vincular varios Microdata <div> s separados?

11

Estoy agregando marcas semánticas de schema.org, y me gustaría vincular varias de las cuales están en partes bastante diferentes de la página web.

Esto funciona cuando los especifico como padre / hijo:

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

Sin embargo, no sé cómo vincularlos cuando están separados por una montaña de 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>

Supongo que debería usar "itemref" o algo para vincular ámbitos relacionados, pero no puedo hacer que funcione. Mirar preguntas similares no ayudó en este caso.

ACTUALIZACIÓN: tenga en cuenta que estoy buscando específicamente una solución que funcione a través de algún tipo de referencia y NO funciona a través de la anidación de ningún tipo. Además, el orden del segundo ejemplo (que no funciona) debe permanecer igual (evento primero, ejercicio segunda acción). (Hay varias razones para eso fuera de mi control).

Específicamente, "funciona" se define como al menos una herramienta de fragmentos enriquecidos de Google que muestra que los elementos están vinculados entre sí (como lo hace para ese primer ejemplo de trabajo)

Matija Nalis
fuente

Respuestas:

9

Podrías usar el itemrefatributo.

De la especificación Microdata ( Nota del grupo de trabajo del W3C ):

  • 4.2 La sintaxis básica :

    Las propiedades que no son descendientes del elemento con el itemscopeatributo pueden asociarse con el elemento utilizando el itemrefatributo. Este atributo toma una lista de ID de elementos para rastrear, además de rastrear los elementos secundarios del elemento con el itemscopeatributo.

  • 5.2 Artículositemref :

    Los elementos con un itemscopeatributo pueden tener un itemrefatributo especificado, para dar una lista de elementos adicionales para rastrear para encontrar los pares de nombre-valor del elemento.


EDITAR : Esto debería funcionar de acuerdo con los requisitos que se mencionan en la pregunta:

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

EDITAR 2 (por requisito adicional ): si un elemento padre especifica otro elemento (por ejemplo, a WebPageen el body), la solución anterior no funciona porque entonces la eventpropiedad también se aplicaría al WebPage, lo que no sería correcto.

No hay una solución clara para esto.

Una solución fea sería agregar otro elemento (con itemscope) pero sin ningún tipo (sin itemtype) como padre del Event. De esa forma, la eventpropiedad se aplicará a este elemento sin tipo, no al 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>
unor
fuente
¿Podría dar un ejemplo que funcionaría anteriormente? Lo he intentado durante horas y no he logrado que funcione (validándolo, por ejemplo, en la herramienta de fragmentos enriquecidos de Google ). Todo lo que puedo hacer es hacer que incluya varios otros pares nombre = valor que se duplicaron en otro itemcope y tenían el mismo nombre, como se menciona en una pregunta similar ; pero no logré incluir otro itemcope, que es la pregunta)
Matija Nalis
@MatijaNalis: agregué el fragmento a mi respuesta.
hasta el
¡Gracias, eso era casi exactamente lo que estaba buscando! Los vincula como se desea en ese ejemplo HTML simplificado e independiente. Desafortunadamente, la herramienta de fragmentos enriquecidos de Google arroja un error en un ejemplo más complejo con "Error: la página contiene la propiedad" evento "que no forma parte del esquema". (toda la página tiene más divs principales, la problemática es, por ejemplo, schema.org/Webpage )
Matija Nalis
¿Hay alguna idea de cómo arreglar eso? Eliminar itemprop = "event" de schema.org/Event no ayuda, ya que no enlaza itemscopes juntos entonces ...
Matija Nalis
@MatijaNalis: agregué otro fragmento, pero esto probablemente no solucione este problema. Supongo que tendrías que desarmar el WebPagemarcado padre y usarlo itemrefallí también, para que no incluya los tipos de elementos (no relacionados) como hijos. Probablemente debería ser otra pregunta.
hasta el
1

Si entiendo su pregunta correctamente, simplemente no cierre esa división.

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

Mientras no se encuentre la etiqueta coincidente, lo que esté dentro de ese div inicial todavía se considerará parte de ese div inicial, en ese caso, un Evento.

levantarse contra
fuente
Desafortunadamente, no puedo usar el anidamiento de ningún tipo (en proyectos originales, mucho más complejos, están en sub-plantillas bastante diferentes de las cuales cada una debe tener una estructura HTML cerrada), ni cambiar el orden (mostrar razones, entre otras cosas). He actualizado la pregunta para aclarar eso. Además, tenga en cuenta que su respuesta no se validará ya que ExerciseAction no puede ser un evento secundario (solo es posible al revés) y, por lo tanto, no se necesita itemprop para vincularlos.
Matija Nalis
@MatijaNalis La única razón por la que no se validó fue porque copié el texto que proporcionó en su pregunta. El error ocurre porque el evento está configurado para comenzar en el pasado, 02/02/2002. Cuando se actualiza a una fecha futura, funciona. Además, sé que ahora ha actualizado su pregunta mostrando que no desea ningún tipo de anidamiento, pero solo para avisarle, siempre y cuando la segunda parte de los datos que ingrese para el "Evento" original no esté dentro de " ExerciseAction "div, seguirá funcionando. Por ejemplo, mueva el "startDate" de mi respuesta a después del div de cierre "ExerciseAction", y seguirá funcionando.
aumento contra
1

@Guisasso es correcto, simplemente no cierras el elemento. Pero en otra nota, no está restringido a usar el esquema solo dentro de los elementos DIV y usar los tramos como sugiere (meros ejemplos). Si toda la página trata sobre cosas relacionadas con eventos y esto está en todo el sitio, entonces podría tener más sentido usar el elemento del cuerpo, lo que significa que su plantilla, si tiene una, trata automáticamente de abrir y cerrar el esquema. De esta manera, sus artículos solo llenan ese contenido mientras la plantilla lo configura.

Por ejemplo:

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

O podría usarlo en el elemento MAINo ARTICLEsi está usando HTML5.

Simon Hayter
fuente
vea el comentario a Guisasso, su respuesta no funciona por las mismas razones. He actualizado la pregunta para aclarar mis necesidades.
Matija Nalis
1

También he ejecutado la propiedad adicionalType , que podría usarse de la siguiente manera

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

Si bien eso ayuda con mi problema principal (no poder reordenar la relación niño-padre de ExerciseAction / Event), no ayuda con otro problema (no poder anidar esos divs), y es un poco incómodo (no produce el mismo semántico que el ejemplo de trabajo original). Sin embargo, es útil ya que permite la vinculación de los tipos de elementos de schema.org que no tienen elementos destinados a la vinculación, por lo que podría vincular, por ejemplo, Book to SportsEvent o lo que sea.

Me estoy respondiendo aquí solo en caso de que ayude a alguien más con un problema similar, ya que realmente no me ayuda (aunque podría ser el último recurso si no surge nada mejor)

Matija Nalis
fuente