克隆节点并使用xquery修改克隆

克隆节点并使用xquery修改克隆,xquery,Xquery,我从在线词典中提取了一些html,我想将其转换为XML,以便最终转换为BK树的单词列表。在线词典记录不同的拼写,但有时会通过在括号中插入元音或结尾来记录,例如: <td> <span class="FORM"> <span class="HDORTH">a</span> <span class="POS"> indef. art. </span> Also <span class="O

我从在线词典中提取了一些html,我想将其转换为XML,以便最终转换为BK树的单词列表。在线词典记录不同的拼写,但有时会通过在括号中插入元音或结尾来记录,例如:

<td>
    <span class="FORM">
    <span class="HDORTH">a</span>
    <span class="POS"> indef. art. </span> Also 
    <span class="ORTH">an</span>. Early forms: as subj.,
    <span class="ORTH">ane</span>, 
    <span class="ORTH">on</span>, 
    <span class="ORTH">o</span>; as obj., 
    <span class="ORTH">ane</span>, 
    <span class="ORTH">on(e</span>, 
    <span class="ORTH">o</span>, &amp; (chiefly masc.) 
    <span class="ORTH">an(n)e</span>, 
    <span class="ORTH">æn(n)e</span>, 
    <span class="ORTH">en(n)e</span>, 
    <span class="ORTH">en</span>; after prep.,chiefly 
    <span class="ORTH">ane</span>, 
    <span class="ORTH">on(e</span>, masc. also 
    <span class="ORTH">anne</span>, 
    <span class="ORTH">æn(n)e</span>, fem. also 
    <span class="ORTH">anre</span>, 
    <span class="ORTH">are</span>, 
    <span class="ORTH">hare</span>, 
    <span class="ORTH">ore</span>; gen. 
    <span class="ORTH">anes</span>, 
    <span class="ORTH">æn(n)es</span>, 
    <span class="ORTH">en(n)es</span>.</span>
</td>

A.
因迪夫。艺术而且
一早期形式:作为主语。,
嗯,,
在…上
o;作为对象。,
嗯,,
关于(e,
o、 &;(主要是masc)
安(n)e,
æn(n)e,
恩(n)e,,
嗯,准备好以后,
嗯,,
关于(e,masc.也
安妮,
æn(n)e,有限元法
安雷,
是
野兔
矿石。
阿纳斯,
æn(n)es,
是的。
我编写了以下XQuery来将HTML转换为XML,剥离标记中没有的任何内容,并根据特定跨度的类选择元素:

declare function local:node-change($nodes as node()*) as node()* {
  for $span in $nodes
  return 
    if ($span/@class = "HDORTH") then <headword>{$span/text()}</headword>
    else if ($span/@class = "POS") then <part_of_speech>{$span/text()}</part_of_speech>
    else if ($span/@class = "ORTH") then <variant>{$span/text()}</variant>
    else $span
 } ;

<list>
{
let $collection:=concat($collection, '?select=*.xml')
let $q:=collection($collection)

for $y in $q 
let $s := $y/td/span/*

let $c := local:node-change($s)
(:let $l := local:stripleftparen($c):)

order by number(substring(substring-before(tokenize(document-uri($y), "/")[last()],"."),4))
return
<entry ref="{number(substring(substring-before(tokenize(document-uri($y), "/")[last()],"."),4))}">{$c}</entry>
}
</list>
declare function local:node change($nodes as node()*)as node()*{
对于$span,在$nodes中
回来
如果($span/@class=“HDORTH”),则{$span/text()}
否则如果($span/@class=“POS”),则{$span/text()}
否则如果($span/@class=“ORTH”),则{$span/text()}
其他$span
} ;
{
让$collection:=concat($collection',?select=*.xml'))
let$q:=集合($collection)
对于$q中的$y
设$s:=$y/td/span/*
让$c:=本地:节点更改($s)
(:let$l:=本地:stripleftparen($c):)
按编号排序(子字符串(标记化(文档uri($y),“/”[last()],“”)之前的子字符串),4))
回来
{$c}
}
这将返回以下XML:

<entry ref="3">
        <headword>a</headword>
        <part_of_speech> indef. art. </part_of_speech>
        <variant>an</variant>
        <variant>ane</variant>
        <variant>on</variant>
        <variant>o</variant>
        <variant>ane</variant>
        <variant>on(e</variant>
        <variant>o</variant>
        <variant>an(n)e</variant>
        <variant>æn(n)e</variant>
        <variant>en(n)e</variant>
        <variant>en</variant>
        <variant>ane</variant>
        <variant>on(e</variant>
        <variant>anne</variant>
        <variant>æn(n)e</variant>
        <variant>anre</variant>
        <variant>are</variant>
        <variant>hare</variant>
        <variant>ore</variant>
        <variant>anes</variant>
        <variant>æn(n)es</variant>
        <variant>en(n)es</variant>
    </entry>

A.
独立艺术。
一
电子邮箱
在…上
o
电子邮箱
在(e)上
o
安(n)e
æn(n)e
en(n)e
EN
电子邮箱
在(e)上
安妮
æn(n)e
安雷
是
野兔
矿石
阿纳斯
æn(n)es
en(n)es
我现在需要做的是克隆具有paren的节点,这样我就可以修改克隆并得到以下结果,但我不确定如何做到这一点

<entry ref="3">
        <headword>a</headword>
        <part_of_speech> indef. art. </part_of_speech>
        <variant>an</variant>
        <variant>ane</variant>
        <variant>on</variant>
        <variant>o</variant>
        <variant>ane</variant>
        <variant>on</variant>
        <variant>one</variant>
        <variant>o</variant>
        <variant>ane</variant>
        <variant>anne</variant>
        <variant>æne</variant>
        <variant>ænne</variant>
        <variant>ene</variant>
        <variant>enne</variant>
        <variant>en</variant>
        <variant>ane</variant>
        <variant>on</variant>
        <variant>one</variant>
        <variant>anne</variant>
        <variant>æne</variant>
        <variant>ænne</variant>
        <variant>anre</variant>
        <variant>are</variant>
        <variant>hare</variant>
        <variant>ore</variant>
        <variant>anes</variant>
        <variant>ænes</variant>
        <variant>ænnes</variant>
        <variant>enes</variant>
        <variant>ennes</variant>
    </entry>

A.
独立艺术。
一
电子邮箱
在…上
o
电子邮箱
在…上
一
o
电子邮箱
安妮
æne
ænne
烯
埃纳
EN
电子邮箱
在…上
一
安妮
æne
ænne
安雷
是
野兔
矿石
阿纳斯
ænes
ænnes
埃内斯
埃内斯

我知道我需要使用substring、substring before或substring after来实际修改节点,但我遇到的问题是在实际的克隆过程中。
Copy
在for/return循环中不起作用,我在网上找到的所有内容都表明复制节点需要使用substring,或者说要消除重复数据(这是我需要做的,但我想在我这么做之前得到我想要的)。我如何复制一个节点,修改副本,并显示结果,以便获得我想要的内容?

我不清楚规则是什么。但在我看来,您应该能够在节点更改功能中一次完成所有操作

我认为你可以按照以下思路做一些事情:

      declare function local:node-change($nodes as node()*) as node()* {
      for $span in $nodes
      let $varient1 :=
        if ($span/@class = "HDORTH") then <headword>{$span/text()}</headword>
        else if ($span/@class = "POS") then <part_of_speech>{$span/text()}</part_of_speech>
        else if ($span/@class = "ORTH" and contains($span/text(),')')) then <variant>{translate($span/text(),'()','')}</variant>
        else $span
        (:Implement some if here to get the other varient if needed :)
        let $varient2 := <varient/>
      return 
        ($varient1, $varient2)
     } ;
declare function local:node change($nodes as node()*)as node()*{
对于$span,在$nodes中
让$varient1:=
如果($span/@class=“HDORTH”),则{$span/text()}
否则如果($span/@class=“POS”),则{$span/text()}
否则,如果($span/@class=“ORTH”并包含($span/text(),')')),则{translate($span/text(),'()','')}
其他$span
(:如果需要,在此处实现一些if以获取其他变量:)
让$varient2:=
回来
($varient1,$varient2)
} ;
如果有三个变量(不确定),只需遵循相同的模式。当然,任何一个加法变量的else都可以是空元素,您可以在末尾去掉它(即else),然后只去掉结果中的任何一个

可能是这样(猜测规则):

xquery版本“3.0”;
将函数声明为本地:节点更改($nodes as node()*)声明为node()*{
对于$span,在$nodes中
让$varient1:=
如果($span/@class=“HDORTH”),则{$span/text()}
否则如果($span/@class=“POS”),则{$span/text()}
否则,如果($span/@class=“ORTH”和包含($span/text(),“(”)和不包含($span/text(),“))),则{
否则,如果($span/@class=“ORTH”和包含($span/text(),“(”)和包含($span/text(),“)”),则{concat(前面的子字符串($span/text(),“(”),后面的子字符串($span/text(),“))}
否则,如果($span/@class=“ORTH”和非($span/text(),'('))和非($span/text(),')),则{$span/text()}
其他$span
设$varient2:=如果($span/@class=“ORTH”和包含($span/text(),'(')和不包含($span/text(),')),则{translate($span/text(),'(','')}
其他的
设$varient3:=如果($span/@class=“ORTH”和包含($span/text(),“(”)和包含($span/text(),“)”),则{translate($span/text(),“()”,“)}
其他的
回来
($varient1、$varient2、$varient3)
} ;
let$cell:=
A.
独立艺术
早期形式:作为主语。,
嗯,,
在…上
o、 作为对象。,
嗯,,
关于(e,
o、 &;(主要是masc)
安(n)e,
æn(n)e,
恩(n)e,,
嗯,准备好以后,
嗯,,
关于(e,masc.也
安妮,
æn(n)e,有限元法
安雷,
是
野兔
矿石。
阿纳斯,
æn(n)es,
是的。
设$s:=$cell/span/*
让$c:=本地:节点更改($s)
回来
$c[不是(local-name()='empty')]
返回以下内容:

<headword>a</headword>
<part_of_speech> indef. art. </part_of_speech>
<variant>an</variant>
<variant>ane</variant>
<variant>on</variant>
<variant>o</variant>
<variant>ane</variant>
<variant>on</variant>
<variant>one</variant>
<variant>o</variant>
<variant>ane</variant>
<variant>anne</variant>
<variant>æne</variant>
<variant>ænne</variant>
<variant>ene</variant>
<variant>enne</variant>
<variant>en</variant>
<variant>ane</variant>
<variant>on</variant>
<variant>one</variant>
<variant>anne</variant>
<variant>æne</variant>
<variant>ænne</variant>
<variant>anre</variant>
<variant>are</variant>
<variant>hare</variant>
<variant>ore</variant>
<variant>anes</variant>
<variant>ænes</variant>
<variant>ænnes</variant>
<variant>enes</variant>
<variant>ennes</variant>
a
独立艺术。
一
电子邮箱
在…上
o
电子邮箱
在…上
一
o
电子邮箱
安妮
æne
ænne
烯
埃纳
EN
电子邮箱
在…上
一
安妮
æne
ænne
安雷
是
野兔
矿石
阿纳斯
ænes
ænnes
埃内斯
埃内斯
如果您的查询继续进行
<headword>a</headword>
<part_of_speech> indef. art. </part_of_speech>
<variant>an</variant>
<variant>ane</variant>
<variant>on</variant>
<variant>o</variant>
<variant>ane</variant>
<variant>on</variant>
<variant>one</variant>
<variant>o</variant>
<variant>ane</variant>
<variant>anne</variant>
<variant>æne</variant>
<variant>ænne</variant>
<variant>ene</variant>
<variant>enne</variant>
<variant>en</variant>
<variant>ane</variant>
<variant>on</variant>
<variant>one</variant>
<variant>anne</variant>
<variant>æne</variant>
<variant>ænne</variant>
<variant>anre</variant>
<variant>are</variant>
<variant>hare</variant>
<variant>ore</variant>
<variant>anes</variant>
<variant>ænes</variant>
<variant>ænnes</variant>
<variant>enes</variant>
<variant>ennes</variant>