Łącząc ze sobą kilka oddzielnych mikrodanych <div>?

11

Dodaję znaczniki semantyczne schema.org i chciałbym połączyć kilka z nich w całkiem różnych częściach strony.

Działa to, gdy określę je jako rodzic / dziecko:

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

Nie wiem jednak, jak je połączyć, gdy są oddzielone górą 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>

Chyba powinienem użyć „itemref” lub czegoś w celu powiązania powiązanych zakresów, ale nie mogę sprawić, żeby działało. Spojrzenie na podobne pytania nie pomogło w tym przypadku.

AKTUALIZACJA: zauważ, że szczególnie szukam rozwiązania, które działa poprzez pewnego rodzaju odwołania i NIE DZIAŁA poprzez zagnieżdżanie dowolnego typu. Również kolejność drugiego (niedziałającego) przykładu musi pozostać taka sama (najpierw zdarzenie, drugie ćwiczenie). (Istnieje kilka przyczyn, na które nie mam wpływu).

W szczególności „to działa” jest zdefiniowane jako narzędzie przynajmniej fragmentów rozszerzonych Google, pokazujące, że elementy SĄ połączone ze sobą (tak jak w przypadku pierwszego działającego przykładu)

Matija Nalis
źródło

Odpowiedzi:

9

Możesz użyć itemrefatrybutu.

Z specyfikacji Microdata ( Nota grupy roboczej W3C ):

  • 4.2 Podstawowa składnia :

    Właściwości, które nie są potomkami elementu z itemscopeatrybutem, można powiązać z elementem za pomocą itemrefatrybutu. Ten atrybut pobiera listę identyfikatorów elementów do przeszukania oprócz przeszukiwania elementów podrzędnych elementu za pomocą tego itemscopeatrybutu.

  • 5.2 Pozycjeitemref :

    Elementy z itemscopeatrybutem mogą mieć itemrefokreślony atrybut, aby uzyskać listę dodatkowych elementów do przeszukania w celu znalezienia par nazwa-wartość elementu.


EDYCJA : Powinno to działać zgodnie z wymaganiami wymienionymi w pytaniu:

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

EDYCJA 2 (na dodatkowe wymaganie ): Jeśli element nadrzędny określa inny element (np. A WebPagena body), powyższe rozwiązanie nie działa, ponieważ wówczas eventwłaściwość dotyczyłaby również elementu WebPage, co nie byłoby poprawne.

Nie ma na to dobrego rozwiązania.

Brzydką poprawką byłoby dodanie innego elementu (z itemscope), ale bez żadnego typu (bez itemtype) jako elementu nadrzędnego Event. W ten sposób eventwłaściwość będzie miała zastosowanie do tego nietypowego elementu, a nie do 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
źródło
Czy możesz podać przykład, który działałby podany powyżej? Próbowałem od wielu godzin i nie udało mi się go uruchomić (sprawdzanie poprawności na przykład w narzędziu Google Rich Snippets ). Mogłem tylko dodać kilka innych par nazwa = wartość, które zostały zduplikowane w innym zakresie przedmiotów i miały tę samą nazwę - jak wspomniano w podobnym pytaniu ; ale nie udało mi się dołączyć innego zakresu przedmiotów - co jest pytaniem)
Matija Nalis,
@MatijaNalis: Dodałem fragment do mojej odpowiedzi.
Unor
Dzięki, to było dokładnie to, czego szukałem! Łączy je ze sobą zgodnie z potrzebami w tym uproszczonym niezależnym przykładzie HTML. Niestety narzędzie Google Rich Snippets zgłasza błąd w bardziej złożonym przykładzie w przypadku zdarzenia „Błąd: strona zawiera właściwość”, który nie jest częścią schematu. ” (cała strona zawiera więcej elementów div rodzica, problematyczne to na przykład schema.org/Webpage )
Matija Nalis,
Wszelkie pomysły, jak to naprawić? Usunięcie itemprop = "event" ze schema.org/Event nie pomaga, ponieważ nie łączy ze sobą zakresów przedmiotów ...
Matija Nalis,
@MatijaNalis: Dodałem kolejny fragment, ale to prawdopodobnie nie rozwiązuje tego problemu. Sądzę, że musiałbyś rozebrać WebPageznaczniki nadrzędne i też itemreftam użyć , aby nie zawierały (niepowiązanych) typów elementów jako elementów podrzędnych. Prawdopodobnie powinno być inne pytanie.
unor
1

Jeśli dobrze rozumiem twoje pytanie, po prostu nie zamykaj tego 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>

Dopóki nie zostanie znaleziony pasujący znacznik, wszystko, co znajduje się w tym początkowym div, nadal będzie uważane za część tego początkowego div, w takim przypadku Event.

powstać przeciwko
źródło
Niestety nie mogę używać żadnego rodzaju zagnieżdżania (w oryginalnym, znacznie bardziej złożonym projekcie, są one w całkiem różnych pod-szablonach, z których każdy musi mieć zamkniętą strukturę HTML), ani zmieniać kolejności (między innymi wyświetlać przyczyny). Zaktualizowałem pytanie, aby to wyjaśnić. Pamiętaj również, że twoja odpowiedź nie zostanie zweryfikowana, ponieważ ExerciseAction nie może być potomkiem zdarzenia (możliwe jest tylko odwrócenie), a zatem nie ma elementuprop wymaganego do połączenia ich ze sobą.
Matija Nalis,
@MatijaNalis Jedynym powodem, dla którego się nie sprawdził, było skopiowanie tekstu podanego w pytaniu. Wystąpił błąd, ponieważ zdarzenie miało się rozpocząć w przeszłości, 2002-02-02. Po aktualizacji do przyszłej daty działa. Wiem też, że zaktualizowałeś teraz swoje pytanie, wyświetlając informację, że nie chcesz żadnego rodzaju zagnieżdżania, ale tylko po to, aby Cię powiadomić, o ile druga część danych, które wprowadzasz w pierwotnym „Zdarzeniu”, nie znajduje się w „ ExerciseAction „div, nadal będzie działać. Na przykład przenieś „startDate” z mojej odpowiedzi do div zamykającego „ExerciseAction” i nadal będzie działać.
powstanie przeciwko
1

@Guisasso ma rację, po prostu nie zamykasz elementu. Ale z innej uwagi nie ograniczasz się do używania schematu tylko w elementach DIV i używania zakresów, jak to sugeruje (same przykłady). Jeśli cała strona dotyczy rzeczy związanych ze zdarzeniem, a dotyczy to całej witryny, sensowniejsze może być użycie elementu body, co oznacza, że ​​twój szablon, jeśli masz taki, automatycznie zajmuje się otwieraniem schematu i zamykaniem. W ten sposób Twoje artykuły wypełniają tę treść, gdy szablon ją ustawia.

Na przykład:

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

Lub możesz użyć go w elemencie MAINlub ARTICLE, jeśli używasz HTML5.

Simon Hayter
źródło
zobacz komentarz do Guisasso, twoja odpowiedź nie działa z tych samych powodów. Zaktualizowałem pytanie, aby wyjaśnić moje potrzeby.
Matija Nalis,
1

Uruchomiłem też właściwość additionalType , której można użyć w następujący sposób

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

chociaż pomaga to w moim podstawowym problemie (niemożność zmiany kolejności relacji dziecko-rodzic w ćwiczeniu / zdarzeniu), nie pomaga w innym problemie (niemożność zagnieżdżenia tych div) i jest trochę kludgy (nie tworzy taki sam semantyczny jak oryginalny przykład roboczy). Jest to jednak przydatne, ponieważ umożliwia łączenie typów elementów schema.org, które nie mają zamierzonych elementów do łączenia, więc możesz połączyć np. Book to SportsEvent lub cokolwiek innego.

Odpowiadam sobie na wypadek, gdyby to pomogło komuś innemu z podobnym problemem, ponieważ tak naprawdę mi to nie pomaga (chociaż może to być ostatnia szansa, jeśli nic lepszego nie wyjdzie)

Matija Nalis
źródło