Xml XQuery/XPath:尝试基于不同节点的值返回节点
我试图编写一个查询,根据同一父节点中是否存在特定字符串返回节点 我的XML的一个示例,它有一个根元素“books”,让您了解它的外观 编辑:添加了更大的数据块。省略了“bok”的一些子元素,因为它们不相关。 这是挪威语,如果你想知道: fagbøker=教科书 书 tittel=标题 福法特=作者 fornavn,mellomnavn,etternavn=名字,中间名,姓氏 forlag=出版商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 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完全不熟悉,所以这些小事有时会让我忘记。