17

各本の「HarryPotter:」に続く文字列を取得するために使用するXPath式は何ですか。

すなわち。この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 にはそのような機能はなく、これを 1 つの XPath 式で実現することはできません。

次のような XSLT 変換を実行できます。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:出力方法="テキスト"/>

    <xsl:テンプレートマッチ="/">
      <xsl:for-each select="/*/*[substring-after(., 'HarryPotter:')]">
        <xsl:selectの値=
         "substring-after(., 'HarryPotter:')"/>
        <xsl:text>
</xsl:text>
      </xsl:for-each>
    </xsl:テンプレート>
</xsl:スタイルシート>  

元の XML ドキュメントに適用した場合:

<書店>
    <本> ハリー・ポッター: 秘密の部屋 </本>
    <本> ハリー・ポッター: アズカバーンの囚人 </本>
</書店>

この変換により、必要な結果が得られます。


アズカバーンの秘密の部屋の囚人

于 2008-12-02T15:07:06.663 に答える
5

XMLではハリーポッターの間にスペースはありませんが、XQueryではスペースがあります。一致させてプレストするだけで、データが返されます...

    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 を使用している場合は balabaster で示されているように Substring と IndexOf を使用してこれを行うことができます。

于 2008-12-02T12:35:53.367 に答える
0

Xpath:

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

私はこの分野ではまったく新しいものですが、私にとってはうまくいきます...!

于 2015-02-01T17:47:15.067 に答える