我的XML数据源是:
foreach (var name in names)
{
if (regex.IsMatch(name.InnerText))
{
name.Remove();
Console.WriteLine(name.InnerText);
Console.WriteLine(count);
}
}
我需要选择所有具有相同的impact_level子集的impact_category节点。在示例中,我想选择Cat1和Cat 3,因为它们的子值都是“不重要的”。在完成了对这些节点的一些操作后,我需要选择下一批具有不同匹配的impact_level子集的impact_category节点(在本例中为Cat2,其值为“最低”),依此类推。
我的问题是,我不知道在运行时之前的值是什么,并且对于不同的用户它们可能会有所不同。我是一个相对XPath新手所以不知道如何做到这一点。我花了几个小时在网上和书本上看,但我发现的所有例子都假设你匹配已知值。抱歉,如果这很简单,但我真的很困难。
答案 0 :(得分: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_category
元素与impact_levels
深度相等的孩子归结为另一个impact_category
s impact_levels
。
在XSLT 2.0中,您也可以对<xsl:for-each-group select="/impact_categories/impact_category" group-by="impact_levels/impact_level/name">
进行分组,如果您知道只有一个这样的后代,您可以轻松地将这些元素组合在一起,如果有多个您可能想要计算指纹或使用XSLT 3.0和复合键。