Xquery 计算上下文节点与最近的前一个文本节点的距离

Xquery 计算上下文节点与最近的前一个文本节点的距离,xquery,Xquery,我希望记录上下文节点和最近的前一个文本节点之间有多少元素介入。我现在做的是: xquery version "3.0"; let $text := <text> <p n="1">text-node<pb/><lb/><seg>text-node<context-node>context-node</context-node>text-node</seg></p> <

我希望记录上下文节点和最近的前一个文本节点之间有多少元素介入。我现在做的是:

xquery version "3.0";

let $text :=
<text>
    <p n="1">text-node<pb/><lb/><seg>text-node<context-node>context-node</context-node>text-node</seg></p>
    <p n="2">text-node<pb/><lb/><seg><context-node>context-node</context-node>text-node</seg></p>
    <p n="3">text-node<pb/><seg><lb/><context-node>context-node</context-node>text-node</seg></p>
    <p n="4">text-node<pb/><seg>text-node<lb/><context-node>context-node</context-node>text-node</seg></p>
    <p n="5">text-node<pb/>text-node<seg><lb/><context-node>context-node</context-node>text-node</seg></p>
    <p n="6"><seg>text-node<pb/><lb/><context-node>context-node</context-node>text-node</seg></p>
    <p n="7">text-node<seg><pb/><lb/><context-node>context-node</context-node>text-node</seg></p>
    <p n="8">text-node<seg><pb/><cb/><lb/><context-node>context-node</context-node>text-node</seg></p>
</text>
let $predicate := 'context-node'
return
    for $element at $i in $text/element()
    let $context-node := $element//element()[. eq $predicate]
    return
        <context-text-distance n="{$i}">{
        if ($context-node/preceding-sibling::node()[1] instance of text() or $context-node/parent::element()/child::node()[1] is $context-node)
        then 1
        else 
            if ($context-node/preceding-sibling::node()[2] instance of text() or $context-node/parent::element()/child::node()[2] is $context-node)
            then 2
            else
                if ($context-node/preceding-sibling::node()[3] instance of text() or $context-node/parent::element()/child::node()[3] is $context-node)
                then 3
                else ()
        }</context-text-distance>
这将返回正确的答案,当然我可以继续这样说——大于5的数字是极不可能的——但我很好奇,是否有可能在不测试每个可能性的情况下计算出这个距离

我从上下文节点出发,一个元素节点。我想知道为了到达上下文节点的文本节点同级,或者上下文节点是否是其父节点的第一个子节点,必须遍历多少个前面的元素节点。如果满足这些要求之一,则距离为1。因此,在示例1中,上下文节点的前一个同级节点是文本节点,因此距离为1。在示例2中,seg元素是上下文节点的父节点,由于上下文节点是其第一个子节点,因此距离再次为1。在示例3中,包围seg元素位于空lb元素之前,因此计数为2。在示例4中,文本节点位于空lb元素之前,因此计数再次为2。示例5实际上是示例3的重播,可以删除。在示例6中,上下文节点和最近的前一个文本节点之间有两个空元素,因此距离为3。在示例7中,父seg节点对距离计数的影响与示例6的文本节点相同。示例8返回空,因为距离为4,未覆盖


我使用它来确定在文本中提取和插入防区外标记的顺序。空元素具有相同的偏移量,但必须以确定的顺序插入。所有偏移都是相对于文本节点计算的。作为其父节点的第一个子节点的上下文节点的偏移量为0,就像有一个文本节点一样。

我认为返回语句必须类似于以下内容才能得到相同的结果:

if ($context-node/preceding-sibling::text())
then 
    <context-text-distance type="1" n="{$context-node/ancestor::p/@n}">{
    for $node at $i in $context-node/preceding-sibling::text()[1]/following-sibling::node()
    return
        if ($node is $context-node) then $i else ()
    }</context-text-distance>
else 
    <context-text-distance type="2" n="{$context-node/ancestor::p/@n}">{
        count($context-node/preceding-sibling::node()) + 1
    }</context-text-distance>

我真的不明白你想要什么。什么节点介入?要计算两者之间距离的确切节点有哪些?看看你的查询结果,我根本不懂规则。如果你把一个示例输入和一个条目放在一起来考虑被标记,这可能会有帮助,并且有另一个尝试来解释精确的计数。谢谢Jens Erat。我试图在编辑中进行解释。