使用xquery for Exist db将节点从一个xml文件插入到另一个xml文件中

使用xquery for Exist db将节点从一个xml文件插入到另一个xml文件中,xml,xquery,exist-db,Xml,Xquery,Exist Db,我是一个SQL难民,不熟悉Exist db,我很难弄清楚如何使用xquery获取file1.xml(一个mysql转储)中节点的值并将其添加到file2.xml(一个TEI文件)。我想将file1中的节点与file2中的xml:id值进行匹配 我疯狂地在谷歌上搜索,试图了解xquery更新在ExistDB中的工作原理,但似乎找不到包含更复杂示例的资源 文件1如下所示: <table_data name="places"> <row> <fie

我是一个SQL难民,不熟悉Exist db,我很难弄清楚如何使用xquery获取file1.xml(一个mysql转储)中节点的值并将其添加到file2.xml(一个TEI文件)。我想将file1中的节点与file2中的
xml:id
值进行匹配

我疯狂地在谷歌上搜索,试图了解xquery更新在ExistDB中的工作原理,但似乎找不到包含更复杂示例的资源

文件1如下所示:

<table_data name="places">
    <row>
        <field name="placeref">PLACEAFRICA</field>
                <field name="placename">Africa</field>
    </row>
    <row>
        <field name="placeref">PLACEILLINOIS</field>
        <field name="placename">Illinois</field>
    </row>
</table_data>
(: Get source and target documents :)
let $rows := doc('http://00.00.00.00/file1.xml')//row
let $file2 := doc('/db/madrid/xml/file2.xml')/* 

(: Add place names by placerefs :)
for $row in $rows
  let $placeref := normalize-spaces($row/field[@name eq 'placeref'])
  let $placename := normalize-spaces($row/field[@name eq 'placename'])
  return update insert <name>{$placename}</name> 
    into $file2//place[@xml:id eq $placeref]
我想发生的事:

<listPlace>
                <place xml:id="PLACEAFRICA">
                        <bibl>OBRATDS</bibl>
                        <name>Africa</name>
                    </place>
                    <place xml:id="PLACEILLINOIS">
                        <bibl>OBRATDS</bibl>
                        <name>Illinois</name>
                    </place>
</listPlace>

目标
非洲
目标
伊利诺伊州
发生了什么:

<listPlace>
                <place xml:id="PLACEAFRICA">
                        <bibl>OBRATDS</bibl>
                        <name>Africa</name>
                        <name>Illinois</name>
                    </place>
                    <place xml:id="PLACEILLINOIS">
                        <bibl>OBRATDS</bibl>
                        <name>Africa</name>
                        <name>Illinois</name>
                    </place>
</listPlace>

目标
非洲
伊利诺伊州
目标
非洲
伊利诺伊州
我正在使用的xquery代码:

let $file1 := doc('http://00.00.00.00/file1.xml')//row
let $file2 := doc('/db/madrid/xml/file2.xml')/* 
let $file2places := $file2//tei:place
let $file2placeref := $file2//tei:place/@xml:id
let $file1placeref := $file1//field[@name='placeref']//text() 
for  $file2placename in $file1//field[@name='placename']//text() 

let $placenamenodes :=  <name>{$file1placename}</name> 
where $file1placeref=$file2placeref 

return 
update insert $placenamenodes  into $file2places
let$file1:=doc('http://00.00.00.00/file1.xml')//行
让$file2:=doc('/db/madrid/xml/file2.xml')/*
让$file2places:=$file2//tei:place
让$file2placeref:=$file2//tei:place/@xml:id
让$file1placeref:=$file1//field[@name='placeref']///text()
对于$file1//字段[@name='placename']//text()中的$file2placename
让$placenamenodes:={$file1placename}
其中$file1placeref=$file2placeref
返回
更新将$placenamenodes插入$file2places

如果您能帮助我(非常)了解我的错误所在,或者了解如何查找此类更新的资源(超出现有数据库资源),我们将不胜感激。对于代码的混乱,我深表歉意——我已经尝试了很多不同的方法。

对于XQuery初学者来说,您的问题很常见

$file2places已选择所有位置。您只想在xml:id与placeref匹配的$file2places中插入。换句话说,您省略了目标的WHERE子句,从而将新的名称标记插入到所有记录中

试着这样做:

<table_data name="places">
    <row>
        <field name="placeref">PLACEAFRICA</field>
                <field name="placename">Africa</field>
    </row>
    <row>
        <field name="placeref">PLACEILLINOIS</field>
        <field name="placename">Illinois</field>
    </row>
</table_data>
(: Get source and target documents :)
let $rows := doc('http://00.00.00.00/file1.xml')//row
let $file2 := doc('/db/madrid/xml/file2.xml')/* 

(: Add place names by placerefs :)
for $row in $rows
  let $placeref := normalize-spaces($row/field[@name eq 'placeref'])
  let $placename := normalize-spaces($row/field[@name eq 'placename'])
  return update insert <name>{$placename}</name> 
    into $file2//place[@xml:id eq $placeref]
(:获取源和目标文档:)
设$rows:=doc('http://00.00.00.00/file1.xml')//行
让$file2:=doc('/db/madrid/xml/file2.xml')/*
(:按placerefs添加地名:)
对于$row中的$row
let$placeref:=规范化空格($row/field[@name eq'placeref']))
让$placename:=规范化空格($row/field[@name eq'placename']))
返回更新插入{$placename}
放入$file2//place[@xml:id eq$placeref]
normalize spaces函数获取元素的所有文本值,将它们连接在一起,删除前导空格和尾随空格,并将单词之间的所有空白变成单个空格。它比使用//text()更有效

主要的事情是使用[@xml:id eq$placeref]过滤器限制添加了标记的位置


希望这有帮助。

对于XQuery初学者来说,您的问题很常见

$file2places已选择所有位置。您只想在xml:id与placeref匹配的$file2places中插入。换句话说,您省略了目标的WHERE子句,从而将新的名称标记插入到所有记录中

试着这样做:

<table_data name="places">
    <row>
        <field name="placeref">PLACEAFRICA</field>
                <field name="placename">Africa</field>
    </row>
    <row>
        <field name="placeref">PLACEILLINOIS</field>
        <field name="placename">Illinois</field>
    </row>
</table_data>
(: Get source and target documents :)
let $rows := doc('http://00.00.00.00/file1.xml')//row
let $file2 := doc('/db/madrid/xml/file2.xml')/* 

(: Add place names by placerefs :)
for $row in $rows
  let $placeref := normalize-spaces($row/field[@name eq 'placeref'])
  let $placename := normalize-spaces($row/field[@name eq 'placename'])
  return update insert <name>{$placename}</name> 
    into $file2//place[@xml:id eq $placeref]
(:获取源和目标文档:)
设$rows:=doc('http://00.00.00.00/file1.xml')//行
让$file2:=doc('/db/madrid/xml/file2.xml')/*
(:按placerefs添加地名:)
对于$row中的$row
let$placeref:=规范化空格($row/field[@name eq'placeref']))
让$placename:=规范化空格($row/field[@name eq'placename']))
返回更新插入{$placename}
放入$file2//place[@xml:id eq$placeref]
normalize spaces函数获取元素的所有文本值,将它们连接在一起,删除前导空格和尾随空格,并将单词之间的所有空白变成单个空格。它比使用//text()更有效

主要的事情是使用[@xml:id eq$placeref]过滤器限制添加了标记的位置


希望这能有所帮助。

非常感谢您的详细回复。这就完美地完成了这个技巧(一旦我将“规范化空间”改为“规范化空间”)。我现在意识到我以前尝试过这个方法,但是在一个地方忽略了名称空间,所以没有得到结果。嘎。再次感谢您对xquery新手的帮助。非常感谢您的详细回复。这就完美地完成了这个技巧(一旦我将“规范化空间”改为“规范化空间”)。我现在意识到我以前尝试过这个方法,但是在一个地方忽略了名称空间,所以没有得到结果。嘎。再次感谢您对xquery新手的帮助。