Re: Viewport and nested selected nodes

Dear,

Well, FWIW, I think it's a dynamic error if the select can select a
subtree in another subtree.
The author has to be more precise
Because, for me the default case, is not so obvious
Given the sample

<div>
 <p>
   <div>
     <math>
        <div/>
    </math>
  </div>
 </p>
 <div>
   <p>
     <div/>
   </p>
 </div>
</div>


I can think of a equal number of cases, where I want to select the
subtrees which do not contain any other subtrees (/div/p/div/math/div
and/div/div/p/div), or to select the subtree which contain the maximum
(/div) or something in between

those case could be written
//div[not(descendant::div)] or //div[not(ancestor::div)]

but in more subtle case (//div[math[@x][@y]]), the xpath expression
could become very difficult to write (and therefore to read)

Regarding this, i'm in favour of a default case, where it is a dynamic error

Then it could be enhanced in V1 or next by defining that
this default case could be materialized by an attribute @behavior
which default value is 'dynamic-error', and could be positionned to
'rootest' (most close to the root) or 'leafest' (more close to the
leaf), with the idea to help keeping the xpath simple.

'rootest' being the most important case for optimization (available as
soon as finded).
'dynamic-error' being used for debugging as default
'leafest' being the most resource consuming (imagine you match the
root, you have to process the whole document, before being sure you
catch the leafest node).

It could furthermore be a case, where we *need* recursion

== rootest case ==
<p:pipeline name="descendant-parser">
  <p:input name='document'/>
  .
  .
  <p:viewport name='bloc-selector' behavior='rootest'>
    <p:input port='bloc' step='step' source='port'
select='//bloc[...very complex predicate...]'/>
    <p:choose>
      <p:when test='...bloc contains other bloc with very complex predicate...'>
        <p:step name='descendant-parser'><!-- recursion -->
          <p:input name='document' step='bloc-selector' source='bloc'/>
          :
        </p:step>
      </p:when>
      <p:otherwise>
        <!-- i process the subtree with the context -->
        :
      </p:otherwise>
    </p:choose>
  </p:viewport>
</p:pipeline>


== leafest case ==
<p:pipeline name="trans-up-parser">
  <p:input name='document'/>
  .
  .
  <p:viewport name='bloc-selector' behavior='leafest'>
    <p:input port='bloc' step='step' source='port'
select='//bloc[...very complex predicate...]'/>
    :
    <!-- process all the leaf first -->
  </p:viewport>
  <p:choose>
    <p:when test='...document out from viewport still contains bloc
with very complex predicate...'>
      <p:step name='trans-up-parser'>
        <p:input name='document' .... />
        :
      </p:step>
    </p:when>
    <p:otherwise>
      <!-- all the bloc with very complex predicate have been processed -->
      :
    </p:otherwise>
  </p:choose>
</p:pipeline>


Regards,

Mohamed


On 10/21/06, Jeni Tennison <jeni@jenitennison.com> wrote:
>
> Hi,
>
> In the example of <p:viewport> in the spec:
>
> <p:viewport name="encdivs">
>    <p:declare-input port="div" step="step" source="port"
>                     select="//h:div[@class='enc']"/>
>    <p:declare-output port="html" step="encrypt" source="result"/>
>    <p:step name="encrypt" type="p:encrypt-document">
>      <p:input name="document" step="encdivs" source="div"/>
>    </:step>
> </p:viewport>
>
> what happens when one selected <div> is a descendant of another selected
> <div>?
>
> I think that viewport should probably filter the selected nodes to only
> those that do not have another selected node as a descendant.
>
> Cheers,
>
> Jeni
> --
> Jeni Tennison
> http://www.jenitennison.com
>
>


-- 
Innovimax SARL
Consulting, Training & XML Development
9, impasse des Orteaux
75020 Paris
Tel : +33 8 72 475787
Fax : +33 1 4356 1746
http://www.innovimax.fr
RCS Paris 488.018.631
SARL au capital de 10.000 €

Received on Sunday, 22 October 2006 06:24:12 UTC