xpath:contains()表示一组答案

时间:2010-01-27 16:30:24

标签: xpath dtd

我正在尝试学习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

有什么建议吗?

感谢。

1 个答案:

答案 0 :(得分: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应用于参数node-set中每个节点的string-value的结果。当id的参数是任何其他类型时,参数将被转换为字符串,就像调用字符串函数一样;字符串被拆分成以空格分隔的标记列表(空格是与生产S匹配的任何字符序列);结果是一个节点集,其中包含与上下文节点在同一文档中的元素,这些元素的唯一ID等于列表中的任何标记。