Связать несколько разделенных <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" или что-то, чтобы связать связанные области, но я не могу заставить его работать. Глядя на подобные вопросы не помогло в этом случае.

ОБНОВЛЕНИЕ: обратите внимание, что я специально ищу решение, которое работает через какие-то ссылки и НЕ работает через вложенность любого типа. Кроме того, порядок второго (нерабочего) примера должен оставаться прежним (событие сначала, второе действие ExerciseAction). (Есть несколько причин для этого вне моего контроля).

В частности, "это работает" определяется как инструмент, по крайней мере, Google Rich Snippets, показывающий, что элементы связаны друг с другом (как это происходит в первом рабочем примере).

Матия Налис
источник

Ответы:

9

Вы можете использовать itemrefатрибут.

Из спецификации микроданных ( примечание рабочей группы W3C ):

  • 4.2 Основной синтаксис :

    Свойства, которые не являются потомками элемента с itemscopeатрибутом, могут быть связаны с элементом с помощью itemrefатрибута. Этот атрибут принимает список идентификаторов элементов для обхода в дополнение к сканированию дочерних элементов элемента с itemscopeатрибутом.

  • 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 (согласно дополнительному требованию ): если родительский элемент указывает другой элемент (например, a WebPageна body), вышеуказанное решение не работает, поскольку тогда 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 Rich Snippets ). Все, что я мог сделать, - это включить несколько других пар имя = значение, которые были продублированы в другой области видимости и имели то же имя - как упоминалось в аналогичном вопросе ; но мне не удалось включить другую предметную область - вот в чем вопрос)
Матия Налис
@MatijaNalis: я добавил фрагмент к своему ответу.
ОООНР
Спасибо, это было почти то, что я искал! Он связывает их вместе, как хотелось бы в этом упрощенном автономном примере HTML. К сожалению, инструмент Google Rich Snippets выдает ошибку в более сложном примере с сообщением «Ошибка: страница содержит свойство« событие », которое не является частью схемы». (на целой странице больше родительских элементов, проблемным из которых является, например, schema.org/Webpage )
Матия Налис
Есть идеи как это исправить? Удаление itemprop = "event" из schema.org/Event не помогает, так как тогда он не связывает области видимости вместе ...
Матия Налис
@MatijaNalis: я добавил еще один фрагмент, но это, вероятно, не решает эту проблему. Я полагаю, вам придется разбирать родительскую WebPageразметку и использовать ее itemrefтам, чтобы она не включала (не связанные) типы элементов в качестве дочерних. Наверное, должен быть другой вопрос.
ОООНР
1

Если я правильно понимаю ваш вопрос, просто не закрывайте этот раздел.

<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 не может быть дочерним событием od (возможна только обратная последовательность действий), и поэтому для его объединения не требуется itemprop.
Матия Налис
@MatijaNalis Единственная причина, по которой он не прошел проверку, это то, что я скопировал текст, который вы указали в своем вопросе. Ошибка возникает из-за того, что событие задано для запуска в прошлом, 2002-02-02. При обновлении на будущую дату это работает. Кроме того, я знаю, что вы теперь обновили свой вопрос, показывая, что вы не хотите вложения какого-либо рода, а просто чтобы сообщить вам, если вторая часть данных, которые вы вводите для исходного «события», не находится внутри « ExerciseAction "div, все равно будет работать. Например, переместите «startDate» из моего ответа в после Div «ExerciseAction», и он все равно будет работать.
Восход
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>

Или вы можете использовать его в элементе MAINили, ARTICLEесли вы используете HTML5.

Саймон Хейтер
источник
см. комментарий к Гисассо, ваш ответ не работает по тем же причинам. Я обновил вопрос, чтобы уточнить мои потребности.
Матия Налис
1

Я также бежать additionalType собственности, которая может быть использована следующим образом

<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 или что-то еще.

Я отвечаю себе здесь на всякий случай, если это поможет кому-то еще с подобной проблемой, поскольку это действительно не помогает мне (хотя это могло бы быть крайним прибежищем, если ничто лучше не подходит)

Матия Налис
источник