On Sun, 29 Nov 2009 12:46:16 +0100, Tim van Oostrom <t...@depulz.nl> wrote:
Philip Jägenstedt wrote:
On Thu, 26 Nov 2009 22:30:41 +0100, Tim van Oostrom <t...@depulz.nl>
wrote:
Hi, I made a forumpost :
http://forums.whatwg.org/viewtopic.php?t=4176, concerning a possible
"microdata specification bug" and a bug in the james.html5.org
microdata extractor.
Comes down to <link/> and <meta/> elements possibly being unfit for
use with the itemscope attribute.
I made an example in the forum post with some nice ubb formatting .
There are some other issues with <link> and <meta> you might want to
review first: [1]
Ok
Your second example was:
<div itemtype="http://url.to/geoVocab#country" itemscope>
<span itemprop="http://xmlns.com/foaf/spec/index.rdf#name"
lang="cn">中華人民共和國</span>
<span itemprop="http://xmlns.com/foaf/spec/index.rdf#name"
lang="en">China</span>
<link itemprop="http://url.to/city" href="http://url.to/shanghai"
itemscope itemref="city-shanghai" />
<div id="city-shanghai">
<span
itemprop="http://xmlns.com/foaf/spec/index.rdf#name">Shanghai</span>
<span itemprop="http://url.to/demoVocab#population">14.61 million
people</span>
<span itemprop="http://url.to/physicsVocab#time"
datetime="2009-11-26 11:43">11:43 pm (CT)</span>
</div>
</div>
By using itemprop+itemscope, you're saying that the property is itself
an item. Also specifying href="http://url.to/shanghai" does nothing.
I also pointed that out in my forumpost.
I probably didn't read it all closely enough to see which parts were
misunderstandings and which parts were intentionally testing the limits of
the spec, sorry if I hit you on the head with things you already knew.
<link>, <meta> and any other void elements are usually the wrong choice
for itemprop+itemscope because they don't have child elements, so
itemref is the only way to add properties.
Yes, see forumpost. Shouldn't this be noted in the Spec then ? (maybe i
read over it)
Yes, the spec certainly needs some notes on how to use <link> and <meta>.
What you've accidentally done above is add the 3 properties of Shanghai
to both the top-level item and the sub-item, see [2] for details.
Well, i did it in full awareness, i interpreted the itemref attribute
like this. But if it can't be used this way, isn't this a setback on the
flexibility of itemref? Or was it intended this way.
According to this an "itemref" attribute can never be added to an "item"
within an itemscope of another "item" without the crawled prop/val pairs
also applying to the ancestors itemscope.
Ah, I think you've found the root of the problem. By allowing a property
to be part of several items at once, we get different kinds of strange
problems. Except from messing up your example, it seems it is the real
cause for the infinite recursion bug I wrote about in [1]. Then I was so
focused on the recursion that I suggested a rather complex solution to
detect loops in the microdata, when it seems it could be solved simply be
making sure that a property belongs to only 1 item. Detailed suggestion
below.
[snip Amanda example]
[snip most of what Shanghai is to China]
Assigning "unique" properties to Subjects for RDF's sake doesn't seem
like a good idea to me.
Ofcourse i can make other, more sensible, html markup but the whole
point of a solid annotating language is that i can apply it to my
existing markup without changing it.
Hehe, I wasn't suggesting a unique predicate for each combination of
country and city, just trying to sort out what is the itemprop and what is
the itemtype in your example. If you want RDF I suppose you have to find
some vocabulary that has a predicate that makes sense as China *predicate*
Shanghai.
If <http://url.to/shanghai> is a global identifier for Shanghai you
should use itemid.
Correct, but the href="" is ignored in that example. If it only
concerned a property i'd use :
<link itemprop="http://url.to/city" href="http://url.to/shanghai" />
and it would be valid. I used it to show my point about <link/> and
itemscope, see forumpost.
In this example, I really don't see why you would use <link> to make a
sub-item to begin with. Perhaps we should make itemscope on <link> and
<meta> invalid in order to warn people of the problem?
I don't know what <http://url.to/physicsVocab#time> is, but note that
an exact time isn't very useful without a timezone, so I added the PRC
timezone for you. I'll also note that using traditional Chinese for the
full name of the PRC is an odd choice, so I changed it to simplified
Chinese above.
Marking up the population as "14.61 million people" isn't terribly
helpful if you want a computer to be able to find the city with the
biggest population among several cities, unless your vocabulary defines
how to parse "14.61 million people" into a number, which would be
strange. In any case this is hidden metadata unless you want 14610000
or some other easily machine-parsable representation to be visible in
the page rendering.
Ok but using content="" on a span, is that valid ? Your suggestion in
[1] would be nicer. But i prefer the use of <link/> and <meta/> elements.
Oops, my suggestion is broken, I mean to write:
<span hidden itemprop="http://url.to/demoVocab#population">14610000</span>
Finally, I think <http://xmlns.com/foaf/spec/index.rdf#name> should be
<http://xmlns.com/foaf/0.1/name>. If you're going to use existing
vocabularies like FOAF and want your data to be play nice with the RDF
world, make sure to check that the result of the RDF extraction
algorithm [3] is what you intended.
This remains unclear to me. For example : http://xmlns.com/foaf/0.1/name
redirects to an html page but : http://purl.org/dc/terms/title redirects
to an .rdf file. For readability, wouldn't
http://xmlns.com/foaf/spec/#term_name and
http://dublincore.org/documents/dcmi-terms/#elements-title be better ?
If i dereference these url's i find the information i want in one stop.
If you want to reuse an RDF vocabulary you have to use byte-by-byte the
exact same URIs. I agree that finding the correct URI is quite difficult
because treating them as a URL and looking them up in a browser will often
redirect you. I got <http://xmlns.com/foaf/0.1/name> by looking at the
namespace declaration used for foaf and appending "name".
In particular, you probably want to use itemid where possible and make
sure that all your URIs are exactly correct. Personally, though, unless
I could reuse existing vocabularies for every single item and property,
I would only use a full URI for itemtype and point that to a vocabulary
that defines what simpler property names like "name" and "city" mean
and how to convert the vocabulary to RDF.
[1]
http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-November/024116.html
[2]
http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#the-properties-of-an-item
[3]
http://www.whatwg.org/specs/web-apps/current-work/multipage/converting-html-to-other-formats.html#rdf
Now, back to the problem of one property, multiple items. The algorithm
for finding the properties of an item [2] is an attempt at optimizing the
search for properties starting at an item element. I think we should
replace this algorithm with an algorithm for finding the item of a
property. This was previously the case with the spec before the itemref
mechanism. I would suggest something along these lines:
1. let current be the element with the itemprop attribute
2. if current has an ID, for each element e in document order:
2.1. if e has an itemref attribute:
2.1.1. split the value of that itemref attribute on spaces. for each
resulting token, ID:
2.1.1.1. if ID equals the ID of current, return e
3. reaching this step indicates that the item wasn't found via itemref on
this element
4. let parent be the parent element of current
5. if parent is null, return null
6. if parent has the itemscope attribute, return parent
7. otherwise, let current be parent and jump to step 2.
This algorithm will find the parent item of a property, if there is one.
itemref'ing takes precedence over "parent-child linking", so in Tim's
example the properties of Shanghai would be applied to only the Shanghai
sub-item. I'm not convinced writing markup like that is a good idea, but
at least this way it has sane processing. HTMLPropertiesCollection on any
given element would simply match all elements in the document for which
the the algorithm returns that very element. It should be invalid for
there to be any elements in the document with itemprop where this
algorithm returns null or the element itself.
I will try implementing this algorithm in MicrodataJS [3] and see if it
works OK. While it may look less efficient than the current algorithm,
consider that a browser won't implement either algorithm as writting, only
act as if they did. The expensive step of going through all elements with
itemref attributes is actually no more expensive than e.g.
document.querySelector('.classname') if implemented natively.
[1]
http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-November/024095.html
[2]
http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#the-properties-of-an-item
[3] http://gitorious.org/microdatajs
--
Philip Jägenstedt