Ligando vários Microdados separados <div> s?

11

Estou adicionando marcações semânticas do schema.org e gostaria de vincular várias delas em partes bastante diferentes da página da web.

Isso funciona quando eu os especifico como pai / filho:

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

No entanto, não sei como vinculá-los quando eles são separados pela montanha 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>

Acho que devo usar "itemref" ou algo para vincular escopos relacionados, mas não consigo fazê-lo funcionar. Olhando para perguntas semelhantes did't ajuda neste caso.

UPDATE: observe que estou procurando especificamente uma solução que funcione através de algum tipo de referência e NÃO funcione através do aninhamento de qualquer tipo. Além disso, a ordenação do segundo exemplo (que não funciona) deve permanecer a mesma (evento primeiro, exercícioAção segundo). (Existem várias razões para isso fora do meu controle).

Especificamente, "funciona" é definido como pelo menos a ferramenta de rich snippets do Google, mostrando que os itens ESTÃO vinculados (como no primeiro exemplo de trabalho)

Matija Nalis
fonte

Respostas:

9

Você poderia usar o itemrefatributo

Da especificação Microdata ( nota do grupo de trabalho W3C ):

  • 4.2 A sintaxe básica :

    Propriedades que não são descendentes do elemento com o itemscopeatributo podem ser associadas ao item usando o itemrefatributo Esse atributo leva uma lista de IDs de elementos a serem rastreados, além de rastrear os filhos do elemento com o itemscopeatributo

  • 5.2 Itensitemref :

    Os elementos com um itemscopeatributo podem ter um itemrefatributo especificado, para fornecer uma lista de elementos adicionais a serem rastreados para encontrar os pares nome-valor do item.


EDIT : Isso deve funcionar de acordo com os requisitos mencionados na pergunta:

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

EDIT 2 (por requisito adicional ): se um elemento pai especificar outro item (por exemplo, um WebPageno body), a solução acima não funcionará porque a eventpropriedade também se aplicaria ao WebPage, o que não estaria correto.

Não existe uma solução limpa para isso.

Uma correção feia seria adicionar outro item (com itemscope), mas sem nenhum tipo (sem itemtype) como pai do Event. Dessa forma, a eventpropriedade será aplicada a esse item não digitado, não ao 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
fonte
Você poderia dar um exemplo que funcionaria acima? Eu tentei por horas e não consegui fazê-lo funcionar (validando-o, por exemplo, na ferramenta de rich snippets do google ). Tudo o que pude fazer foi incluir vários outros pares nome = valor, duplicados em outro escopo de itens e com o mesmo nome - como mencionado em pergunta semelhante ; mas não conseguiu incluir outro itemscope - que é a questão)
Matija Nalis
@MatijaNalis: adicionei o trecho à minha resposta.
Unor
Obrigado, isso era quase exatamente o que eu estava procurando! Ele os vincula como desejado naquele exemplo HTML simplificado e independente. Infelizmente, a ferramenta de rich snippets do Google gera um erro em um exemplo mais complexo com "Erro: a página contém a propriedade" evento "que não faz parte do esquema". (a página inteira tem mais divs pai, sendo a problemática, por exemplo, schema.org/Webpage )
Matija Nalis
Alguma idéia de como consertar isso? Removendo itemprop = "evento" de schema.org/Event não ajudar, uma vez que não ligar itemscopes juntos, então ...
Matija Nalis
@MatijaNalis: adicionei outro trecho, mas isso provavelmente não corrige esse problema. Eu acho que você precisaria desmontar a WebPagemarcação pai e usá itemref-la também, para que ela não inclua os tipos de item (não relacionados) como filhos. Provavelmente deveria ser outra pergunta.
Unor
1

Se entendi sua pergunta corretamente, não feche essa 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>

Enquanto a tag correspondente não for encontrada, o que estiver dentro dessa div inicial ainda será considerado parte dessa div inicial, nesse caso, um Evento.

levantar-se contra
fonte
Infelizmente, não posso usar aninhamento de nenhum tipo (no projeto original, muito mais complexo, eles estão em submodelos bastante diferentes dos quais cada um deve ser fechado na estrutura HTML), nem mudar a ordem (exibir motivos entre outras coisas). Atualizei a pergunta para esclarecer isso. Além disso, observe que sua resposta não será validada, uma vez que o ExerciseAction não pode ser um evento filho (apenas a reversão é possível) e, portanto, não possui o itemprop necessário para vinculá-los.
Matija Nalis 03/09/2013
@MatijaNalis A única razão pela qual não validou foi porque copiei o texto que você forneceu na sua pergunta. O erro ocorre porque o evento está definido para iniciar no passado, 02/02/2002. Quando atualizado para uma data futura, ele funciona. Além disso, sei que agora você atualizou sua pergunta, exibindo que não deseja aninhamento de nenhum tipo, mas apenas para informá-lo, desde que a segunda parte dos dados inseridos para o "Evento" original não esteja dentro do " ExerciseAction "div, ainda funcionará. Por exemplo, mova o "startDate" da minha resposta para depois da div de fechamento do "ExerciseAction" e ele ainda funcionará.
Rise Against
1

@Guisasso está correto, você simplesmente não fecha o elemento. Mas, por outro lado, você não está restrito a usar o esquema apenas dentro dos elementos DIV e a usar os intervalos conforme sugerido (meros exemplos). Se a página inteira é sobre itens relacionados a eventos e isso acontece em todo o site, pode fazer mais sentido usar o elemento body, o que significa que o seu modelo se você tiver um que lida automaticamente com a abertura e o fechamento do esquema. Dessa forma, seus artigos preenchem esse conteúdo enquanto o modelo o define.

Por exemplo:

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

Ou você pode usá-lo no elemento MAINou ARTICLEse estiver usando HTML5.

Simon Hayter
fonte
veja o comentário para Guisasso, sua resposta não funciona pelas mesmas razões. Atualizei a pergunta para esclarecer minhas necessidades.
Matija Nalis
1

Também executei a propriedade additionalType , que poderia ser usada da seguinte maneira

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

Embora isso ajude com meu problema principal (não ser capaz de reordenar o relacionamento filho-pai do ExerciseAction / Event), ele não ajuda com outro problema (não é possível aninhar esses divs) e é meio desajeitado (não produz o mesma semântica que o exemplo de trabalho original). No entanto, é útil, pois permite a vinculação de tipos de item do schema.org que não possuem elementos pretendidos para vinculação; portanto, você pode vincular, por exemplo, Book ao SportsEvent ou qualquer outra coisa.

Estou respondendo a mim mesmo aqui, caso isso ajude alguém com um problema semelhante, pois realmente não me ajuda (embora possa ser o último recurso se nada melhor acontecer)

Matija Nalis
fonte