这个XPath查询有什么作用?

时间:2014-01-15 16:01:01

标签: xml xpath translation

尽管有标题,但我在这里问一般性问题:

有没有办法调试XPath语句,或者可能将其翻译成英语(即类似于这个奇妙的REGEX tool

例证:我有这个XPath查询:

//transaction[@sumPrice != sum(id(@products) /@price)

假设我是XPath的新手(我是)。我想将其分解并获得一些有助于我理解每个组件的输出。但是,如果我拿出某个部分,比如id(@products),我不知道在哪里放置它以获得某种反馈。看来你无法分手。 我该如何分解并分析?

如果可以的话,作为奖励,我的查询是什么意思?

1 个答案:

答案 0 :(得分:2)

我不知道一个工具,但一些基本概念可以帮助你。

  • //transaction将选择位于源文档中任何位置的无名称空间中名为transaction的所有元素。
  • [...]表达式是谓词,对于由其附加的路径步骤选择的每个元素进行一次评估,并对列表进行过滤以仅提取其中的节点谓词是真的。

要打破这样的表达式以进行调试,您必须从左侧开始并一次添加一个步骤,随时检查结果。对于谓词,您必须手动迭代谓词所附加的表达式的结果,然后评估谓词表达式的(部分),并将上下文节点依次设置到该列表中的每个节点。具体如何操作取决于您使用的XPath工具或库。


因此,在这种特定情况下,我们选择sumPrice值与

值不同的所有交易
sum(id(@products) /@price)

id(@products)获取正在测试的products上的transaction属性的值,将其在空白处拆分为一系列标记,然后在文档中查找元素集具有ID属性(这意味着根据文档的DTD的类型ID的属性 - 它可能不一定被称为id),其值与任何这些令牌相同。最后,/@price会为每个元素提供price属性,sum将这些元素全部合计。例如,给定这个XML:

<!DOCTYPE root [
  <!-- rest of DTD omitted -->
  <!ATTLIST product ident ID #REQUIRED>
]>
<root>
  <transactions>
    <transaction sumPrice="5" products="prod1 prod2" />
    <transaction sumPrice="10" products="prod2 prod3" />
  </transactions>
  <product ident="prod1" price="3" />
  <product ident="prod2" price="2" />
  <product ident="prod3" price="4" />
</root>

表达式

//transaction[@sumPrice != sum(id(@products)/@price)]

会选择第二个交易(因为prod2prod3价格的总和不是10)但不会选择第一个(因为prod1 + prod2给出5)。