我正在尝试学习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 :(得分: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等于列表中的任何标记。