【问题标题】:XQuery: Returning more than one elementXQuery:返回多个元素
【发布时间】:2013-03-10 01:50:32
【问题描述】:

以下是描述我正在使用的 XML 结构的 DTD:

<!DOCTYPE bib [
<!ELEMENT bib (book+,magazine*)>
<!ELEMENT book (title,author+,publisher,editor?,price)>
<!ELEMENT magazine (title,publisher,editor+)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (last,first)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT editor (last, first,affiliation)>
<!ELEMENT price ((#PCDATA)>
<!ELEMENT last (#PCDATA)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT affiliation (#PCDATA)>
<!ATTLIST book year CDATA #REQUIRED>
]>

我必须编写一个 XQuery 来返回 Weikum 先生是编辑之一的所有书籍或杂志。

我在确定如何退回书籍或杂志时遇到问题。这是我能想到的:

for $x in document(“bib.xml”)/bib
where $x/book/editor/lastname = “Weikum” or $x/magazine/editor/lastname = “Weikum”
return <result></result>

但这并没有达到我想要的结果。如何退回书籍或杂志元素?我应该说return $x吗?

【问题讨论】:

    标签: xml xquery


    【解决方案1】:

    通过姓氏为“Weikum”的编辑退回书籍和杂志的最简单方法是

    //editor[lastname='Weikum']/..
    

    或者,如果您更喜欢 FLWOR 表达式,是的,如果 $x 绑定到您想要返回的内容,您可以直接说 return $x。但是,在您的草图中并非如此:您说您想归还这本书或杂志,但您已将 $x 绑定到 bib 元素。你想要更多这样的东西:

    for $x in document('bib.xml')/bib/*
    where $x/editor/lastname='Weikum'
    return $x
    

    在这两个公式中,我利用了这样一个事实,即只有书籍和杂志有名为editor 的子代,并且只有书籍和杂志才会显示为bib 的子代。在更复杂的 DTD 中,如果您需要过滤出小册子、标准和博客文章以获取只是书籍和杂志...

    ,则可能需要更复杂的表达式

    【讨论】:

    • thnx 很多......这真的很有帮助。你的第一个表达式是一个xpath,对吗?不是 xquery?
    • 严格来说,XQuery 是 XPath 的超集,所以第一个表达式既是有效的 XPath 又是 XQuery。
    【解决方案2】:

    使用

    //*[self::book or self::magazine][editor[lastname eq 'Weikum']]
    

    从 DTD 中可以清楚地看出,只有 bookmagazine 可以有一个子 editor

    如果文档通过此 DTD 成功验证,则表达式可以更简单:

    //*[editor[lastname eq 'Weikum']]
    

    如果我们相信 DTD,bookmagazine 必须是 XML 文档顶部元素的子元素

    这使我们能够提供一种可能更有效的表达方式:

    /*/*[editor[lastname eq 'Weikum']]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多