在任意元素集内对XPath函数引用进行分组

时间:2014-09-17 17:18:50

标签: xml function xpath grouping

我有XML,例如

<doc>
 <Object id="x">
  <Attributes>
   <MATERIAL>PLA</MATERIAL>
   <METHOD>Inserted</METHOD>
   <PRESSURE>HP</PRESSURE>
  </Attributes>
 </Object>
 <Object id="y">
  <Attributes>
   <MATERIAL>P</MATERIAL>
   <METHOD>Unknown</METHOD>
   <PRESSURE>HP</PRESSURE>
  </Attributes>
 </Object>
 .
 .
 .
</doc>

其中Object元素出现一个先验未知的次数,并且我想要一个返回0或1的XPath表达式,如果条件在任何(至少1个)对象中保持为真。

做类似

的事情
number(boolean(//Object/Attributes[(MATERIAL="PLA")])) * number(boolean(//Object/Attributes[(METHOD="Unknown")])) 

返回1,因为两者在某处都是真的,但我想要一个0,因为在任何单个Object中都没有它们都是真的。

我受限于XML 1.0。

我希望有一个灵活的解决方案,或许涉及到某些我无法发现的关于Object的谓词。

每个Object属性都是唯一的,如果可以利用它。

在与SQL并行绘图时,我希望在应用感兴趣的条件时以某种方式按对象进行分组。

虽然我可以通过编程方式提取对象并单独处理它们,但我真的不愿意!

TIA, 戴夫

1 个答案:

答案 0 :(得分:1)

听起来你只需要使用and

number(boolean(//Object[Attributes/MATERIAL = "PLA" and 
                        Attributes/METHOD = "Unknown"])) 

如果您手动编写XPath(而不是动态拼接),则可以进一步简化此特定示例:

number(boolean(//Object/Attributes[MATERIAL = "PLA" and METHOD = "Unknown"]))