【问题标题】:select nodes with matching but unknown values in child nodes在子节点中选择具有匹配但未知值的节点
【发布时间】:2016-12-02 09:27:32
【问题描述】:

我的 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 和 Cat 3,因为它们的子值都是“无关紧要的”。对这些节点做了一些操作后,我需要选择下一批具有不同匹配 Impact_level 子节点集的 Impact_category 节点(在本例中为 Cat2,其值为“Lowest”),依此类推。

我的问题是直到运行时我才知道这些值是什么,而且对于不同的用户它们可能会有所不同。我是一个相对的 XPath 新手,所以不知道该怎么做。我花了好几个小时在网上和书中查找,但我发现的所有示例都假设您匹配已知值。抱歉,如果这真的很简单,但我真的卡住了。

【问题讨论】:

  • 对于新手来说非常“硬核”(正如我们用德语所说的那样)。查找muenchian grouping
  • 但是,如果您事先不知道影响级别的可能值,您希望如何选择特定的影响类别进行进一步处理?

标签: xpath xpath-2.0


【解决方案1】:

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_categorys impact_levels

在 XSLT 2.0 中,您还可以对 &lt;xsl:for-each-group select="/impact_categories/impact_category" group-by="impact_levels/impact_level/name"&gt; 进行分组,如果您知道只有一个这样的后代,您可以通过这种方式轻松地将元素组合在一起,如果有多个您可能想要计算指纹或使用 XSLT 3.0 和复合键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多