2008-12-02 13 views
16

Her kitap için 'HarryPotter:' öğesinin ardından dizeyi almak için kullanacağım XPath ifadesi nedir?XPath işlevi 'substring-after' nasıl uygulanır

ie. bu XML Verilen:

<bookstore> 
<book> 
    HarryPotter:Chamber of Secrets 
</book> 
<book> 
    HarryPotter:Prisoners in Azkabahn 
</book> 
</bookstore> 

geri alacağı: Böyle

Chamber of Secrets 
Prisoners in Azkabahn 

denedim bir şey: Ben sözdizimi yanlış olduğunu düşünüyorum

/bookstore/book/text()[substring-after(. , 'HarryPotter:')] 

...

cevap

22

:

          İşte   /*/*/substring-after(., 'HarryPotter:')

biz bu sonunda XPath 2.0 çok güçlü özelliğini kullanıyorsanız bir konum adımının bir yolunu koyabiliriz ve bu fonksiyon mevcut sonuç kümesindeki tüm düğümlere uygulanacaktır.

XPath 1.0'da gibi bir özellik yoktur ve bu bir XPath ifadesinde gerçekleştirilemez.

Biz gibi bir XSLT dönüşümü gerçekleştirebilir

aşağıdadır:

Odası arasında:

 
<bookstore> 
    <book> HarryPotter:Chamber of Secrets </book> 
    <book> HarryPotter:Prisoners in Azkabahn </book> 
</bookstore> 

bu dönüşümün istenilen sonucu üretir: Orijinal XML belgesine uygulanan

 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:for-each select="/*/*[substring-after(., 'HarryPotter:')]"> 
     <xsl:value-of select= 
     "substring-after(., 'HarryPotter:')"/> 
     <xsl:text>&#xA;</xsl:text> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Sırlar
Azkabahn'da Mahkumlar

+0

Aksine, XPath 1.0 * * alt kümesine sahip aşağıdakileri içerir: http://www.w3.org/TR/xpath/#function-substring-after –

+6

@ Josh-Stodola, Nerede olduğunu söylemedim substring-after() işlevi? XPath 1.0 *, bir konum adımı olarak belirtilecek bir işleve * izin vermez, bunun substring-after() veya başka bir işlev olup olmadığına bakar. Lütfen, * yanlış * reddetmenizi geri alın! –

+6

Josh, Dimitre'nin kim olduğunu bilmez :) – grantwparks

5

XML'inde Harry Potter arasında hiç boş alan yok ama XQuery'inde bir alanın var.

Dim xml = <bookstore> 
        <book>HarryPotter:Chamber of Secrets</book> 
        <book>HarryPotter:Prisoners in Azkabahn</book> 
        <book>MyDummyBook:Dummy Title</book> 
       </bookstore> 

    Dim xdoc As New Xml.XmlDocument 
    xdoc.LoadXml(xml.ToString) 

    Dim Nodes = xdoc.SelectNodes("/bookstore/book/text()[substring-after(., 'HarryPotter:')]") 

    Dim Iter = Nodes.GetEnumerator() 
    While Iter.MoveNext 
     With DirectCast(Iter.Current, Xml.XmlNode).Value 
      Console.WriteLine(.Substring(.IndexOf(":") + 1)) 
     End With 
    End While 
+0

Üzgünüm - bu dize yanlışlıkla bir yer buldu ... Şimdi düzeltdim. Dize manipülasyonunu VB'de yaparsınız (XPath'ta değil).XPath ifadesini kullanmaya çalışıyorum, seçilen her düğümdeki 'HarryPotter:' dizesinin ardındaki her şeyi al. Herhangi bir fikir? –

+0

burada XQuery yok ... sadece bir XPath. Ayrıca, bir yüklemenin içindeki substring-after() kullanımı, OP'nin parçası üzerinde, sürdürmek istediğimiz bir şey değil, açıkça bir hatadır. – LarsH

4

... değeri içeren tüm metin düğümlerle ayarlanmış bir düğüm dönecektir XPath ifadesini

/bookstore/book/text()[substring-after(. , 'HarryPotter:')] 

Sadece maç yapmak ve presto, geri verileri alırsınız "Harrypotter:". "HarryPotter:" başlığını taşıyan kitap başlığını almak için, bu düğüm kümesinin içinden gitmeniz ve her düğüm için bu alt dizeyi getirmeniz gerekir. Bu, balabaster tarafından gösterildiği gibi VB kullanıyorsanız, XSLT'yi kullanıyorsanız veya Substring ve IndexOf kullanıyorsanız, alt diziyle yapılabilir.

bu tek XPath ifadesi tarafından üretilebilir XPath 2.0
0

XPath:

substring-after(//book, 'Advertised:') 

Bu alanda tamamen yeniyim, ama benim için çalışıyor ...!