Xml xquery:查找父节点是否具有不同命名空间的子节点

Xml xquery:查找父节点是否具有不同命名空间的子节点,xml,xpath,xquery,xml-namespaces,Xml,Xpath,Xquery,Xml Namespaces,我正在尝试检查命名空间“X”的节点是否具有不同命名空间“Y”的子节点。我尝试了以下xquery: declare namespace atom = "http://www.w3.org/2005/Atom"; declare namespace libx = "http://libx.org/xml/libx2"; let $doc := <node><entries xmlns="http://www.w3.org/2005/Atom" xmlns:libx="http:/

我正在尝试检查命名空间“X”的节点是否具有不同命名空间“Y”的子节点。我尝试了以下xquery:

declare namespace atom = "http://www.w3.org/2005/Atom";
declare namespace libx = "http://libx.org/xml/libx2";

let $doc := <node><entries xmlns="http://www.w3.org/2005/Atom" xmlns:libx="http://libx.org/xml/libx2"> 
             <libx:book-entry><book>Book 1</book><author>Author 1 PQR</author><title>Title 1</title></libx:book-entry> 
             <libx:car-entry><car>Car 1</car><model>Model 1</model><price>Price 1 PQR</price></libx:car-entry>
           </entries></node>, 
    $types := <types xmlns="http://libx.org/xml/libx2"><type>book-entry</type></types>, 
    $key := 'PQR'

for $type in $types/libx:type
return
   for $entry in $doc/atom:entries/*[name() eq $type]
     return $entry
声明名称空间原子=”http://www.w3.org/2005/Atom";
声明命名空间libx=”http://libx.org/xml/libx2";
让$doc:=
第1册作者1资格证书1
汽车1模型1价格1 PQR
, 
$types:=帐簿分录,
$key:=“PQR”
对于$types/libx中的$type:type
返回
对于$doc/atom中的$entry:entries/*[name()eq$type]
返回$entry
我希望结果是:
Book1Author 1pqrttle1
。但是,查询返回null,因为name函数不考虑其他名称空间。除了name()之外,还有另一个xquery函数,它接受一个名称空间参数,该参数将给出所需的结果

谢谢,
Sony

您可以使用
local-name()
函数只匹配元素的本地名称(正如您在$types中列出的那样)


或者,如果您想说得更具体一些,可以使用
local-name()
namespace-uri()
函数的组合来匹配元素名和名称空间uri。

您可以使用
local-name()
函数只匹配元素的本地名(正如您在$types中列出的那样)

或者,如果您想真正具体一点,可以将
local-name()
namespace-uri()
函数组合起来,以匹配元素名和命名空间uri

$X[namespace-uri() != */namespace-uri()]
将选择$X中至少有一个子元素的所有元素,该子元素的命名空间URI不等于父元素的命名空间URI。这是一个罕见的使用“!=”作为隐式存在的例子(如果序列中的任何成员都是这样,则为真)。

表达式

$X[namespace-uri() != */namespace-uri()]
将选择$X中至少有一个子元素的所有元素,该子元素的命名空间URI不等于父元素的命名空间URI。这是一个罕见的使用“!=”作为隐式存在的例子(如果序列中的任何成员都是这样,则为真)