用于选择内部标记的最后一个的Xpath表达式

时间:2017-10-22 23:51:41

标签: xpath openerp

对于这个XML摘录,我想指定“最后一个内部组”,在本例中为“报告”,但在该内部区域可能有更多标签,我希望最后一个在“其他信息”中

那么我怎么能说“页面的最后一个内组string='Other Information'”?

 <page string="Other Information">
    <group>
        <group string="Sales Information" name="sales_person">
            <field name="user_id"/>
            <field name="team_id" options="{'no_create': True}"/>
            <field name="client_order_ref"/>
            <field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
            <field name="project_id" attrs="{'invisible':[('state','=','sale')]}" context="{'default_partner_id':partner_invoice_id, 'default_name':name}" groups="analytic.group_analytic_accounting"/>
            <field name="related_project_id" attrs="{'readonly': ['|',('project_id','!=',False),('invoice_count','!=',0),('state','=','sale')],'invisible':[('state','!=','sale')]}" context="{'default_partner_id':partner_invoice_id, 'default_name':name}" groups="analytic.group_analytic_accounting"/>
        </group>
        <group name="sale_pay" string="Invoicing">
            <field name="fiscal_position_id" options="{'no_create': True}"/>
            <field name="invoice_status" attrs="{'invisible': [('state', 'not in', ('sale','done'))]}"/>
        </group>
        <!-- ***** THIS ONE ****** -->
        <group string="Reporting" name="technical" groups="base.group_no_one">
            <field groups="base.group_no_one" name="origin"/>
        </group>
        <!-- ***** THIS ONE ****** -->
    </group>
</page>

3 个答案:

答案 0 :(得分:2)

这应该给你最后一个内部标签:

fields: {
            account: {
                validators: {
                    notEmpty: {
                    },
                    stringLength: {
                        min: 4,
                        max: 8,
                    },
                    regexp: {
                        regexp: /^[a-zA-Z0-9_\.]+$/,
                    }
                }
            },

括号确保从所有组中,您实际上得到的是最后一个。

答案 1 :(得分:1)

Location Path:用于最后一个节点。

选择page[last]/group[last] element最后一个子组节点。

(//page[@string="Other Information"]/group)[last()]
//page[@string="Other Information"][last()]/child::group[position()=1]
//page[@string="Other Information"][last()]/child::group[position()=last()]

选择page[last]/group[last]/group[last] element

(//page[@string="Other Information"]//group)[last()]
(//page[@string="Other Information"]/group)[last()]/child::group[position()=1]
(//page[@string="Other Information"]/group)[last()]/child::group[position()=last()]

选择上下文节点的最后一个但是一个para子项

(//page[@string="Other Information"]/group)[last()]/child::group[position()=last()-1]
(//page[@string="Other Information"]/group)[last()]/child::group[position()=last()]/preceding-sibling::*[1]

[attribute::type="warning"]

的子节点
(//page[@string="Other Information"]/group)[last()]/child::group[position()=last()][attribute::string="Reporting"]

Test XML

<page string="Other Information">
    <!-- page[last]/group[last] -->
    <group>
        <group string="Sales Information" name="sales_person">
            <field name="user_id"/>
            <field name="team_id" options="{'no_create': True}"/>
        </group>
        <group name="sale_pay" string="Invoicing">
            <field name="fiscal_position_id" options="{'no_create': True}"/>
        </group>
        <!-- page[last]/group[last]/group[last] -->
        <group string="Reporting" name="technical" groups="base.group_no_one">
            <field groups="base.group_no_one" name="origin"/>
        </group>
    </group>
</page>

答案 2 :(得分:1)

选择最后一项的xpath是:

(somepath)[last()]

所以@ eLRuLL的答案在一般情况下是正确的,但是在xpath中保留一些结构总是更好,如果你知道你的xml结构 - 明确说明你需要获得标签的级别,所以在制造刹车的情况下 - 你会知道的:

(//page[@string="Other Information"]/group/group)[last()]

或者至少只选择具有名称的组,而不是选择作为包装器的组:

(//page[@string="Other Information"]//group[@name])[last()]