Xquery 调用函数以处理其自身的结果一定次数

Xquery 调用函数以处理其自身的结果一定次数,xquery,tei,Xquery,Tei,我有一个查询,它将唯一引用附加到@xml:ids中的元素。它可以正常工作,但如何避免函数local:add-references()的笨拙重复 xquery版本“3.0”; 声明命名空间tei=”http://www.tei-c.org/ns/1.0"; 将函数local:change attributes($node作为node(),$new name作为xs:string,$new content作为item(),$action作为xs:string,$target元素名称作为xs:stri

我有一个查询,它将唯一引用附加到@xml:ids中的元素。它可以正常工作,但如何避免函数local:add-references()的笨拙重复

xquery版本“3.0”;
声明命名空间tei=”http://www.tei-c.org/ns/1.0";
将函数local:change attributes($node作为node(),$new name作为xs:string,$new content作为item(),$action作为xs:string,$target元素名称作为xs:string+,$target属性名称作为xs:string+)声明为node()+{
if($element()的节点实例)
然后
元素{node name($node)}
{
if($action='attachattributetoelement'和name($node)=$targetelementnames)
然后($node/@*,属性{$new name}{$new content})
其他的
$node/@*
,
对于$node/node()中的$child
返回$child
}
else$节点
};
声明函数本地:将引用($element as element())添加为element(){
元素{节点名($element)}
{$element/@*,
对于$element/node()中的$child
返回
if($element()的子实例和$child/./@xml:id)
然后
if(非($child/@xml:id))
然后
让$local name:=本地名称($child)
让$previous sibling:=$child/previous sibling::element()
let$previous sides:=count($previous sides[本地名(.)eq$local名])
让$following sibling:=$child/following sibling::element()
让$following sides:=count($following sides[本地名(.)eq$local名])
let$seq no:=
如果($前面的同级=0,后面的同级=0)
然后“
其他$1+1
让$id值:=concat($child/./@xml:id,'-',$localname,if($seq no),然后'-'else',$seq no)
返回
本地:更改属性($child、'xml:id'、$id值、'attach attribute to element'、('body'、'quote'、'titlePage'、'text'、'p'、'div'、'front'、'head'、'titlePart')、“”)
本地:添加引用($child)
其他的
if($element()的子实例)
然后本地:添加引用($child)
其他$child
}
};
让$doc:=

… … 返回本地:添加引用(本地:添加引用)(本地:添加引用
必须有某种方法递归调用函数,使用文档的深度将函数本身包装若干次


问题是,一定深度的元素必须等到其父元素获得@xml:id之后才能获得自己的元素(顶层必须以@xml:id作为种子)。

这可能不是最佳解决方案,但您可以只测试应用函数是否仍然会更改任何内容,否则取消:

declare function local:add-references-recursively($now as element()) as element() {
  let $next := local:add-references($now)
  return
    if (deep-equal($now, $next))
    then $now
    else local:add-references-recursively($next)
};
并使用

local:add-references-recursively($doc)

在返回带有更新值的元素后,不能进行递归调用吗<代码>本地:添加引用(本地:更改属性($child,'xml:id',$id value,…是的,现在我看到了:递归,直到您完成,也就是说,直到您这次拥有的内容与上次相同-获取文档深度是不必要的。再次感谢Jens,为我指路。速度不是问题-我的文档有22138行,因此我几乎不能期望函数无论如何,离子将在毫秒内完成!
local:add-references-recursively($doc)