0

以下は、私が扱っている 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>
]>

Weikum 氏が編集者の 1 人であるすべての本または雑誌を返すには、XQuery を作成する必要があります。

本や雑誌の返却方法に困っています。これは私が思いつくことができるものです:

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

しかし、これは私の望ましい結果を達成していません。本や雑誌の要素を返品するにはどうすればよいですか? 私はちょうど言うべきreturn $xですか?

4

2 に答える 2

1

姓が「Weikum」の編集者がいる本や雑誌を返品する最も簡単な方法は次のとおりです。

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

または、FLWOR 式を好む場合は、そうです、return $x$x が返したいものにバインドされている場合は、単に と言うことができます。ただし、スケッチではそうではありません。本または雑誌を返却したいと言っていますが、bib要素に $x をバインドしています。あなたはこのようなものがもっと欲しい:

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

editorこれらの 2 つの定式化では、本と雑誌だけが という名前の子を持ち、本と雑誌だけが の子として表示されるという事実を利用していbibます。より複雑な DTD では、書籍や雑誌だけを取得するためにパンフレット、標準、ブログ投稿を除外する必要がある場合、より複雑な式が必要になる場合があります...

于 2013-03-10T02:15:01.543 に答える
0

使用:

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

bookDTD から、 aまたは aだけmagazineが child を持つことができることは明らかですeditor

ドキュメントがこの DTD に対して正常に検証された場合、式はより単純になります。

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

DTD と考える場合、abookまたは amagazineは XML ドキュメントの最上位要素の子である必要があります

これにより、潜在的により効率的な式を提供できます。

/*/*[editor[lastname eq 'Weikum']]
于 2013-03-10T05:44:56.547 に答える