0

xpath を使用して、シェイクスピア劇を含む xml ファイルをクエリしています (xpath を勉強しています)。今度は、ジュリエットがロミオ(彼の直後に話す)に何回反応したか知りたいです。私はこのxpath式を使用していました:

1: count(doc('r_and_j.xml')//SPEAKER[. = "JULIET" and ../preceding-sibling::SPEECH[1]/SPEAKER = "ROMEO"])

それでも、これは私に4を返しますが、これは明らかに正しくありません...ただし、これは機能します:

2: count(doc('r_and_j.xml')//SPEECH[SPEAKER = "JULIET" and (preceding-sibling::SPEECH[1]/SPEAKER = "ROMEO")]

厄介な別のクエリは次のとおりです。ロミオとジュリエットの次の幕と共通のスピーカーがない幕のタイトルを知りたいです。

3: doc('r_and_j.xml')//ACT[not(.//SPEAKER = ./following-sibling::ACT[1]//SPEAKER)]/TITLE

正しい結果を提供できませんが、これは次のことを行います。

4: doc('r_and_j.xml')//ACT[not(distinct-values(.//SPEAKER) = distinct-values(./following-sibling::ACT[1]//SPEAKER))]/TITLE

xpath 式 1,3 では答えが返されず、2,4 では返されない理由がわかりません。解決策として3が与えられたので、これは何か関係があるのでしょうか。うまくいかないようです。

私が取り組んでいるxmlがわからない場合、これに答えるのは難しいので(少なくとも1,2については)、dtdをここに投稿します:

<!-- DTD for Shakespeare    J. Bosak    1994.03.01, 1997.01.02 -->
<!-- Revised for case sensitivity 1997.09.10 -->
<!-- Revised for XML 1.0 conformity 1998.01.27 (thanks to Eve Maler) -->

<!ENTITY amp "&#38;#38;">
<!ELEMENT PLAY     (TITLE, FM, PERSONAE, SCNDESCR, PLAYSUBT, INDUCT?,
                             PROLOGUE?, ACT+, EPILOGUE?)>
<!ELEMENT TITLE    (#PCDATA)>
<!ELEMENT FM       (P+)>
<!ELEMENT P        (#PCDATA)>
<!ELEMENT PERSONAE (TITLE, (PERSONA | PGROUP)+)>
<!ELEMENT PGROUP   (PERSONA+, GRPDESCR)>
<!ELEMENT PERSONA  (#PCDATA)>
<!ELEMENT GRPDESCR (#PCDATA)>
<!ELEMENT SCNDESCR (#PCDATA)>
<!ELEMENT PLAYSUBT (#PCDATA)>
<!ELEMENT INDUCT   (TITLE, SUBTITLE*, (SCENE+|(SPEECH|STAGEDIR|SUBHEAD)+))>
<!ELEMENT ACT      (TITLE, SUBTITLE*, PROLOGUE?, SCENE+, EPILOGUE?)>
<!ELEMENT SCENE    (TITLE, SUBTITLE*, (SPEECH | STAGEDIR | SUBHEAD)+)>
<!ELEMENT PROLOGUE (TITLE, SUBTITLE*, (STAGEDIR | SPEECH)+)>
<!ELEMENT EPILOGUE (TITLE, SUBTITLE*, (STAGEDIR | SPEECH)+)>
<!ELEMENT SPEECH   (SPEAKER+, (LINE | STAGEDIR | SUBHEAD)+)>
<!ELEMENT SPEAKER  (#PCDATA)>
<!ELEMENT LINE     (#PCDATA | STAGEDIR)*>
<!ELEMENT STAGEDIR (#PCDATA)>
<!ELEMENT SUBTITLE (#PCDATA)>
<!ELEMENT SUBHEAD  (#PCDATA)>

xml (およびロミオとジュリエット以外の他の劇) へのリンク: http://metalab.unc.edu/bosak/xml/eg/shaks200.zip

4

1 に答える 1

1

SPEAKER 要素内の SPEAKER 要素を (部分的に) 検索するように求めているため、最初のクエリから 4 を取得する方法がわかりませんが、DTD ではこれが許可されていません。

http://www.ibiblio.org/xml/examples/shakespeare/で入手できる XML プレイ テキストを使用しています。

Rのスピーチが先行するジュリエットのすべてのスピーチを見つけたい場合は、(これを構築しましょう)

すべてのスピーチ:

//SPEECH(841 個の要素を返します)

ジュリエットによるすべてのスピーチ:

//SPEECH[SPEAKER='JULIET'](118 要素を返します)

そして最後に:

//SPEECH[SPEAKER='JULIET' and preceding-sibling::SPEECH[1][SPEAKER='ROMEO']](37 個の要素を返します)

2 番目のタスクは非常に困難ですが、= 演算子を使用して実行できます。ノード セットを比較すると、セット内のいずれかの値が共有されている場合に true が返されます。したがって、次のようになります。

//ACT[ following-sibling::ACT and not(.//SPEAKER = following-sibling::ACT[1]//SPEAKER)]/TITLE

当然のことながら、劇中のすべての隣接する Act には共通のスピーカーがあるため、何も返されません。

于 2011-06-01T21:40:18.543 に答える