我正在尝试学习XPath,而我在进行嵌套搜索时遇到了麻烦(使用contains).
具体来说,我得到了以下问题:
根据以下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
有什么建议?
谢谢.
最佳答案 我找到了我正在寻找的答案.实际上并不困难,只需要熟悉XPath的“id”功能即可.
对此的XPAth查询是:
COUNT(ID(//书/ @作者))
作者列表可以作为id(// book / @ authors)给出.请注意,此xquery返回完整的xml(而不仅仅是名称):
<author aid="a1"/>
<author aid="a2"/>
<author aid="a3"/>
<author aid="a4"/>
函数包含在这种情况下不适用,但幸运的是,它也没有必要.
id函数按其唯一ID选择元素.当id的参数是node-set类型时,结果是将id应用于参数node-set中每个节点的string-value的结果.当id的参数是任何其他类型时,参数将被转换为字符串,就像调用字符串函数一样;字符串被拆分成以空格分隔的标记列表(空格是与生产S匹配的任何字符序列);结果是一个节点集,其中包含与上下文节点在同一文档中的元素,这些元素的唯一ID等于列表中的任何标记.