Ada yang tahu cara mendapatkan posisi node menggunakan xpath?
Katakanlah saya memiliki xml berikut:
<a>
<b>zyx</b>
<b>wvu</b>
<b>tsr</b>
<b>qpo</b>
</a>
Saya dapat menggunakan kueri xpath berikut untuk memilih <b> node (<b> tsr </b>) ketiga:
a/b[.='tsr']
Yang mana semuanya baik dan bagus tetapi saya ingin mengembalikan posisi ordinal dari simpul itu, seperti:
a/b[.='tsr']/position()
(tapi sedikit lebih berhasil!)
Apakah itu mungkin?
edit : Lupa menyebutkan saya menggunakan .net 2 jadi xpath 1.0!
Pembaruan : Akhirnya menggunakan jawaban yang sangat baik dari James Sulak . Bagi yang tertarik, inilah implementasi saya di C #:
int position = doc.SelectNodes("a/b[.='tsr']/preceding-sibling::b").Count + 1;
// Check the node actually exists
if (position > 1 || doc.SelectSingleNode("a/b[.='tsr']") != null)
{
Console.WriteLine("Found at position = {0}", position);
}
Jawaban:
Mencoba:
sumber
Anda dapat melakukan ini dengan XSLT tetapi saya tidak yakin tentang XPath langsung.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/> <xsl:template match="a/*[text()='tsr']"> <xsl:number value-of="position()"/> </xsl:template> <xsl:template match="text()"/> </xsl:stylesheet>
sumber
Saya menyadari bahwa posting itu kuno .. tapi ..
mengganti asterisk dengan nama noden akan memberikan hasil yang lebih baik
dari pada
sumber
Jika Anda pernah memutakhirkan ke XPath 2.0, perhatikan bahwa ini menyediakan indeks fungsi , ini menyelesaikan masalah dengan cara ini:
Dimana:
sumber
Tidak seperti yang dinyatakan sebelumnya, 'preceding-sibling' sebenarnya adalah sumbu untuk digunakan, bukan 'preceding' yang melakukan sesuatu yang sangat berbeda, ia memilih semua yang ada di dokumen sebelum tag awal dari node saat ini. (lihat http://www.w3schools.com/xpath/xpath_axes.asp )
sumber
Sekadar catatan atas jawaban yang dilakukan oleh James Sulak.
Jika Anda ingin mempertimbangkan bahwa node mungkin tidak ada dan ingin menyimpannya murni XPATH, maka coba berikut ini yang akan mengembalikan 0 jika node tidak ada.
sumber
Masalahnya adalah posisi node tidak berarti banyak tanpa konteks.
Kode berikut akan memberi Anda lokasi node di node anak induknya
sumber
Saya melakukan banyak hal tentang Manajer Identitas Novell, dan XPATH dalam konteks itu terlihat sedikit berbeda.
Asumsikan nilai yang Anda cari ada dalam variabel string, disebut TARGET, maka XPATH adalah:
Selain itu, disebutkan bahwa untuk menghemat beberapa karakter ruang, berikut ini juga akan berfungsi:
Saya juga memposting versi yang lebih cantik dari ini di Novell's Cool Solutions: Menggunakan XPATH untuk mendapatkan node posisi
sumber