2010-01-27 81 views
4

我正在尝试学习XPath,并且在做嵌套搜索时遇到了麻烦(使用contains)。xpath:包含()一组答案

具体来说,我得到了以下问题:

有作者的列表,以及一个书单,根据下面的DTD:

<!ELEMENT db1 (book*, author*)> 
<!ELEMENT book (title)> 
<!ATTLIST book 
    bid ID #REQUIRED 
    authors IDREFS #REQUIRED 
> 
<!ELEMENT title (#PCDATA)> 
<!ELEMENT author (#PCDATA)> 
<!ATTLIST author 
    aid ID #REQUIRED 
> 

编写返回XPath表达式写书的作者数量。有可能假设没有两个作者ID相互包含。

我尝试了很多事情,但我总是收到“包含的项目太多”的错误。 我尝试运行是这样的:

//author/@aid[contains(//book/@authors/string(.), string(.))] 

我使用下面的XML文件为例:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE db1 SYSTEM "C:\blabla\db1.dtd"> 
<db1> 
<book authors="a1 a3 a4" bid="b1"> 
<title>Book 1</title> 
</book> 
<book authors="a1 a2 a3" bid="b2"> 
<title>Book 2</title> 
</book> 
<book authors="a4" bid="b3"> 
<title>Book 3</title> 
</book> 
<author aid="a1"></author> 
<author aid="a91"></author> 
<author aid="a2"></author> 
<author aid="a88"></author> 
<author aid="a3"></author> 
<author aid="a4"></author> 
<author aid="a5"></author> 
<author aid="a6"></author> 

</db1> 

预期的答案应该是

a1 a2 a3 a4 

有什么建议?

谢谢。

+0

您能否提供您正在运行的XML文档和代码来测试XPath表达式? – 2010-01-27 19:38:59

+0

@AJ,我添加了我正在使用的示例。希望它有帮助.... – Anna 2010-01-27 20:07:10

+0

解释预期的答案?你想从bid = 1返回@authors吗?或者您是否想要返回具有相应书籍的作者的唯一列表? – 2010-01-28 07:37:34

回答

2

我找到了我正在寻找的答案。实际上这并不难,只需要熟悉XPath的'id'特性。

XPath查询这个是: count(id(//book/@authors))

作者列表给出作为id(//book/@authors)。请注意,这个XQuery的(只,而不是名称)返回完整的XML:

<author aid="a1"/> 
<author aid="a2"/> 
<author aid="a3"/> 
<author aid="a4"/> 

reference

功能contains在这种情况下不适用,但幸运的是,它也不是真的有必要。

id函数通过其唯一ID选择元素。当id的参数是node-set类型时,则结果是将id应用到参数节点集中每个节点的字符串值的结果的并集。当id的参数具有任何其他类型时,参数将转换为字符串,就像通过调用字符串函数一样;该字符串被拆分为一个以空格分隔的令牌列表(空格是与生产S匹配的任何字符序列);结果是包含与上下文节点相同的文档中的元素的节点集具有唯一ID等于列表中的任何标记。

+0

该查询不会返回预期的结果。那是怎么回事? – 2010-01-28 07:34:05

+0

我编辑了一下这个例子,说明了我的想法。希望现在不那么困惑。 – Anna 2010-01-28 09:02:01

+0

很高兴你明白了这一点!这不是我采用它的方向......但它对我来说完全适合你。我使用libxml2在python中构建了一个简单的测试工具,如果有人想看到它,我可以发布它... – 2010-01-28 14:31:03