Hello,
If I understand the spec for this function[1] correctly, at most one element should be returned for a given ID value:
"If several elements have the same ID value, then E is the one that is first in document order." ("Rules", item 3)
BaseX behaves differently from e.g. Saxon in this respect. The query:
let $doc := document{<foo xml:id='a1'><bar xml:id='a1'/></foo>}
return ( 'Saxon-HE 11.6:', xslt:transform($doc, <xsl:stylesheet xmlns:xsl=" http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="3.0">
<xsl:template match="/"> <xsl:sequence select="id('a1')"/> </xsl:template>
</xsl:stylesheet>), 'BaseX 10.7:', $doc/id('a1') )
returns:
Saxon-HE 11.6: <foo xml:id="a1"><bar xml:id="a1"/></foo> BaseX 10.7: <foo xml:id="a1"><bar xml:id="a1"/></foo> <bar xml:id="a1"/>
i.e. Saxon returns only the first in document order, whereas BaseX returns both of them.
Grateful for your thoughts, Andrew
Hi Andrew,
A precious observation; it appears there isn’t a single test case for that in the W3 test suite. We’ll fix it with the next release; until then, you can use head(id(...)).
Thank you, Christian
On Wed, Jul 24, 2024 at 6:14 PM Andrew Sales andrew@andrewsales.com wrote:
Hello,
If I understand the spec for this function[1] correctly, at most one element should be returned for a given ID value:
"If several elements have the same ID value, then E is the one that is first in document order." ("Rules", item 3)
BaseX behaves differently from e.g. Saxon in this respect. The query:
let $doc := document{<foo xml:id='a1'><bar xml:id='a1'/></foo>}
return ( 'Saxon-HE 11.6:', xslt:transform($doc, <xsl:stylesheet xmlns:xsl=" http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="3.0">
<xsl:template match="/"> <xsl:sequence select="id('a1')"/> </xsl:template>
</xsl:stylesheet>), 'BaseX 10.7:', $doc/id('a1') )
returns:
Saxon-HE 11.6: <foo xml:id="a1"><bar xml:id="a1"/></foo> BaseX 10.7: <foo xml:id="a1"><bar xml:id="a1"/></foo>
<bar xml:id="a1"/>
i.e. Saxon returns only the first in document order, whereas BaseX returns both of them.
Grateful for your thoughts, Andrew
basex-talk@mailman.uni-konstanz.de