Re: position vs index

/ ht@inf.ed.ac.uk (Henry S. Thompson) was heard to say:
| Norman Walsh writes:
|
|> Whether we spell "position()" with or without a "p:" prefix, do we
|> agree that the following pipeline
|>
|> <p:pipeline xmlns:p="http://www.w3.org/2007/03/xproc"
|> 	    name="pipeline">
|>
|> <p:output port="result"/>
|>
|> <p:for-each>
|>   <p:iteration-source>
|>     <p:inline><doc v="test" s="test">one</doc></p:inline>
|>     <p:inline><doc v="test" s="test">two</doc></p:inline>
|>     <p:inline><doc v="test" s="test">three</doc></p:inline>
|>     <p:inline><doc v="test" s="test">four</doc></p:inline>
|>   </p:iteration-source>
|>   <p:output port="result"/>
|>
|>   <p:string-replace>
|>     <p:option name="match" value="doc/@v"/>
|>     <p:option name="replace" value="p:position()"/> <!-- NB: value= -->
|>   </p:string-replace>
|>
|>   <p:string-replace>
|>     <p:option name="match" value="doc/@s"/>
|>     <p:option name="replace" select="p:position()"/> <!-- NB: select= -->
|>   </p:string-replace>
|> </p:for-each>
|>
|> </p:pipeline>
|>
|> produces
|>
|> <doc v="1" s="1">one</doc>
|> <doc v="1" s="2">two</doc>
|> <doc v="1" s="3">three</doc>
|> <doc v="1" s="4">four</doc>
|>
|> That is, the position function evaluated in the context of the
|> for-each counts the iterations through the sequence, but the position
|> function evaluated in the context of the inputs passed to the
|> string-replace function only ever sees one document because it doesn't
|> receive a sequence.
|
| I don't see why these should be different.  My original proposal was
| that in the context of an iteration, p:position would always tell you
| what the position of the document being processed in the subpipeline
| is -- why should that be different in at the margin of the component,
| or inside it?

Do we agree that *outside* the context of a for-each, if the input to
this step is a sequence of three documents:

  <p:matching-documents>
    <p:option name="test" value="p:position() mod 2 = 1"/> <!-- NB: value= -->
  </p:string-replace>

then the p:position() function will return "1" for the first document,
"2" for the second document, and "3" for the third document in the
sequence?

If so, then *inside* the context of a for-each, where the input
to this step is a single document (from the 'current' port):

  <p:matching-documents>
    <p:option name="test" value="p:position() mod 2 = 1"/> <!-- NB: value= -->
  </p:string-replace>

the p:position() function must return 1 for the first (and only)
document that matching-documents step sees on its input port.

Anything else would seem wildly inconsistent.

However, if you arrange to have p:position() evaluated before being
passed to the step, i.e., if you use select= instead of value=, then
p:position() is evaluated in the context of the for-each where the
natural thing to do is count the number of documents that have passed
by.

                                        Be seeing you,
                                          norm

-- 
Norman Walsh <ndw@nwalsh.com> | If a little knowledge is dangerous,
http://nwalsh.com/            | where is the man who has so much as to
                              | be out of danger?--Thomas. H. Huxley

Received on Thursday, 24 May 2007 14:32:14 UTC