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/XPath:尝试基于不同节点的值返回节点_Xml_Xpath_Xquery - Fatal编程技术网

Xml XQuery/XPath:尝试基于不同节点的值返回节点

Xml XQuery/XPath:尝试基于不同节点的值返回节点,xml,xpath,xquery,Xml,Xpath,Xquery,我试图编写一个查询,根据同一父节点中是否存在特定字符串返回节点 我的XML的一个示例,它有一个根元素“books”,让您了解它的外观 编辑:添加了更大的数据块。省略了“bok”的一些子元素,因为它们不相关。 这是挪威语,如果你想知道: fagbøker=教科书 书 tittel=标题 福法特=作者 fornavn,mellomnavn,etternavn=名字,中间名,姓氏 forlag=出版商 <?xml version="1.0" encoding="UTF-8"?> <

我试图编写一个查询,根据同一父节点中是否存在特定字符串返回节点

我的XML的一个示例,它有一个根元素“books”,让您了解它的外观

编辑:添加了更大的数据块。省略了“bok”的一些子元素,因为它们不相关。 这是挪威语,如果你想知道:

fagbøker=教科书

tittel=标题

福法特=作者

fornavn,mellomnavn,etternavn=名字,中间名,姓氏

forlag=出版商

<?xml version="1.0" encoding="UTF-8"?>

<?xml-model href="Fagb%C3%B8ker.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?>
<fagbøker>
  <bok isbn="9780321197849">
    <tittel>An Introduction to Database Systems</tittel>
    <forfatter>
        <fornavn>Christopher</fornavn>
        <mellomnavn>J.</mellomnavn>
        <etternavn>Date</etternavn>
    </forfatter>
    <fagfelt>
        <felt>Databaser</felt> 
    </fagfelt>
    <forlag>Pearson</forlag>
</bok>

<bok isbn="9780321392794">
    <tittel>Data Structures in Java: From Abstract Data Types to the Java Collections
        Framework</tittel>
    <forfatter>
        <fornavn>Simon</fornavn>
        <etternavn>Gray</etternavn>
    </forfatter>
    <fagfelt>
        <felt>Programmering</felt>
    </fagfelt>
    <forlag>Pearson</forlag>

</bok>

<bok isbn="0321165810">
    <tittel>XQuery: The XML Query Language</tittel>
    <forfatter>
        <fornavn>Brundage</fornavn>
        <etternavn>Michael</etternavn>
    </forfatter>
    <fagfelt>
        <felt>XML</felt>
    </fagfelt>
    <forlag>Addison-Wesley Professional</forlag>
</bok>

<bok isbn="0201730472">
    <tittel>Discrete Mathematics for Computing</tittel>
    <forfatter>
        <fornavn>Rod</fornavn>
        <etternavn>Haggarty</etternavn>
    </forfatter>
    <fagfelt>
        <felt>Matematikk</felt>
    </fagfelt>
    <forlag>Addison-Wesley Professional</forlag>
</bok>

<bok isbn="0321417461">
    <tittel>Prolog Programming for Artificial Intelligence</tittel>
    <forfatter>
        <fornavn>Ivan</fornavn>
        <etternavn>Bratko</etternavn>
    </forfatter>
    <fagfelt>
        <felt>Kunstig intelligens</felt>
    </fagfelt>
    <forlag>Pearson Education Canada</forlag>
</bok>

<bok isbn="3540126899">
    <tittel>A Programming Logic</tittel>
    <forfatter>
        <fornavn>Robert</fornavn>
        <mellomnavn>L.</mellomnavn>
        <etternavn>Constable</etternavn>
    </forfatter>
    <fagfelt>
        <felt>Programmering</felt>
    </fagfelt>
    <forlag>Springer-Verlag London LTD</forlag>
 </bok>
</fagbøker>

数据库系统简介
克里斯托弗
J
日期
数据库
皮尔逊
Java中的数据结构:从抽象数据类型到Java集合
框架
西蒙
灰色
编程
皮尔逊
XQuery:XML查询语言
布伦达吉
迈克尔
XML
艾迪生卫斯理职业酒店
计算用离散数学
杆
哈加蒂
马特马蒂克
艾迪生卫斯理职业酒店
人工智能的Prolog程序设计
伊凡
布拉特科
昆斯蒂格智能
加拿大培生教育
编程逻辑
罗伯特
L
警员
编程
斯普林格威拉格伦敦有限公司
该查询应该在“数据库”字段中查找尚未出版图书的出版商。我的XML中还有几本书不是关于数据库的,还有一些出版商没有在这个领域发表过任何东西

 for $publisher in distinct-values(
 let $doc := doc('../Fagboker.xml')
 where every $field in $doc
    satisfies $field//fieldname != 'Database'
 return
    $doc//publisher)

 return
    <publisher>{$publisher}</publisher>
$publisher的不同值的
(
让$doc:=doc('../Fagboker.xml')
其中$doc中的每个$field
满足$field//fieldname!=“数据库”
返回
$doc//publisher)
返回
{$publisher}
这将返回我所有的出版商。上面XML中的发布者是我在结果中不想要的唯一发布者。上述XML中的出版商还出版了其他几本书,但只出版了一本关于数据库的书,因此结果中不应该出现这本书


有人知道我该如何解决这个问题吗?

问题是,如果任何一个发布服务器匹配,您将在此处返回数据库中的每个发布服务器:

...
return
  $doc//publisher)
相反,您可以迭代每个不同的发布者名称,然后仅按字段不包含
数据库的发布者进行筛选:

let $doc := doc('../Fagboker.xml')
for $publisher in distinct-values($doc//forlag)
where (
  every $field in $doc//bok[forlag = $publisher]//fagfelt
  satisfies not($field//felt = 'Databaser')
  ) 
return <publisher>{$publisher}</publisher>
let$doc:=doc('../Fagboker.xml')
对于不同值的$publisher($doc//forlag)
在哪里(
$doc//bok[forlag=$publisher]//fagfelt中的每个$field
不满足($field//feel='Databaser')
) 
返回{$publisher}
返回:

<publisher>Addison-Wesley Professional</publisher>
<publisher>Pearson Education Canada</publisher>
<publisher>Programmering</publisher>
Addison Wesley Professional
加拿大培生教育
编程

关于
,需要注意一件棘手的事情=
是指,如果任意一侧的任何项不等于任何其他项,则返回true。所以
1!=(1,2)
为真,因为
1!=2
。如果只想在两边的项都不相等时返回true,则使用
=
并将其取反。否则,每当发布服务器包含
数据库
字段和另一个字段时,就会出现误报。

问题是,如果任何一个发布服务器匹配,您将在此处返回数据库中的每个发布服务器:

...
return
  $doc//publisher)
相反,您可以迭代每个不同的发布者名称,然后仅按字段不包含
数据库的发布者进行筛选:

let $doc := doc('../Fagboker.xml')
for $publisher in distinct-values($doc//forlag)
where (
  every $field in $doc//bok[forlag = $publisher]//fagfelt
  satisfies not($field//felt = 'Databaser')
  ) 
return <publisher>{$publisher}</publisher>
let$doc:=doc('../Fagboker.xml')
对于不同值的$publisher($doc//forlag)
在哪里(
$doc//bok[forlag=$publisher]//fagfelt中的每个$field
不满足($field//feel='Databaser')
) 
返回{$publisher}
返回:

<publisher>Addison-Wesley Professional</publisher>
<publisher>Pearson Education Canada</publisher>
<publisher>Programmering</publisher>
Addison Wesley Professional
加拿大培生教育
编程
关于
,需要注意一件棘手的事情=
是指,如果任意一侧的任何项不等于任何其他项,则返回true。所以
1!=(1,2)
为真,因为
1!=2
。如果只想在两边的项都不相等时返回true,则使用
=
并将其取反。否则,每当发布者包含
数据库
字段和另一个字段时,就会出现误报

该查询应该在“数据库”字段中查找尚未出版图书的出版商

仅在XPath中,这是非常简单和直接的。也许你的想法太复杂了

$doc//publisher[not(../field = 'Database')]
在第二步中,它可以变得独一无二,并且很容易分类

该查询应该在“数据库”字段中查找尚未出版图书的出版商

仅在XPath中,这是非常简单和直接的。也许你的想法太复杂了

$doc//publisher[not(../field = 'Database')]

第二步就可以使其变得独特,并轻松排序。

谢谢。不过,此查询返回的XML与我的完全相同。开始认为我的XML有问题,只是看不到它可能是什么。你需要共享一组更大的测试数据。很难说otherwise@Sebastian当我更新测试数据并查询您的更改时,它似乎返回了您要求的输出。谢谢!出于某种原因,我在let的表达上有一点不同。。我对XML/Xquery完全陌生,所以这些小事情有时会让我忘记。谢谢。不过,此查询返回的XML与我的完全相同。开始认为我的XML有问题,只是看不到它可能是什么。你需要共享一组更大的测试数据。很难说otherwise@Sebastian当我更新测试数据并查询您的更改时,它似乎返回了您要求的输出。谢谢!出于某种原因,我在let的表达上有一点不同。。我对XML/Xquery完全不熟悉,所以这些小事有时会让我忘记。