Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何在XQuery结果中限制退货订单?_Xml_Xpath_Xquery_Basex - Fatal编程技术网

Xml 如何在XQuery结果中限制退货订单?

Xml 如何在XQuery结果中限制退货订单?,xml,xpath,xquery,basex,Xml,Xpath,Xquery,Basex,这是一个新手问题。我最近才开始学习XQuery和XPath 考虑一下这个XML <employees> <employee empid="1"> <ename>KING</ename> <mgr></mgr> <hiredate>17-11-1981</hiredate> </employee> <employe

这是一个新手问题。我最近才开始学习XQuery和XPath

考虑一下这个XML

<employees>
    <employee empid="1">
        <ename>KING</ename>
        <mgr></mgr>
        <hiredate>17-11-1981</hiredate>
    </employee>
    <employee empid="2">
        <ename>BLAKE</ename>
        <mgr>7839</mgr>
        <hiredate>1-5-1981</hiredate>
        <test>
            <sub1>one</sub1>
            <sub2>two</sub2>
        </test>
    </employee>
</employees>
我得到了

empid="1"
<ename>KING</ename>
<hiredate>17-11-1981</hiredate>
<sub1>empid1-one</sub1>
empid="2"
<ename>BLAKE</ename>
<hiredate>1-5-1981</hiredate>
<sub1>empid2-one</sub1>
<sub2>empid2-two</sub2>
empid=“1”
国王
17-11-1981
empid1-1
empid=“2”
布莱克
1-5-1981
empid2-1
empid2-2
我希望得到的结果是

empid="1"
<ename>KING</ename>
<sub1>empid1-one</sub1>
<hiredate>17-11-1981</hiredate>
empid="2"
<ename>BLAKE</ename>
<sub1>empid2-one</sub1>
<hiredate>1-5-1981</hiredate>
<sub2>empid2-two</sub2>
empid=“1”
国王
empid1-1
17-11-1981
empid=“2”
布莱克
empid2-1
1-5-1981
empid2-2
我希望结果顺序以return子句的顺序为基础


有人能给我指一下正确的方向吗?谢谢

实际上,XQuery不会更改您指定的返回值的顺序。您所观察到的是由于这样一个事实,即您的代码在循环通过
test
元素之前,首先专门循环通过所有
employee
元素,在$db/(/employees/employee,/employees/employeed/test)中说

假设一名
员工
只能有一个
测试
子项,您可以尝试以下方法:

let $db := db:open("example", "documents/employee.xml")
for $item in $db/employees/employee
let $empid := $item/@empid
let $ename := $item/ename
let $sub1 := $item/test/sub1
let $hiredate := $item/hiredate
let $sub2 := $item/test/sub2
return ($empid,$ename,$sub1,$hiredate,$sub2)

实际上,XQuery不会更改您指定的返回值的顺序。您所观察到的是由于这样一个事实,即您的代码在循环通过
test
元素之前,首先专门循环通过所有
employee
元素,在$db/(/employees/employee,/employees/employeed/test)中说

假设一名
员工
只能有一个
测试
子项,您可以尝试以下方法:

let $db := db:open("example", "documents/employee.xml")
for $item in $db/employees/employee
let $empid := $item/@empid
let $ename := $item/ename
let $sub1 := $item/test/sub1
let $hiredate := $item/hiredate
let $sub2 := $item/test/sub2
return ($empid,$ename,$sub1,$hiredate,$sub2)

har07已经给出了一个很好的答案,接受这个答案,而不是我的。作为补充,属性节点在没有父元素的情况下无法输出。可以按如下方式更改属性变量:

let $empid := $item/@empid/concat(name(), '=', ., '&#10;')
如果您更关心换行而不是只关心空白行:

let $empid := $item/@empid/concat('&#10;',name(), '=', ., '&#10;')
输出将是

<?xml version="1.0" encoding="UTF-8"?>
empid=1
<ename>KING</ename>
<hiredate>17-11-1981</hiredate>
empid=2
<ename>BLAKE</ename>
<sub1>one</sub1>
<hiredate>1-5-1981</hiredate>
<sub2>two</sub2>
empid=1
<ename>KING</ename>
<hiredate>17-11-1981</hiredate>
empid=2
<ename>BLAKE</ename>
<sub1>one</sub1>
<hiredate>1-5-1981</hiredate>
<sub2>two</sub2>
为了摆脱声明。这应该适用于最新版本的BaseX。然后,输出将是

<?xml version="1.0" encoding="UTF-8"?>
empid=1
<ename>KING</ename>
<hiredate>17-11-1981</hiredate>
empid=2
<ename>BLAKE</ename>
<sub1>one</sub1>
<hiredate>1-5-1981</hiredate>
<sub2>two</sub2>
empid=1
<ename>KING</ename>
<hiredate>17-11-1981</hiredate>
empid=2
<ename>BLAKE</ename>
<sub1>one</sub1>
<hiredate>1-5-1981</hiredate>
<sub2>two</sub2>
empid=1
国王
17-11-1981
empid=2
布莱克
一
1-5-1981
二

har07已经给出了一个很好的答案,接受这个答案,而不是我的。作为补充,属性节点在没有父元素的情况下无法输出。可以按如下方式更改属性变量:

let $empid := $item/@empid/concat(name(), '=', ., '&#10;')
如果您更关心换行而不是只关心空白行:

let $empid := $item/@empid/concat('&#10;',name(), '=', ., '&#10;')
输出将是

<?xml version="1.0" encoding="UTF-8"?>
empid=1
<ename>KING</ename>
<hiredate>17-11-1981</hiredate>
empid=2
<ename>BLAKE</ename>
<sub1>one</sub1>
<hiredate>1-5-1981</hiredate>
<sub2>two</sub2>
empid=1
<ename>KING</ename>
<hiredate>17-11-1981</hiredate>
empid=2
<ename>BLAKE</ename>
<sub1>one</sub1>
<hiredate>1-5-1981</hiredate>
<sub2>two</sub2>
为了摆脱声明。这应该适用于最新版本的BaseX。然后,输出将是

<?xml version="1.0" encoding="UTF-8"?>
empid=1
<ename>KING</ename>
<hiredate>17-11-1981</hiredate>
empid=2
<ename>BLAKE</ename>
<sub1>one</sub1>
<hiredate>1-5-1981</hiredate>
<sub2>two</sub2>
empid=1
<ename>KING</ename>
<hiredate>17-11-1981</hiredate>
empid=2
<ename>BLAKE</ename>
<sub1>one</sub1>
<hiredate>1-5-1981</hiredate>
<sub2>two</sub2>
empid=1
国王
17-11-1981
empid=2
布莱克
一
1-5-1981
二

这不起作用,因为属性节点不附加到任何对象。让$empid:=$item/@empid/concat(name(),'=',,,,,,, ;')
怎么样?这不起作用,因为属性节点不附加到任何东西。让$empid:=$item/@empid/concat(name(),'=',,,,,, ;')
怎么样?