4

我正在尝试编写一个 XQuery,它会在 xml 文件中找到包含给定关键字的所有文本节点。文本节点很长,所以我想返回从匹配关键字开始的文本子字符串(具有所需长度)。

示例文件.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>

样本xquery.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,并包含了命名空间 functx,如以下示例所示:http ://www.xqueryfunctions.com/xq/functx_index-of-match-first.html

但是,这给了我一个错误:[XPST0017] 未知函数“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 回答