2016-11-07 107 views
0

我试图编写一个查询,该查询根据特定字符串是否存在于同一个父节点中来返回节点。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中的发布者已经发布了其他几本书,但只有一本关于数据库,因此它不应该出现在结果中。

任何人都知道如何解决这个问题?

回答

1

的问题是,如果任何一个出版商匹配,就可在数据库这里返回每个出版商:

... 
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字段和其他字段,您就会得到误报。

+0

谢谢。不过,这个查询返回与我的完全相同的XML。开始认为我的XML有什么问题,只是看不到它会是什么。 – Sebastian

+0

您需要共享一组更大的测试数据。这是不可能的,否则 – wst

+0

好吧。添加更多主要职位。 – Sebastian

1

该查询应该查找尚未在“数据库”字段中发布图书的发布者。

这仅仅在XPath中是微不足道的。也许你在想太复杂。

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

而且这可以做出独特的和第二步容易排序。