2008-12-02 4 views
16

Was ist der XPath-Ausdruck, den ich verwenden würde, um die Zeichenfolge nach 'HarryPotter:' für jedes Buch zu erhalten.Wie man die XPath-Funktion 'substring-after' anwendet

dh. Angesichts dieser XML:

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

Ich würde wieder:

Chamber of Secrets 
Prisoners in Azkabahn 

Ich habe versucht, so etwas wie dieses:

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

Ich glaube, meine Syntax falsch ist ...

Antwort

22

In XPath 2.0 kann dies durch einen einzigen XPath-Ausdruck erzeugt werden:

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

Hier haben wir die sehr leistungsstarke Funktion von XPath 2.0, dass am Ende verwenden von Ein Pfad von Positionsschritten können wir eine Funktion setzen und diese Funktion wird auf alle Knoten in der aktuellen Ergebnismenge angewendet.

In XPath 1.0 gibt es keine solche Funktion und dies kann nicht in einem XPath-Ausdruck erreicht werden.

Wir eine XSLT-Transformation durchführen könnte wie folgt aus:

 
<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> 

Wenn auf dem ursprünglichen XML-Dokument angewendet:

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

diese Transformation erzeugt das gewünschte Ergebnis:

Kammer Geheimnisse
Gefangene in Azkabahn

+0

Im Gegenteil, XPath 1.0 * hat Teilstring-nach: http://www.w3.org/TR/xpath/#function-substring-after –

+6

@ Josh-Stodola, wo habe ich gesagt, dass es nicht hat die Funktion substring-after()? XPath 1.0 * erlaubt * nicht die Angabe einer Funktion als Speicherortschritt, unabhängig davon, ob es sich um Teilzeichenfolge-after() oder um eine andere Funktion handelt. Bitte, geben Sie Ihre * falsche * Downvote zurück! –

+6

Josh weiß nicht, wer Dimitre ist :) – grantwparks

5

In deinem XML hast du keinen Platz zwischen Harry Potter, aber in deiner XQuery hast du Platz. es muss nur passen und presto, werden Sie Daten zurück ...

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

Entschuldigung - diese Zeichenfolge hatte versehentlich ein Leerzeichen ... Ich habe es jetzt behoben. Sie führen die String-Manipulation in VB (nicht im XPath).Ich versuche den XPath-Ausdruck zu verwenden ist alles nach der 'HarryPotter:' Zeichenfolge in jedem ausgewählten Knoten. Irgendwelche Ideen? –

+0

gibt es hier keine XQuery ... nur ein XPath. Auch die Verwendung von substring-after() innerhalb eines Prädikats ist ziemlich offensichtlich ein Fehler auf der Seite des OP, nicht etwas, das wir fortführen wollen. – LarsH

4

Der XPath-Ausdruck

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

wird wieder einen Knoten gesetzt mit allen Textknoten den Wert mit „Harrypotter“. Um den Buchtitel nach "HarryPotter:" zu erhalten, müssen Sie diesen Knotensatz durchlaufen und diesen Teilstring für jeden Knoten holen. Dies kann mit substring-after geschehen, wenn Sie XSLT oder mit Substring und IndexOf verwenden, wenn Sie VB verwenden, wie von balabaster gezeigt.

0

Xpath:

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

ich in diesem Bereich völlig neu bin, aber für mich, es funktioniert ...!

Verwandte Themen