2

如果我的 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

我怎样才能得到所有的属性值请解决这个查询。
谢谢。

4

1 回答 1

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::*/@*

一些额外的命令:
我不知道你为什么使用//*[local-name() = "dist_region" and ...]
//dist_region[...]/应该做同样的事情。

输出:

 1 351 test1 1 2 2 4 10066 10070 4909 4902 4905 55 342 86
于 2013-05-15T19:36:38.183 回答