Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: xPath: łącze do elementów z wartością (swoją)...
Forum PHP.pl > Forum > XML, AJAX > XML
ignition
mając plik xml:
  1. <plik>
  2.  
  3. <person>
  4. <name>Blabla</name>
  5.  
  6. <inf>
  7. <about>I'm <strong> strong </strong></about>
  8. <desc> some information
  9. <i id='1'>I like you</i>
  10. <i id='2'>blabla</i>
  11. </desc>
  12.  
  13. <zle>
  14. <z id='1'>text1</z>
  15. <z id='2'>text2</z>
  16. </zle>
  17.  
  18. </inf>
  19.  
  20. </person>
  21.  
  22. </plik>

Chcę się dostać przez xPatha do elementów które posiadają swoją wartość, ale nie w ich dzieciach. Czyli pytanie powinno w tym przypaku nie zwrócić łącza np. do <zle>, który nie posiada sam w sobie wartości, lecz oddzielnie do jego dzieci które posiadają wartość <z>. Stosowłem min. pytania *//*[text()] oraz *//*[count(text()) = 1] ale one są złe.
orson
witam ...

Kod
//*/[text(attribute::*)]

questionmark.gif
ps. ten slasz po * jest chyba potrzebny bo chcesz sprawdzać atrybuty dla dzieci .... polecam man do xpatha (bardzo pomocny) http://www.w3.org/TR/1999/REC-xpath-19991116.html
pozdrawiam
ignition
Nie chce wartości atrybutów lecz samego elementu. Po drugie Orson twoje zapytanie jest błędne.
orson
witam ...

hmm ... chcesz otrzymać text zawarty w ostatnich atrybutach w ścieżce questionmark.gif czyli np: Blabla, I like you albo text1 questionmark.gif? jeżeli tak to twoje pytanie
Kod
*//*[count(text()) = 1]

jest poprawne ... z twojego dokumentu otrzymałem taki wynik:
Kod
Array
(
    [0] => SimpleXMLElement Object
        (
            [0] => Blabla
        )

    [1] => SimpleXMLElement Object
        (
            [strong] =>  strong
        )

    [2] => SimpleXMLElement Object
        (
            [0] =>  strong
        )

    [3] => SimpleXMLElement Object
        (
            [0] => I like you
        )

    [4] => SimpleXMLElement Object
        (
            [0] => blabla
        )

    [5] => SimpleXMLElement Object
        (
            [0] => text1
        )

    [6] => SimpleXMLElement Object
        (
            [0] => text2
        )
)


pozdrawiam
ignition
No tak, tylko jeśli mamy taki np układ:
  1. <adress-book>
  2.      <person id="1">
  3.            <a>
  4.                  <b>jakiś tekst 0</b>
  5.                  <c>jakiś tekst 0.5</c>
  6.            </a>
  7.      </person>
  8.      <person id="2">
  9.            <a>
  10.                  jakiś tekst
  11.                  <b>
  12.                        jakiś tekst 2
  13.                        <c>
  14.                              jakiś tekst 3
  15.                        </c>
  16.                  </b>
  17.            </a>
  18.      </person>
  19. </adress-book>


to przy pytaniu *//*[count(text()) = 1]:
odda mi:
Kod
Array
(
    [0] => SimpleXMLElement Object
        (
            [0] => jakiś tekst 0
        )

    [1] => SimpleXMLElement Object
        (
            [0] => jakiś tekst 0.5
        )

    [2] => SimpleXMLElement Object
        (
            [0] => jakiś tekst 3    
        )

)

a ja chciałbym by zwrócił mi każdy element który posiada wartość tekst nie licząc w potomnych elementach, czyli:
Kod
Array
    [1] => SimpleXMLElement Object
        (
            [0] => jakiś tekst 0
        )

    [2] => SimpleXMLElement Object
        (
            [0] => jakiś tekst 0.5
        )

    [3] => SimpleXMLElement Object
        (
            [0] => jakiś tekst
        )

    [4] => SimpleXMLElement Object
        (
            [0] => jakiś tekst 2
        )

    [5] => SimpleXMLElement Object
        (
            [0] => jakiś tekst 3
        )
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.