2016-12-02 40 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键。

相关问题