1. preceding-sibling:
Instead of <xsl:if test="self::node()[1]"> use <xsl:if
test="not(preceding-sibling::field/@id = @id)">
won't this return the very first field in document order?
No, it only tests whether there is not a preceding-sibling field
element, which has the same @id like the current one.
You can write "not(preceding-sibling::field[@id = current()/@id])" if
you want.
It is my understanding that if you have:
<a>
<f id="1"/>
<f id="2"/>
<f id="2"/>
</a>
and you happen to be on the 3rd f node you would get:
preceding-sibling::field/@id=1
and current()/@id=2
but if you use:
preceding-sibling::field[1]/@id=2
Is this wrong?
It's not soo wrong ;-) All your statements are correct when using
<xsl:value-of select="..."/>. And they were correct if I had used
"preceding-sibling::field/@id != @id.