Xpath 表达式到 select 最后一个内部标记
Xpath expression to select the last of inner tag
对于这个 XML 摘录,我想指定 "the last inner group",在这种情况下 "Reporting" 但是那个内部区域可能有更多标签,我想要最后一个在里面"Other Information"
那我怎么说"the last inner group of page 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>
这应该给你最后一个内部标签:
(//page[@string="Other Information"]//group)[last()]
括号确保从 所有 个组中,您实际上得到最后一个。
Location Path
: 对于最后一个节点。
到selectpage[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()]
到selectpage[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()]
select是上下文节点的最后一个子节点
(//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>
select 最后一项的 xpath 是:
(somepath)[last()]
所以@eLRuLL 的回答在一般情况下是正确的,但最好在 xpath 中保留一些结构,如果您知道 xml 结构 - 明确说明您需要获取标签的级别,所以在格式化刹车时 - 你会知道的:
(//page[@string="Other Information"]/group/group)[last()]
或至少 select 仅使用名称进行分组,而不是获取作为包装器的组:
(//page[@string="Other Information"]//group[@name])[last()]
对于这个 XML 摘录,我想指定 "the last inner group",在这种情况下 "Reporting" 但是那个内部区域可能有更多标签,我想要最后一个在里面"Other Information"
那我怎么说"the last inner group of page 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>
这应该给你最后一个内部标签:
(//page[@string="Other Information"]//group)[last()]
括号确保从 所有 个组中,您实际上得到最后一个。
Location Path
: 对于最后一个节点。
到selectpage[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()]
到selectpage[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()]
select是上下文节点的最后一个子节点
(//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>
select 最后一项的 xpath 是:
(somepath)[last()]
所以@eLRuLL 的回答在一般情况下是正确的,但最好在 xpath 中保留一些结构,如果您知道 xml 结构 - 明确说明您需要获取标签的级别,所以在格式化刹车时 - 你会知道的:
(//page[@string="Other Information"]/group/group)[last()]
或至少 select 仅使用名称进行分组,而不是获取作为包装器的组:
(//page[@string="Other Information"]//group[@name])[last()]