首页 > 解决方案 > 计算包含特定子字符串的唯一子节点

问题描述

我对 Excel 的FILTERXML函数进行了一个小查询,并希望返回所有父<t>节点,这些父节点拥有超过 2 个包含其父节点的文本属性的唯一子节点。可视化这一点:

<x>
  <t>A
    <s>A|x</s>
    <s>A|y</s>
    <s>B|y</s>
    <s>B|z</s>
  </t>
  <t>B
    <s>B|x</s>
    <s>B|y</s>
    <s>B|Z</s>
    <s>A|x</s>
  </t>
  <t>C
    <s>C|x</s>
    <s>C|y</s>
    <s>C|x</s>
    <s>A|x</s>
  </t>
</x>

所以我想在这里返回的是 t-node B,因为它是唯一一个拥有超过 2 个持有其父母 text 属性的独特子代的节点B

因此,我想出了以下表达式:

//t[count(.//*[contains(.,concat(../text(),'|'))])>2]

这可以很好地返回B,但也可以返回C,因为它还没有考虑唯一值。因此我试图扩展这个表达式:

//t[count(.//*[contains(.,concat(../text(),'|'))][.//*[not(preceding::*=.)]])>2]

但是,现在它没有返回 t 节点。我的扩展表达式哪里出错了,我该如何解决这个问题,只B在这种情况下返回?

标签: xmlxpathxpath-1.0

解决方案


好吧,xpath 1.0 的奇妙之处......它是可行的,但看起来很丑:

//t[count(s[not(.= preceding-sibling::s/.)][contains(.,concat(../normalize-space(text()[1]),"|"))])>2]

推荐阅读