2016-04-14 97 views
0

aşağıdaki XPathxpath</p> <p>xpath 1.0 Kullanılması 1.0 ayrı ürün

/root/Locale/Client[@id=1234]/Category/Category/Category 

Onun büyük xml doc var.

Her kategori şuna benzer:

<Category 
    id="7211" 
    parentID="5103" 
    level="4" 
    creatorID="1" 
    sortOrder="2" 
    createDate="2014-09-12T09:19:17" 
    updateDate="2016-03-30T13:42:01" 
    nodeName="All" 
    urlName="all" 
    path="-1,1719,3292,5103,7211" 
    isDoc="" 
    nodeType="1071" 
    creatorName="Suhel Ahmed" 
    writerName="Suhel Ahmed" 
    writerID="1" 
    template="0" 
    nodeTypeAlias="Category"> 

Temelde ben ayrı-lık düğümadı dayanmaktadır kategorilerden 3 seviyesinde belirgin kategorilerini seçmek gerekir.

ben xpath 2.0 biz ayrı-değerlere sahip ancak xpath 1'de ben xpath 1.0

kanat

+0

By * 3. seviye * demek istediğim * "level" özelliği 3'e eşittir? – har07

+0

Tam olarak ne dönmek istersin, ayrı 'nodeName' özniteliklerinin listesi mi yoksa liste' Kategorisi 'öğeleri mi? Eğer ikincisiyse, aynı 'nodeName' öznitelik değerine sahip birden çok' Kategori' öğesi olduğunda ne yapılmalıdır? – har07

+0

Aslında yukarıdaki xpath doğru seviyeye ulaşıyor ama gerçek öznitelik seviyesi bu derinlikte 6'dır. Biz torunları kullanabiliriz ve {@ level = 6] – wingyip

cevap

1

ile yapabilirsiniz bir yolu Aslında soru hala bana belli değil var mı biliyorum. Öncelikle, yorumunuzda belirtildiği gibi @level=6'u filtrelemek istediğinizi varsayalım. farklı Category elemanlarını döndürmek için aşağıda gösterildiği gibi

Şimdi, bütün Category öğe yinelenen payı için aynı ebeveyn kontrol edilecek varsayarak size preceding-sibling kullanabilirsiniz. Kaynak XML çoğaltılamaz nodeName niteliklerin durumunda, bu nodeName değeri ile sadece ilk Category eleman iade edilecektir: Category elemanları aynı ebeveyni paylaşamazsınız eğer

Else
//Category[@level='6' and not(@nodeName = preceding-sibling::Category[@level='6']/@nodeName)] 

, preceding-sibling yerine preceding eksen kullanılarak deneyin :

//Category[@level='6' and not(@nodeName = preceding::Category[@level='6']/@nodeName)] 
+0

Harika, ikinci varsayımın doğru. Kategori düğümleri aynı üst öğeyi paylaşmaz. Şimdi deneyeceğim. – wingyip

+1

Yine de bir 've' olmalı ama şimdi çalıştım // Kategori [@ level = '5' ve değil (@nodeName = önceki :: Kategori [@ level = '5']/@ nodeName)] – wingyip

+0

Tabii ki kapalıydı! Düzeltme için teşekkürler. Yine de, XPath'i karşı test etmek için örnek XML'im varsa önlenebilirdi :( – har07