xsl-list
[Top] [All Lists]

Re: [xsl] General rule for designing XPath expressions to return items in document order?

2014-01-10 06:01:37

On 10 Jan 2014, at 10:56, Costello, Roger L. <costello(_at_)mitre(_dot_)org> 
wrote:

David wrote:

      I haven't checked the streaming rules in detail 
      but I would expect //head to be streamable. 
      (You might not be able to access any of the
      child nodes in a streamable way but for example 
      count(//head) ought to be able to count all the 
      head in the document in a single pass.

Michael responded:

      That's a fair summary. //head is "consuming" 
      (it reads the input stream), and "crawling" 
      (it accesses all the nodes in the subtree). When 
      you get an expression that is consuming and 
      crawling, you are allowed to do "inspection" 
      operations on the result, for example count()

But Michael doesn't that contradict section 19.1 of the XSLT 3.0 
specification: 

      For example <xsl:value-of select="//head"/> will 
      still fail the streamability tests, because of the 
      possibility that one head element is a child of 
      another. This problem can be remedied by 
      writing <xsl:value-of select="//head/text()"/>.


No, there's no contradiction:

(1) <xsl:value-of select="//head"/> isn't allowed for the same reasons that 
//head/data() isn't allowed: xsl:value-of is an "absorption" operation.

(2) The fact that <xsl:value-of select="//head/text()"/> is allowed doesn't 
contradict anything I said. It's allowed because

a) Under section 19.1, it gets turned into //text()[parent::head] or equivalent

b) Unlike //head, //text() is "striding" - the nodes it selects are 
non-overlapping (because text nodes never overlap). So absorption operations 
like data(), string(), and <xsl:value-of> are allowed.

I suspect you're making the mistake of thinking that //head/text() is very 
similar to //head/string(). But that's only true when every <head> element has 
a single text node child.

Michael Kay
Saxonica



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


<Prev in Thread] Current Thread [Next in Thread>