4

xml ファイル内の特定のキーワードを含むすべてのテキスト ノードを検索する XQuery を作成しようとしています。テキスト ノードは長いので、一致するキーワードから始まるテキストの部分文字列 (必要な長さ) を返したいと思います。

サンプルファイル.xml

<books>
<book>
  <title>linear systems</title>
  <content>vector spaces and linear system analysis </content>
</book>
<book>
  <title>some title</title>
  <content>some content</content>
</book>
</books>

samplexquery.xq

declare namespace functx = "http://www.functx.com";

for $match_result in /*/book/*[contains(.,'linear')]/text()
  return substring($match_result, functx:index-of-match-first($match_result,'linear'), 50)

結果 [線形システム、線形システム解析] が得られることを期待しています。最初の本のタイトル ノードには、'linear' という単語が含まれています。「linear....」から始まる 50 文字を返します。最初の本のコンテンツ ノードについても同様です。

私は XQuery 1.0 を使用しており、http ://www.xqueryfunctions.com/xq/functx_index-of-match-first.html の例に示すように名前空間 functx を含めました。

しかし、これは私にエラーを与えています: [XPST0017] Unknown function "functx:index-of-match-first(...)".

ありがとう、ソニー

4

1 に答える 1

2

XQuery 1.0を使用しており、次の例に示すように名前空間functxを含めました: http ://www.xqueryfunctions.com/xq/functx_index-of-match-first.html

しかし、これは私にエラーを与えています:[XPST0017]不明な関数 "functx:index-of-match-first(...)"。

名前空間を宣言するだけでは不十分です。

関数のコードも必要です。この言語では、標準のXQueryおよびXPath関数と演算子のみが事前定義されています。

この修正されたコード

declare namespace functx = "http://www.functx.com"; 
declare function functx:index-of-match-first 
  ( $arg as xs:string? ,
    $pattern as xs:string )  as xs:integer? {

  if (matches($arg,$pattern))
  then string-length(tokenize($arg, $pattern)[1]) + 1
  else ()
 } ;

 for $match_result in /*/book/*[contains(.,'linear')]/text()
  return substring($match_result, functx:index-of-match-first($match_result,'linear'), 50)

提供されたXMLドキュメントに適用した場合(いくつかの整形式でないエラーが修正された場合):

<books>
  <book>
    <title>linear systems</title>
    <content>vector spaces and linear system analysis </content>
  </book>
  <book>
    <title>some title</title>
    <content>some content</content>
  </book>
</books>

期待される結果を生成します:

linear systems linear system analysis

ディレクティブを使用してimport module、既存の関数ライブラリからモジュールをインポートすることをお勧めします。

于 2010-12-17T19:46:52.060 に答える