XQuery/XPath:尝试根据不同节点的值返回节点
我试图编写一个查询,该查询根据特定字符串是否存在于同一个父节点中来返回节点。XQuery/XPath:尝试根据不同节点的值返回节点
我的XML的一个例子,它有一个根元素“书”,让你知道它的样子。
编辑:添加了一个较大的数据。因为它们不相关,所以省略了一些“bok”的子元素。 这是挪威的,所以如果你想知道:
fagbøker=教科书
书=书
tittel =标题
forfatter =作者
fornavn,mellomnavn, etternavn = forename,middlename,lastname
forlag = publisher
<?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>
该查询应该查找尚未在“数据库”字段中发布图书的发布者。我的其他几本书不是关于数据库的,还有那些没有发表过任何内容的出版商。
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>
这会返回我拥有的每个发布者。上述XML中的发布者是我不想要的结果中唯一的发布者。上述XML中的发布者已经发布了其他几本书,但只有一本关于数据库,因此它不应该出现在结果中。
任何人都知道如何解决这个问题?
的问题是,如果任何一个出版商匹配,就可在数据库这里返回每个出版商:
...
return
$doc//publisher)
相反,你可以在每一个不同的发布者名称重复,那么仅这些发布商,其字段筛选不包含Database
:
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>
返回:
<publisher>Addison-Wesley Professional</publisher>
<publisher>Pearson Education Canada</publisher>
<publisher>Programmering</publisher>
关于!=
需要注意的一件棘手的事情是,如果任何一方的任何物品不等于任何其他物品,它将返回true。所以1 != (1, 2)
是真的,因为1 != 2
。如果只想在任何一边没有任何物品都相等的情况下返回true,则使用=
并取反。否则,只要发布者包含Database
字段和其他字段,您就会得到误报。
该查询应该查找尚未在“数据库”字段中发布图书的发布者。
这仅仅在XPath中是微不足道的。也许你在想太复杂。
$doc//publisher[not(../field = 'Database')]
而且这可以做出独特的和第二步容易排序。
谢谢。不过,这个查询返回与我的完全相同的XML。开始认为我的XML有什么问题,只是看不到它会是什么。 – Sebastian
您需要共享一组更大的测试数据。这是不可能的,否则 – wst
好吧。添加更多主要职位。 – Sebastian