17

我将使用什么 XPath 表达式来获取每本书的“HarryPotter:”后面的字符串。

IE。鉴于此 XML:

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

我会回来的:

Chamber of Secrets
Prisoners in Azkabahn 

我尝试过这样的事情:

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

我认为我的语法不正确...

4

4 回答 4

24

在 XPath 2.0 中,这可以由单个 XPath 表达式产生:

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

在这里,我们使用了 XPath 2.0 非常强大的特性,在定位步骤路径的末尾我们可以放置一个函数,该函数将应用于当前结果集中的所有节点。

在 XPath 1.0 中没有这样的特性,这不能在一个 XPath 表达式中完成。

我们可以执行如下的 XSLT 转换:

<xsl:stylesheet 版本="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:输出方法="文本"/>

    <xsl:模板匹配="/">
      <xsl:for-each select="/*/*[substring-after(., 'HarryPotter:')]">
        <xsl:value-of 选择=
         "substring-after(., 'HarryPotter:')"/>
        <xsl:text>
</xsl:text>
      </xsl:for-each>
    </xsl:模板>
</xsl:样式表>  

应用于原始 XML 文档时:

<书店>
    <book> 哈利波特:密室</book>
    <book>哈利波特:阿兹卡班的囚徒</book>
</书店>

这种转换产生了想要的结果:


Azkabahn的密室囚犯

于 2008-12-02T15:07:06.663 回答
5

在您的 XML 中,Harry Potter 之间没有空格,但在 XQuery 中,您有空格。只要让它匹配和presto,你会得到数据回来......

    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
于 2008-12-02T07:33:49.607 回答
4

XPath 表达式

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

将返回一个节点集,其中所有文本节点都包含值“HarryPotter:”。要使书名继承“HarryPotter:”,您需要遍历此节点集并获取每个节点的子字符串。如果您使用的是 XSLT,则可以使用 substring-after 来完成,如果您使用的是 VB,则可以使用 Substring 和 IndexOf 来完成,如 balabaster 所示。

于 2008-12-02T12:35:53.367 回答
0

Xpath:

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

我在这个领域是全新的,但对我来说,它有效......!

于 2015-02-01T17:47:15.067 回答