This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Nodeset equality, inequality, and relational operations in XPath



The definition of nodeset equality, inequality, and relational operations
in XPath seems more than a little unusual to me.

For equality, XPath 3.4 says:
   "Comparison of the resulting objects is defined in the following three
   paragraphs. First, comparisons that involve node-sets are defined in
   terms of comparisons that do not involve node-sets; this is defined
   uniformly for =, !=, <=, <, >= and >. [...]

   If both objects to be compared are node-sets, then the comparison will be
   true if and only if there is a node in the first node-set and a node in the
   second node-set such that the result of performing the comparison on the
   string-values of the two nodes is true."

Now, if I have interpreted those paragraphs correctly,
that means given the nodesets
    NS1: {<a>-1</a>, <b>0</b>, <c>1</c>} 
and
    NS2: {<X>0</X>}
that:
    NS1 = NS2 	(the string value of the node <X>0</X> in the second set
		 is equal to the string value of the node <b>0</b>)
and:
    NS1 != NS2 	(the string value of the node <X>0</X> in the second set
		 is not equal to the string value of the node <a>-1</a>)
and:
    NS1 < NS2 	(the string value of the node <X>0</X> in the second set
		 is > the string value of the node <a>-1</a>)
and:
    NS1 > NS2 	(the string value of the node <X>0</X> in the second set
		 is < the string value of the node <c>1</c>)
and:
    NS1 >= NS2 	(the string value of the node <X>0</X> in the second set
		 is >= the string value of the node <b>0</b>)
and:
    NS1 <= NS2 	(the string value of the node <X>0</X> in the second set
		 is >= the string value of the node <b>1</b>)
!!

Testing with XT suggests this interpretation is right. Given the styleseheet:
    <?xml version="1.0" ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		    version="1.0">

    <xsl:output method="text" />
    <xsl:template match="doc">
	<xsl:variable name="NS1" select="(a|b|c)" />
	<xsl:variable name="NS2" select="X" />
	"NS1 = NS2"  <xsl:value-of select="$NS1 = $NS2"     />.
	"NS1 != NS2" <xsl:value-of select="$NS1 != $NS2"    />.
	"NS1 &gt; NS2"  <xsl:value-of select="$NS1 &gt; $NS2"  />.
	"NS1 &lt; NS2"  <xsl:value-of select="$NS1 &lt; $NS2"  />.
	"NS1 &gt;= NS2" <xsl:value-of select="$NS1 &lt;= $NS2" />.
	"NS1 &lt;= NS2" <xsl:value-of select="$NS1 &gt;= $NS2" />.
    </xsl:template>
    </xsl:stylesheet>

and the document:
    <doc>
    <a>-1</a>
    <b>0</b>
    <c>1</c>
    <X>0</X>
    </doc>

XT reports:
    
    "NS1 = NS2"  true.
    "NS1 != NS2" true.
    "NS1 > NS2"  true.
    "NS1 < NS2"  true.
    "NS1 >= NS2" true.
    "NS1 <= NS2" true.

So -- anyone care to:
    * enlighten me as to the correct interpretation of XPath 3.4
      (which would indicate XT's behaviour is wrong... unlikely)
or:
    * suggest a rationale for the strange-seeming definition of nodeset
      relationships?

As it stands, the definition of nodeset relationships seems utterly
internally consistent and... utterly useless? While I like the former
characteristic :-), surely a definition such as:

   If both objects to be compared are node-sets, then the comparison will be
   true if and only if for each node in document order in the first node-set
   there is a corresponding node in the second node-set such that the result
   of performing the comparison on the string-values of the two nodes is true.

would have been more intuitive, less expensive to evaluate, and (arguably) more
useful? Other equally reasonable definitions are also seem possible, of course.


Michael Fuller
____________________________________________
http://www.mds.rmit.edu.au/~msf/
Multimedia Databases Group, RMIT, Australia.


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]