2010-10-14 27 views
9

xml yolu ad alanı öneki ayarlandığında aşağıdaki xpath ifadesini çalıştıramadım.xpath ifadesi, ad alanı öneki

/bk:BookStore/bk:Books/bk:Book[text()='Time Machine']

XML'dir:

<BookStore xmlns:bk="http://www.bookstore.com/book#"> 
    <bk:Books> 
    <bk:Book id="1">Time Machine></bk:Book> 
    </bk:Books> 
</bk:BookStore> 
+0

XPath sorgusunu yürüten kodu gönderin. – Tomalak

+3

Önek/ad alanı URI'sını XPath motorunuza bağlamanız gerekir. Niye ya? Öneklerin ad testi için önemli olmadığından, ancak ad alanı URI'sı vardır. Bu nedenle, "a: node", "a" ve "b" önekleri aynı ad alanı URI'sine bağlandığı sürece "b: node" değerini seçebilir. –

cevap

12

(XPath ifadeleri değerlendirmek girişiminde bulunduğu) konak dili bir yararlı tavsiyede sağlamak mümkün değildir hakkında daha fazla bilgi olmadan. Genel olarak, bir ad alanı yöneticisi ile bir ad alanını "kaydettirmek" gerekir ve bu da bir önekin kayıtlı ad alanına ilişkilendirilmesini gerektirir. Daha sonra, bu NamespaceManager nesnesini, XPath-değerlendirme yöntemine bir argüman olarak kullanarak, bu yönteme argüman olarak, o önekin önekine eklenen isimleri içeren bir XPath ifadesi belirlenebilir.

/*/*[local-name()='Books'] ... and so on 

The function local-name doğru olarak commenters belirtildiği gibi, herhangi bir ön ek, yok sayar olabilir: gereksiz öneki olmayan

/*/*[name()='bk:Books']/*[name()='bk:Book' and text()='Time Machine'] 
+0

Java'da xml imzası kullanıyorum. Trasnforms bölümünde xpath kullanarak imzalı elemanları seçtim. Xml belgedeki önekler ve ad alanları olduğunda xpath ifadesini nasıl verebilirim. – Ashwin

+1

@Ashwin: Bu cevap, ad alanlarını kaydetmeden tam olarak bunu nasıl yapılacağını gösterir (olası yollardan biri). İkinci olası yol, ad alanını XPath ifadesinde başvurulan eleman adlarının olduğu önek bağlamalarına kaydetmektir - sonra XPath ifadesi önekler içerebilir ve daha okunabilir olabilir. Bu ikinci yol, uygulama tarafından sağlanan API'ları kaydeden ad alanı için kullanılmasını gerektirir ve birinin uygun belgeleri okuması gerekir. –

24

ya da hatta daha iyi (ve daha portatif),:

Geçici farklılık göstermek.

+1

Neden biri bunu reddetti? Bunu, zaman zaman sadece rahatsız edici ve gereksiz% 99 olan ad alanlarıyla uğraşmaktan kaçınmak için mükemmel bir çözüm buldum. – Arne

+0

İsim alanları, geçmişte almanız gereken bir engelse, dışarıdan dayatılan - sık sık oldukları gibi - bu kesinlikle gitmek için bir yoldur. – joachim