尽管有标题,但我在这里问一般性问题:
有没有办法调试XPath语句,或者可能将其翻译成英语(即类似于这个奇妙的REGEX tool)
例证:我有这个XPath查询:
//transaction[@sumPrice != sum(id(@products) /@price)
假设我是XPath的新手(我是)。我想将其分解并获得一些有助于我理解每个组件的输出。但是,如果我拿出某个部分,比如id(@products)
,我不知道在哪里放置它以获得某种反馈。看来你无法分手。
我该如何分解并分析?
如果可以的话,作为奖励,我的查询是什么意思?
答案 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)]
会选择第二个交易(因为prod2
和prod3
价格的总和不是10)但不会选择第一个(因为prod1
+ prod2
给出5)。