2015-02-12 47 views
0

我申請的XQuery文件,兩個XML文件:XQuery/XPath:如何使用「|」從祖先節點檢索屬性值運營商?

-file1/snippet1-

<entry xml:id="SCHOM-2"> 
    <form type="hyperlemma" xml:lang="cu"> 
     <orth>абиѥ</orth> 
    </form> 
    <form type="lemma" xml:lang="cu"> 
     <orth>абиѥ</orth> 
     <cit type="counterpart" xml:lang="grc"> 
      <form type="hyperlemma" xml:lang="grc"> 
       <orth>παραχρῆμα</orth> 
      </form> 
      <form type="lemma" xml:lang="grc"> 
       <orth>παραχρῆμα</orth> 
      </form> 
     </cit> 
    </form> 
</entry> 

和 -file2/snippet2-

<entry xml:id="arg-3150"> 
    <form type="hyperlemma" xml:lang="grc"> 
     <orth>ἐξαυτῆς</orth> 
    </form> 
    <form type="lemma" xml:lang="grc"> 
     <orth>ἐξαυτῆς</orth> 
     <cit type="translation" xml:lang="cu"> 
      <form type="hyperlemma" xml:lang="cu"> 
       <orth>абиѥ</orth> 
      </form> 
      <form type="lemma" xml:lang="cu"> 
       <orth>абие</orth> 
      </form> 
     </cit> 
    </form> 
</entry> 

兩個片段具有相同的結構。如果我在任何<form type="hyperlemma">內查找「абиѥ」,snippet1的路徑爲$file//entry/form[@type='hyperlemma']/orth(path1),而snippet2的路徑爲$file//entry/form/cit/form[@type='hyperlemma']/orth(path2)。

在XQuery文件,我有以下FLWOR表達式:

xquery version "3.0"; 
... 
for $file in collection($collection_path), 
    $path_to_hyperlemma in $file//(entry | cit)/form[@type='hyperlemma']/orth [ft:query(., $searchphrase)] 
let $entry_number := $path_to_hyperlemma/../../@xml:id 
return 
.... 

$entry_number應該存儲的<entry xml:id="">的屬性值。但我這樣做的方式(使用/../../)只返回,當然,$file//entry/form[@type='hyperlemma']/orth的屬性值。

是否可以將屬性值存儲在$entry_number中,而不管它是否爲path1或path2?

另一個問題:我知道使用//不是理想的性能明智。但是,如果我用絕對路徑替換//,我似乎無法參考不同級別上的節點集。在這種情況下是否可以設置絕對路徑?

+0

問題的癥結並不十分清楚,您能否顯示一小部分您正在查詢的XML樣本? – 2015-02-12 09:19:44

+0

@IanRoberts:我添加了兩個XML片段並重新表述了我的問題。我希望現在越來越清晰了...... – smo 2015-02-12 11:54:00

回答

2

下改寫可能會有所幫助:

for $file in collection($collection_path), 
    $path_to_hyperlemma in $file/(descendant::entry | descendant::cit)/ 
     form[@type='hyperlemma']/orth[ft:query(., $searchphrase)] 
let $entry_number := $path_to_hyperlemma/ancestor::*/@xml:id 
return ... 
  • xml:id屬性解決的所有祖先。這隻適用於只有一個具有這種屬性的祖先。如果可能還有更多,您需要用它來選擇其中的一個(例如,使用[position() = 1][position() = last()]),或者在您對文檔結構的問題上給我們一些說明。

  • 通過在括號內使用descendant步驟,descendant-or-self步驟已被刪除。但是,請注意,//可以通過XQuery處理器反正進行優化(如果可能的話,請查看生成的查詢計劃)

+0

太棒了!你的兩個建議都能完美工作。非常感謝您花時間幫助! – smo 2015-02-12 16:47:54

2
let $entry_number := $path_to_hyperlemma/ancestor::entry[1]/@xml:id 

會擡頭看樹命名爲entry最近的祖先元素的xml:id

+0

它完美的作品!感謝您再次看看我的問題。 – smo 2015-02-12 16:45:34