[xsl] Re: XPath riddle

Subject: [xsl] Re: XPath riddle
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Wed, 4 Jul 2001 21:13:18 -0700 (PDT)
Hi Nicholas,

I cannot understand why you exclude a node in your second example -- this node
perfectly matches your definition of the result node-set.

Therefore, you have to provide another definition of the wanted result set.

> Can you tell what the XPath expression that:
>  "selects all C elements that come after A and have a D parent" is.
> 

(//A/following::C | //A/descendant::C)[parent::D]

>  That is, there might be a schema, which declares the unwanted instances of C
>  as integers, while
>  the other C declared has some anonymous complexType.
> 
>  <?xml version="1.0" encoding="UTF-8"?>
>  <A>
>          <B>
>                  <C/>                                            <!-- DO NOT
select this -->
>                  <D>
>                          <!-- recursion is introduced here -->
>                          <C>                                     <!-- select this
-->
>                                  <B>
>                                          <C/>                    <!-- DO NOT
select this -->>
>                                          <D>
>                                                  <C/>            <!-- select this
-->
>                                          </D>
>                                  </B>
>                          </C>
>                  </D>
>          </B>
>  </A>

>  /A//D/C (/A/descendant::D/C) would suffice, or, better, /A//B/D/C
>  (/A/descendant::B/D/C). But this would not rule out the possibility of the
>  B/D/C pattern appearing somewhere after A in another context. 
                                             ^^^^^^^^^^^^^^^^^^  
??????????

What "context"? You do not define any particular "context" in your original
definition of the wanted result set. There's something you haven't told us.

Please, explain this statement.

>  I cannot find
>  any XPath feature that would handle recursion.
> 
>  <?xml version="1.0" encoding="UTF-8"?>
>  <A>
>          <B>
>                  <F>
>                          <B>
>                                  <D>
>                                          <C/>                    <!-- this would
be selected incorrectly -->

Why, it exactly matches your definition -- this is a "C" node that follows "A" and
has a "D" parent.


>                                  </D>
>                          </B>
>                  </F>
>                  <D>
>                          <!-- recursion is introduced here -->
>                          <C>                                     <!-- select this
-->
>                                  <B>
>                                          <C/>                    <!-- DO NOT
select this -->
>                                          <D>
>                                                  <C/>            <!-- select this
-->
>                                          </D>
>                                  </B>
>                          </C>
>                  </D>
>          </B>
>  </A>
> 
>  Using /A/B/D/C | /A/B/D/C//B/D/C would overcome this, but you can see how I
>  could create another problematic example...
>  How does one find one's way around this, using a generic XPath approach?
>  I am not saying this is good XML design. To the contrary! ... it is legal,
>  nonetheless ...any ideas?

Once again, could you provide a correct definition of your result set? The node you
want excluded in your second example matches exactly your definition of the result
set.

Cheers,
Dimitre Novatchev.


__________________________________________________
Do You Yahoo!?
Get personalized email addresses from Yahoo! Mail
http://personal.mail.yahoo.com/

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


Current Thread