2016-12-02 55 views
0

我的XML數據源是:匹配,但在孩子未知數的值選擇節點的節點

<impact_categories> 
    <impact_category> 
     <name>Cat1</name> 
     <impact_levels> 
      <impact_level> 
       <name>Insignificant</name> 
      </impact_level> 
     </impact_levels> 
    </impact_category> 
    <impact_category> 
     <name>Cat2</name> 
     <impact_levels> 
      <impact_level> 
       <name>Lowest</name> 
      </impact_level> 
     </impact_levels> 
    </impact_category> 
    <impact_category> 
     <name>Cat3</name> 
     <impact_levels> 
      <impact_level> 
       <name>Insignificant</name> 
      </impact_level> 
     </impact_levels> 
    </impact_category> 
</impact_categories> 

我需要選擇具有相同組impact_level兒童的一切impact_category節點。在這個例子中,我想選擇Cat1和Cat3,因爲它們的子值都是「無意義的」。在完成這些節點的某些操作之後,我需要選擇下一批具有不同匹配impact_level子元素的impact_category節點(在本例中,其值爲「最低」的Cat2),依此類推。

我的問題是,我不會知道什麼值將直到運行時,他們可能會因不同的用戶不同。我是一個相對XPath新手,所以不知道如何做到這一點。我花了幾個小時在網上和書本上查看,但是我發現的所有例子都假設你在已知值上匹配。道歉,如果這是非常簡單的事情,但我真的卡住了。

+0

對於一個新手來說,這是一個相當「堅果」(就像我們在德語中所說的那樣)。查找[muenchian分組](http://stackoverflow.com/search?q=muenchian+grouping) –

+0

但是,如果您不知道影響級別的可能值,您希望如何選擇特定的影響類別以進一步處理前期? – Markus

回答

0

還有就是deep-equal功能,它允許你這樣你就可以例如選擇

let $cat := /impact_categories/impact_category 
return $cat[some $cat2 in ($cat except .) satisfies deep-equal(impact_levels, $cat2/impact_levels)] 

與一個impact_levels深等於孩子回到impact_category元素到另一個impact_category小號impact_levels比較子樹。

在XSLT 2.0中,你也可以將<xsl:for-each-group select="/impact_categories/impact_category" group-by="impact_levels/impact_level/name">組合起來,如果你知道只有一個這樣的後代,那麼你可以很容易地將這些元素組合在一起,如果有幾個你可能想要計算指紋或使用XSLT 3.0和composite鍵。

相關問題