【问题标题】:xpath: contains() for a group of answersxpath: contains() 用于一组答案
【发布时间】:2013-06-07 23:14:30
【问题描述】:

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

有什么建议吗?

谢谢。

【问题讨论】:

  • 能否提供您正在运行以测试 XPath 表达式的 XML 文档和代码?
  • @AJ,我添加了我正在使用的示例。希望对您有所帮助....
  • 解释预期的答案?您想从bid=1 返回@authors 吗?或者您想返回一个唯一的作者列表和相应的书籍?
  • 最初的问题是指定有多少不同的作者,以便这些作者写任何书。我稍微更改了示例以使其不那么混乱。一种方法是计算这些作者,然后对结果进行计数。这就是我在这里尝试做的。

标签: xpath dtd


【解决方案1】:

我找到了我正在寻找的答案。其实没那么难,只要熟悉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 的参数是节点集类型时,结果是将 id 应用于参数节点集中每个节点的字符串值的结果的并集。当 id 的参数是任何其他类型时,参数将被转换为字符串,就像调用 string 函数一样;该字符串被拆分为一个以空格分隔的标记列表(空格是与产生式 S 匹配的任何字符序列);结果是一个节点集,其中包含与上下文节点相同的文档中的元素,这些元素的唯一 ID 等于列表中的任何标记。

【讨论】:

  • 该查询未返回预期结果。那是怎么回事?
  • 我稍微编辑了这个例子来阐明我的想法。希望现在不那么混乱了。
  • 很高兴你知道了这一点!这不是我采用的方向……但它完全适合我,就像你做的那样。我使用 libxml2 在 python 中构建了一个简单的测试工具,如果有人想看到它,我可以发布它...
  • 值得注意的是,它只能使用适当的 ID/IDREFS 关系,无论是通过 DTD 还是可能是 XML Schema。没有它,表达式将返回空节点集。 (哦,还有 +1 - 我不知道 id()
猜你喜欢
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多