2016-04-11 11 views
1

Aşağıdaki XML verildiğinde, "İlk başlık" ve "İkinci başlık" arasındaki tüm potansiyel öğeleri seçmek istiyorum, bu başlık öğeleri hariç tutuldu. BenXSLT - Belirtilen bir etiketin tüm kardeşlerini başka bir etikete kadar seçin (tekrar)

<body> 
    <h1 class="heading1">Some title</h1> 
    <p class="bodytext">Some text.</p> 

    <p class="sectiontitle">First heading</p> 
    <p class="bodytext">Want that.</p> 
    <div> 
    <p class="bodytext">Want that too!</p> 
    </div> 

    <p class="sectiontitle">Second heading</p> 
    <p class="bodytext">Some text</p> 

    <p class="sectiontitle">Third heading</p> 
    ... 
</body> 

Beklenen (... Ben özel bir uygulama tarafından işletilen bir sayfasını değiştirmeye ediyorum) kullanabileceğim XSLT'de hangi sürümünü emin değilim:

:

<p class="bodytext">Want that.</p> 
<div> 
    <p class="bodytext">Want that too!</p> 
<div> 

biliyorum p class="sectiontitle">First heading</p> o

  • her zaman sectiontitle sınıfından olacaktır. Her zaman First heading içerecektir.
  • bu dersin ilk p değeri olmak zorunda değildir, pozisyonu bilinmemektedir. Ben <p class="sectiontitle">Could be any title</p> bulunca ben duracağını şimdi de

I (böylece sınıf dayalı yalnızca)

Ben sorunların bu tür hakkında diğer benzer mesajları gördük ve hala davamı kıramazlar ...

diğer şeyler arasında, çalıştık ne

:

//*[(preceding-sibling::p/text()="First heading") and (not(following-sibling::p[@class="sectiontitle"]))] 

cevap

0

yılında Second Heading ' 'için' Third heading 've' First heading 'için' Second heading ben kendi soru kullanarak kimlikleri cevaplamak için harika bir yol keşfetti.

bir 'başlığı' sınıf görünümlü elemanlarda bulana kadar en, geçerli etiketi (bizim örneğimizde bir sectiontitle) aşağıdaki kardeşler seçmek istediğinizi varsayalım Örneğin paragraphtitle veya sectiontitle için çok:

<xsl:variable name="thisgid" select="generate-id(.)" /> 
<xsl:apply-templates select="following-sibling::*[not(@class='sectiontitle' or @class='paragraphtitle')] 
           [generate-id(preceding-sibling::p[@class='sectiontitle'][1]) = $thisgid]"/> 

Bu benim durumumda birçok sorunu çözdü.

+0

Ayrıca bakınız: http://stackoverflow.com/a/30989452/3016153 –

2

Sen (2 sectiontitle elemanı seçerek önlemek için güncellenmiş) aşağıdaki XPath ifadesini kullanabilirsiniz:

//p[@class='sectiontitle' and .='First heading'] 
/following-sibling::*[ 
    preceding-sibling::p[@class='sectiontitle'][1] = 'First heading' 
    and not(self::p/@class = 'sectiontitle') 
] 

Temel olarak, XPath yakın önceki kardeş 'sectiontitle'First Heading elemanının kendisi First Heading elemanının following-sibling elemanları döner. 'Eğer 'Second heading' arasındaki çıkışını almak istiyor ve eğer

//p[@class='sectiontitle' and text()='Second heading']/preceding-sibling::*[preceding-sibling::p[@class='sectiontitle'][1] = 'First heading'] 

Örneğin 'Third heading' sadece değiştirin:

+0

(Hızlı) yanıt için teşekkür ederiz. İleriye doğru büyük bir sıçrama ama yine de beklenenleri geri getirmiyor. – Flag

+0

Cevabınızı ortaya çıkardıktan sonra, ilk başlığın p [@ class = 'sectiontitle'] [1] olması gerekmediğini, fakat bahsettiğim 2 eleştiri ile tanımlanması gerektiğini de fark ettim. Bu şey zor. – Flag

+0

@Flag, "preceding-sibling :: p [@ class = 'sectiontitle'] [1] = 'First heading' ifadesinin her iki kriteri de içerdiğini düşünmüyor musunuz? – har07

2

Bu hangi arasında iki başlıkları, çıkış istediğiniz belirtebilirsiniz anlamı daha kolay olduğunu düşünüyorum yukarıdaki ifadede

+0

Bu oldukça güzel, ben de Bir şey verebilir ve eminim diğer insanlar da ilgilenecek. Cevabınız için teşekkür ederim. – Flag

İlgili konular