Ostatnio przy tworzeniu transformaty XSLT natknąłem się na taki malutki problem.
Miałem mniej więcej taką strukturę XML:

xml version=1.0 encoding=utf-8?>

<body>

  <div>

    <div>

      <h3>h3>

      <ul>

        <li>li>

        <li>li>

        <li>li>

      ul>

      <h3>h3>

      <ul>

        <li>li>

        <li>li>

      ul>

    div>

    <div>

      <h3>h3>

      <ul>

        <li>li>

        <li>li>

        <li>li>

      ul>

    div>

  div>

body>

Zależało mi na wszystkich elementach

i

    (uzyskanych za pomocą wyrażenia “div/*”) i z napisaniem odpowiedniego zapytania XPath nie było problemu. Problem miałem, gdy próbowałem będąc na konkretnym elemencie

    , pobrać wszystkie elementy

  • z sąsiadującego elementu
      .

      Gdy mając kolekcję wszystkich elementów

      oraz

        próbowałem dostać się do następnego elementu przy użyciu operatora nawiasów kwadratowych i indeksu [] dostawałem dziwny rezultat.

        Dla zapytania “../../div/*[2]” zwracana była kolekcja dwóch elementów

          , z obu elementów

          (elementy zaznaczone pogrubioną czcionką w powyższym kodzie), a więc próbując dostać się do elementów

        • za pomocą “../../div/*[2]/li” otrzymywałem zbyt dużo elementów.

          Rozwiązanie okazało się banalne. Wystarczyło dodać parę nawiasów grupujących działania. Poprawny XPath to: “(../../div/*)[2]/li”. Gdy jesteśmy na elemencie

          wybierze on wszystkie elementy

        • z przyległego elementu
            i tylko z niego :-).

            Oczywiście rozwiązanie podsuną MSDN.