- From: Pekka Kilpelainen <kilpelai@masto.uku.fi>
- Date: Thu, 10 May 2001 16:26:38 +0300 (EET DST)
- To: www-xml-query-comments@w3.org
- cc: Pekka Kilpelainen <kilpelai@masto.uku.fi>
Comment on XQuery Issue 26: Identity-based equality operator
(xquery-equality-identity);
Originator: Algebra Editors;
Locus: xquery-algebra
Description: Do we need an identity-based equality operator? Please justify
your answer with sample queries. Note that XPath gets along without it.
- - -
I think that an identity-based equality operator IS useful, and that
some operator with an identity-based semantics (like INTERSECT) is
necessary for some queries. For example, "Locate <crossref> elements
that refer to their own ancestor elements":
FOR $c IN //crossref
WHERE SOME $a IN $c/ancestor::* SATISFIES
$a == $c/@refid->*
RETURN $c
Using value-based equality operator (that is, $a = $c/@refid->*) above would
select <crossref> elements that refer to a node whose textual value
happens to be similar to the content of some ancestor of the <crossref>
element.
The above query could be alternatively expressed using
INTERSECT, whose semantics is built on identity-based equality:
FOR $c IN //crossref
WHERE NOT empty($c/ancestor::* INTERSECT $c/@refid->*)
RETURN $c
XPath does not have object identity for nodes, but XSLT has introduced a
work-around function called generate-id() for comparing nodes by unique
string identifiers. Thus it is possible, for example, to simulate XQuery
sample query Q16
<critical_sequence>
LET $p := //procedure[1]
FOR $e IN //* AFTER ($p//incision)[1]
BEFORE ($p//incision)[2]
RETURN shallow($e)
</critical_sequence>
by the following XSLT template rule:
<xsl:template match="/">
<critical_sequence>
<xsl:variable name="p" select="//procedure[1]" />
<!-- FOR $e in AFTER ($p//incision)[1]: -->
<xsl:for-each select="$p//incision[1]/following::*">
<xsl:variable name="e" select="." />
<!-- ... and BEFORE ($p//incision)[2]: -->
<!-- (Note generate-id() for expressing node equality) -->
<xsl:if test="($p//incision)[2]/preceding::*[
generate-id(.) = generate-id($e)]">
<!-- Make a "shallow copy" of $e: -->
<xsl:element name="{name($e)}">
<xsl:for-each select="@*">
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:element>
</xsl:if>
</xsl:for-each>
</critical_sequence>
</xsl:template>
Regards, Pekka Kilpeläinen
P.S. Could you moderate the mailing list archive (at
http://lists.w3.org/Archives/Public/www-xml-query-comments/)? Some of its
contents seem to be inappropriate spam.
Pekka Kilpelainen, Univ. of Kuopio, Dept. of Computer Science & Applied Math
email: Pekka.Kilpelainen@cs.uku.fi
phone: +358 17 163761, fax: +358 17 162595
http://www.cs.uku.fi/~kilpelai/
Received on Thursday, 10 May 2001 09:27:22 UTC