我正在尝试使用XPath生成一个分页表。
以下是两个项目的示例:
<?xml version="1.0" encoding="utf-8"?>
<d:data xmlns:d="defiant-namespace" d:constr="Array" d:mi="114">
<d:item d:mi="24">
<name d:constr="String" d:mi="13">/Partition/MYLB1</name>
<ip d:constr="String" d:mi="14">1.1.1.1</ip>
<port d:constr="String" d:mi="15">80</port>
<pools d:constr="null"/>
<loadbalancer d:constr="String" d:mi="23">LB1</loadbalancer>
</d:item>
<d:item d:mi="51">
<name d:constr="String" d:mi="25">/Partition/MYLB2</name>
<ip d:constr="String" d:mi="26">2.2.2.2</ip>
<port d:constr="String" d:mi="27">443</port>
<pools d:mi="47" d:type="ArrayItem">
<name d:constr="String" d:mi="46">myPool</name>
</pools>
<loadbalancer d:constr="String" d:mi="50">LB2</loadbalancer>
</d:item>
<d:item d:mi="24">
<name d:constr="String" d:mi="13">/Partition/MYLB1</name>
<ip d:constr="String" d:mi="14">1.1.1.1</ip>
<port d:constr="String" d:mi="15">80</port>
<pools d:constr="null"/>
<loadbalancer d:constr="String" d:mi="23">LB1</loadbalancer>
</d:item>
</d:data>
假设我只想要此列表中的前两项,我该如何实现?
使用此查询进行管理:
//*[name][position() <= 1]
但是,我怀疑如果我稍后再添加更多子项,其中一个具有属性“name”,那么它也会受到影响。
这是我认为会起作用的,但它会返回很多我只期望的物品:
//*[position() <= 1]
我已经搜索了如何只匹配第一级孩子,如何获得数组的位置。但是在每个出现的线程中,他们知道他们搜索的是哪个值,而我只想独立于其内容或祖先数量返回元素。
对我如何思考错误以及如何正确行事的解释将非常感激!
2016-01-05 - 编辑:修改示例中较低级别的“name”。
还添加了一个示例:
我需要xpath才能返回顶级项目:
即:
<d:item d:mi="24">
<name d:constr="String" d:mi="13">/Partition/MYLB1</name>
<ip d:constr="String" d:mi="14">1.1.1.1</ip>
<port d:constr="String" d:mi="15">80</port>
<pools d:constr="null"/>
<loadbalancer d:constr="String" d:mi="23">LB1</loadbalancer>
</d:item>
但不是:
<name d:constr="String" d:mi="46">myPool</name>
/帕特里克
答案 0 :(得分:0)
//*[position() <= 1]
将匹配任何父元素的每个第一个子元素。如果您只想匹配<d:item d:mi="12">
和<d:item d:mi="24">
,那么无论您将来添加多少元素添加到父元素,都应该使用
//*[name][position() <= 2]
这些XPath
应该更合适:
//*[name()="d:data"]/*[name][position() <= 2]
//*[name()="d:data"]/*[name()="d:item"][position() <= 2]