value与xml元素匹配,然后返回所有兄弟属性值。

时间:2013-05-15 13:52:27

标签: javascript xml xpath

我尝试获取xml文件中属性值的所有属性值。

i am try this  xpath:-
var xPath = '//*[local-name() = "dist_region" and ' +
                                        ' contains(concat(@value, ","), "' + array_top[i] + ',")]' + 
                                        '/preceding-sibling::*/@*';

但是它让我回到了节点的顶端 当输入的值匹配时,它返回上面的所有属性值 但我想要所有兄弟属性值 这是我的ml格式: -

<products>
  <product_id value="1">
    <tab_id value="351">
      <tab_name value="test1"/>
      <region_timezone value="1"/>
      <registrationstatus value="2"/>
      <eventstatus value="2"/>
      <dist_activity value="4"/>
      <dist_activity value="10066"/>
      <dist_activity value="10070"/>
      <dist_region value="4909"/>
      <dist_region value="4902"/>
      <dist_region value="4905"/>
      <dist_value value="55"/>
      <dist_value value="342"/>
      <dist_value value="86"/>
   </tab_id>
 </product_id>
<product_id value="2">
    <tab_id value="351">
      <tab_name value="test1"/>
      <region_timezone value="1"/>
      <registrationstatus value="2"/>
      <eventstatus value="2"/>
      <dist_activity value="4"/>
      <dist_activity value="10066"/>
      <dist_activity value="10070"/>
      <dist_region value="4912"/>
      <dist_region value="4908"/>
      <dist_region value="4901"/>
      <dist_value value="55"/>
      <dist_value value="342"/>
      <dist_value value="86"/>
    </tab_id>
  </product_id>
</products>

现在的输出是: -

test1,1,2,2,4,10066,10070

预期产出: -

1,351,test1,1,2,2,4,10066,10070,4909,4902,4905,55,342,86

如何获取所有属性值请解决此查询 感谢。

1 个答案:

答案 0 :(得分:1)

稍微改变你的xapht就行了。
/preceding-sibling::*替换为/ancestor::product_id/descendant-or-self::*

解释你做了什么:

'//*[local-name() = "dist_region" and  contains(concat(@value, ","), "' + array_top[i] + ',")]'

您正在寻找属性值中具有给定值的 dist_region 。这将是例如元素<dist_region value="4909"/> 此元素的下一步是'/preceding-sibling::*/@* 所有元素的所有属性值都是在同一级别的当前元素之前的文档顺序。这导致您看到的输出。

你应该做什么:
由于您的声明预期输出: -
您似乎希望获得当前dist_region所属的product_id的所有属性。因此使用:

ancestor::product_id/descendant-or-self::*/@*

由于: ancestor::product_id在当前元素中找到以上的product_id 。 并且下一步descendant-or-self::*/@*在任何深度的任何孩子中找到任何属性 就是这样。

Somme附加命令:
我不知道你为什么要使用//*[local-name() = "dist_region" and ...]
//dist_region[...]/也应该这样做。

输出:

 1 351 test1 1 2 2 4 10066 10070 4909 4902 4905 55 342 86