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

时间:2015-09-28 14:38:20

标签: 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>
    <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,就好像存在文本节点一样。

1 个答案:

答案 0 :(得分:0)

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

        List<String> list = new ArrayList<String>(Arrays.asList(value.split(",")));

    for(String s : list)
        System.out.println(s);