2012-06-04 23 views
35

Aşağıdaki örnekte alt öğe olan c öğelerini bulmak için bana yardımcı olabilir misiniz? Adını = "b2" ve c elemanı içeren öğeyi almak istiyorum:XPath, tüm elemanları belirli alt düğümle birlikte bulur

<a> 
    <b name = "b1"></b> 
    <b name = "b2"><c/></b> 
    <b name = "b3"></b> 
</a> 

xpath sorgusu ben 2 koşulları birleştirmek istediğinizde ikinci soru olan b2 elemanı

dönmelidir Ama bu sözdizimi çalışmamasına görünüyor: // b [@ name = 'b2' ve c]

+0

Tam olarak "işe yaramaz gibi görünüyor" ne demektir? Lütfen yeni, ayrı bir soru sorun ve kaynak XML belgesini, kullanılan XPath ifadesini ve istediğiniz sonucu ve elde ettiğiniz sonucu eksiksiz olarak (eksiksiz olarak) sağlayın. Geçerli XML belgesine sahip olan XPath ifadesi '// b [@ name = 'b2' ve c]' 'a''nın ikinci çocuğunu seçer - tam olarak olması gerektiği gibi. –

cevap

43

XML belgesinin yapısı bilindiği zaman kullanımı büyük verimsizlik (tüm belge ağacının kastetmek) neden olabilir olarak, // XPath sözde operatörü kullanmaktan kaçınmak daha iyidir.

Bu nedenle, sağlanan XML belgesi için bu XPath ifadesini recomment:

/*/b[c] 

Bu XML belgesinin üst elemanın alt öğesi olan herhangi b elemanı seçer ve o c adında bir çocuk eleman vardır . GÜNCELLEME

: OP sadece birkaç dakika önce bir saniye güçl bir şekilde soru soruldu:

İkinci soru ben 2 koşulları birleştirmek istediğinizde: Ben elemanı almak istediğiniz var name = "b2" ve eleman c vardır Ama bu sözdizimi çalışmamasına görünüyor: //b[@name='b2' and c]

sağlanan XPath ifadesi tam inci seçmek yapar İstenen eleman. Burada

XSLT olduğu - doğrulaması:

<a> 
    <b name = "b1"></b> 
    <b name = "b2"><c/></b> 
    <b name = "b3"></b> 
</a> 

XPath ifadesi değerlendirildi ve doğru olduğu: bu dönüşüm sağlanmaktadır XML belgesi uygulanır

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <xsl:copy-of select="//b[@name='b2' and c]"/> 
</xsl:template> 
</xsl:stylesheet> 

-selected öğe çıktıya kopyalanır:

<b name="b2"> 
    <c/> 
</b> 
+0

Öğeyi seçmek için python kullanıyorum Kullanıyorsam: root.findall ("b [c]") İstenilen sonuç Ancak root.findall kullanırsam ("b [@ name = 'b2' ve c] ") " Geçersiz değer yüklemesi "hatası aldım Belki de Python için başka bir soru açıyorum? – nam

+0

@HOAINAMNGUYEN: Evet, başka bir soru açmak doğru bir şey gibi görünüyor - bu Python ile ilgili bir sorun gibi görünüyor. –

+1

Sadece başka bir xpath sorusu için var olmak için @DimitreNovatchev için başka bir teşekkür etmek istedim :) –

19

olması gerektiği gibi basit olarak

//b[c] 

, c numaralı bir çocuğa sahip olan her yerde bir b bulabilirsiniz.

+0

Anwser için teşekkürler! İşe yarıyor! – nam

+0

Merhaba, şimdi 2 koşulu birleştirmek istiyorum: name = "b2" olan ve c elemanına sahip olan elemanı almak istiyorum Ama bu sözdizimi işe yaramıyor gibi görünüyor: // b [@ name = 'b2' ve c] – nam

+0

Benim için çalışır (Perl'de xsh kullanarak). – choroba