2010-01-29 17 views
34

İşte benim xmlXPath: Başka bir kardeşe kadar aşağıdaki tüm kardeşleri seçin

<node/> 
<node/> 
<node id="1">content</node> 
<node/> 
<node/> 
<node/> 
<node id="2">content</node> 
<node/> 
<node/> 

bir alıntı node[@id='1'] konumlandırılmış. Tüm <node/> öğelerini bir sonraki boş olmayan düğüme (node[@id='2']) kadar eşleştirmek için bir Xpath'e ihtiyacım var.


Düzenleme: @id öznitelikleri benim sorunumu daha açık bir şekilde açıklamaktır, ancak orijinal XML'mde değillerdir. @İd niteliklerini kullanmayan bir çözüme ihtiyacım var.


değil boş kardeşi node[@id='2'] ile eşleştirmek istemiyorum, bu yüzden naif bir following-sibling::node[text()=''] kullanamıyorum.

Bunu nasıl başarabilirim?

+0

Ayrıca bkz: http://stackoverflow.com/questions/2165566/xslt-select-following-sibling -until kapsamlı-a-belirtilen-tag Bu kullanım olabilir – WBT

+0

: [http://stackoverflow.com/questions/2063619/how-to-reformat-xml-with-group-adjacent-xslt](http:/ /stackoverflow.com/questions/2063619/how-to-reformat-xml-with-group-adjacent-xslt) – igor

cevap

21

Sen bu şekilde yapmak başladı.

ifadesi diyor: Geçerli bağlamdan

  • hiçbir metin ve önceki" tüm
  • bir kimliğe sahip kardeş düğümler sahip olan çocuk düğümleri seçmek ebeveyn
  • gidin "İlki 1

Bir kimliğe sahip olmanız gerekir. XSLT içinde iseniz aşağıdaki kardeşlik ekseninden birini seçebilirsiniz. Bir anahtar ile

<!-- the for-each is merely to switch the current node --> 
<xsl:for-each select="node[@id='1']"> 
    <xsl:copy-of select=" 
    following-sibling::node[ 
     not(text()) and 
     generate-id(preceding-sibling::node[@id][1]) 
     = 
     generate-id(current()) 
    ] 
    " /> 
</xsl:for-each> 

veya daha basit (ve daha verimli): ause Eğer current() işlevini kullanabilirsiniz

<xsl:key 
    name="kNode" 
    match="node[not(text())]" 
    use="generate-id(preceding-sibling::node[@id][1])" 
/> 

<xsl:copy-of select="key('kNode', generate-id(node[@id='1']))" /> 
+0

, ben XSLT'de dışında olduğum için nihayet, başka bir yol gitti, ben aşağıdaki tüm-kardeş düğümleri seçmek ve yinelemeye devam et ve bir dahaki sefere rastlamadığım zaman döngüyü durdur boş. Cevabınızı en kapsamlı olarak kabul ediyorum çünkü şimdi istediğim şeyi yapmak için XPath'da bir tek liner olmadığına inanıyorum. – glmxndr

+0

@subtenante: Erm - ama * bu cevapta doğru olan bir XPath tek liner var mı ?! – Tomalak

+0

evet, haklısın, sorum şu ki, benim koyduğum kimlik özelliklerinin sadece gösterme ve problemi açıklamak olduğu gerçeğinden pek net değil. Aslında benim XML'imde id öznitelikleri yok. – glmxndr

8

XPath 2.0 '< <' node1 << node2 ve '>>' operatörleri nerede bulunur node1, belge sırasına göre düğüm2'den önce doğruysa. Böylece [@id = '1'] o kadar da XSLT'den akım() işlev ihtiyacı

following-sibling::node[not(text()) and . << current()/following-sibling::node[@od][1]] 

kullanabilecekleri bir XSLT'de XPath'ın 2.0 ile bu konuda mevcut düğüm, 2.0 stil göre bu yüzden "XSLT 2.0 stil sayfasında XPath 2.0 ile" dedim. Yukarıdaki sözdizimi, bir XSLT stil sayfasında '< <' den '& lt; & lt; '.kabul edilen yanıt daha basit

8

:

//node[@id='1']/following-sibling::node[following::node[@id='2']] 
  • ama sadece bu eğer ... Artık tüm şu kardeş node elemanları
  • bulmak id '1'
  • olduğu yerde bir düğümü bulun elemanlar ayrıca id="2" ile node'dan sonra bir yerlerde var. Daha açık bir test belgesine (ve yasal id değerler) ile eylem Gösterildi

:

xml = '<root> 
<node id="a"/><node id="b"/> 
<node id="c">content</node> 
<node id="d"/><node id="e"/><node id="f"/> 
<node id="g">content</node> 
<node id="h"/><node id="i"/> 
</root>' 

# A Ruby library that uses libxml2; http://nokogiri.org 
require 'nokogiri'; doc = Nokogiri::XML(xml) 

expression = "//node[@id='c']/following-sibling::node[following::node[@id='g']]" 
puts doc.xpath(expression) 
#=> <node id="d"/> 
#=> <node id="e"/> 
#=> <node id="f"/> 
+0

Neden "aşağıdaki" eksenini seçtiniz? Belge daha büyükse (aşağıdaki eksenden başka bir eksenden daha yavaş olmakla birlikte), yolun aşağısında yanlış pozitif değerler verebilir. – Abel

İlgili konular